функция обратного вызова PMAP_TRANSFER (wdm.h)
Подпрограмма mapTransfer настраивает регистры карты для объекта адаптера для сопоставления передачи DMA из заблокированного буфера.
Синтаксис
PMAP_TRANSFER PmapTransfer;
PHYSICAL_ADDRESS PmapTransfer(
[in] PDMA_ADAPTER DmaAdapter,
[in] PMDL Mdl,
[in] PVOID MapRegisterBase,
[in] PVOID CurrentVa,
[in, out] PULONG Length,
[in] BOOLEAN WriteToDevice
)
{...}
Параметры
[in] DmaAdapter
Указатель на объект адаптера DMA, возвращаемый IoGetDmaAdapter и ранее переданный в AllocateAdapterChannel для текущего запроса на передачу IRP.
[in] Mdl
Указатель на один из следующих элементов: MDL, описывающий буфер в MdlAddress в текущем IRP или MDL, описывающий общий буфер, настроенный драйвером подчиненного устройства (режим автоматической инициализации).
[in] MapRegisterBase
Указывает регистры карты, выделенные для операции DMA. Система передает это значение в подпрограмму Adapter Control драйвера.
[in] CurrentVa
Указатель на текущий виртуальный адрес передаваемых данных для операции передачи DMA.
[in, out] Length
Указывает длину в байтах для сопоставлений. Если драйвер указал, что его устройство было главной шиной с поддержкой точечной или сборной, когда оно вызывало IoGetDmaAdapter, значение length при возврате из MapTransfer указывает, сколько байтов было сопоставлено. В противном случае входные и выходные значения длины идентичны.
[in] WriteToDevice
Указывает направление операции передачи: TRUE для передачи из заблокированного буфера на устройство.
Возвращаемое значение
MapTransfer возвращает логический адрес сопоставленного региона, который может использовать драйвер адаптера шины. Драйверы устройств, использующих системный контроллер DMA, не могут использовать это значение и должны игнорировать его.
Замечания
MapTransfer не является системной подпрограммой, которую можно вызывать напрямую по имени. Эта подпрограмма вызывается только указателем из адреса, возвращаемого в DMA_OPERATIONS структуре. Драйверы получают адрес этой подпрограммы путем вызова IoGetDmaAdapter.
DmaAdapter уже должны быть выделены в результате предыдущего вызова драйвера AllocateAdapterChannel.
Число регистров карты, которые можно настроить, не может превышать максимальное значение, возвращаемое при вызове драйвера IoGetDmaAdapter.
Драйвер может получить начальный CurrentVa для начала передачи DMA на основе пакетов путем вызова MmGetMdlVirtualAddress. Однако возвращаемое значение представляет собой индекс в Mdl, а не допустимый виртуальный адрес. Если драйвер должен разделить большой запрос передачи на несколько операций DMA, он должен обновить CurrentVa и длину для каждой операции DMA.
Драйвер главного устройства шины с поддержкой точечной и сборной может использовать возвращенный логический адрес и обновленный длину значение для создания списка точечных и сборных данных, вызывая MapTransfer, пока не будет использоваться все доступные регистры карт для операции передачи. Однако такой драйвер может более просто использовать подпрограмму GetScatterGatherList.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 2000. |
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | <= DISPATCH_LEVEL |
правил соответствия DDI | irqlDispatch(wdm) |