Поделиться через


функция обратного вызова PFLUSH_ADAPTER_BUFFERS (wdm.h)

FlushAdapterBuffers подпрограмма сбрасывает все данные, оставшиеся во внутреннем кэше контроллера DMA системы или во внутреннем кэше адаптера главного автобуса в конце операции передачи DMA.

Синтаксис

PFLUSH_ADAPTER_BUFFERS PflushAdapterBuffers;

BOOLEAN PflushAdapterBuffers(
  [in] PDMA_ADAPTER DmaAdapter,
  [in] PMDL Mdl,
  [in] PVOID MapRegisterBase,
  [in] PVOID CurrentVa,
  [in] ULONG Length,
  [in] BOOLEAN WriteToDevice
)
{...}

Параметры

[in] DmaAdapter

Указатель на структуру DMA_ADAPTER, возвращаемую IoGetDmaAdapter, представляющей адаптер шины или контроллер DMA.

[in] Mdl

Указатель на MDL, описывающий буфер, переданный ранее в вызове драйвера на MapTransfer.

[in] MapRegisterBase

Указывает регистры карты, выделенные для операции DMA. Система передает это значение в подпрограмму Adapter Control драйвера.

[in] CurrentVa

Указатель на текущий виртуальный адрес в буфере, описанный Mdl, где произошла операция ввода-вывода. Это значение должно совпадать со значением начального CurrentVa, переданного MapTransfer.

[in] Length

Указывает длину буфера в байтах.

[in] WriteToDevice

Указывает направление операции передачи DMA: TRUE для передачи из буфера в системной памяти на устройство драйвера.

Возвращаемое значение

FlushAdapterBuffers возвращает TRUE, если все данные, оставшиеся во внутреннем кэше контроллера DMA или шины главного адаптера, успешно удалены в системную память или вне устройства.

Замечания

FlushAdapterBuffers не является системной подпрограммой, которая может вызываться напрямую по имени. Эта подпрограмма вызывается только указателем из адреса, возвращаемого в DMA_OPERATIONS структуре. Драйверы получают адрес этой подпрограммы путем вызова IoGetDmaAdapter.

Чтобы обеспечить завершение передачи DMA, каждый драйвер, выполняющий операции DMA, должен вызывать FlushAdapterBuffers перед завершением IRP, запрашивающего передачу DMA, и перед освобождением регистров карты.

Драйвер может получить начальный CurrentVa для начала передачи DMA на основе пакетов путем вызова MmGetMdlVirtualAddress. Однако возвращаемое значение представляет собой индекс в Mdl, а не допустимый виртуальный адрес. Если драйвер должен разделить большой запрос передачи на несколько операций DMA, он должен обновить CurrentVa и длину для каждой операции DMA.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows 2000.
целевая платформа Настольный
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL <= DISPATCH_LEVEL
правил соответствия DDI irqlDispatch(wdm)

См. также

AllocateAdapterChannel

DMA_ADAPTER

DMA_OPERATIONS

IoGetDmaAdapter

KeFlushIoBuffers

MapTransfer

MmGetMdlVirtualAddress