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


функция обратного вызова 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)

См. также

ADDRESS_AND_SIZE_TO_SPAN_PAGES

AllocateAdapterChannel

AllocateCommonBuffer

DMA_ADAPTER

FlushAdapterBuffers

FreeAdapterChannel

FreeMapRegisters

IoGetDmaAdapter

KeFlushIoBuffers

MmGetMdlVirtualAddress