функция обратного вызова 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. Система передает это значение в подпрограмму AdapterControl драйвера.

[in] CurrentVa

Указатель на текущий виртуальный адрес данных, передаваемых для операции передачи DMA.

[in, out] Length

Указывает длину в байтах для сопоставления. Если драйвер указал, что его устройство является шиной master с поддержкой точечной и сборной при вызове IoGetDmaAdapter, значение Length при возвращении из MapTransfer указывает, сколько байтов было сопоставлено. В противном случае входные и выходные значения Length будут идентичны.

[in] WriteToDevice

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

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

MapTransfer возвращает логический адрес сопоставленной области, который может использовать драйвер адаптера master шины. Драйверы устройств, использующих системный контроллер DMA, не могут использовать это значение и должны его игнорировать.

Комментарии

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

DmaAdapter должен быть уже выделен в результате предыдущего вызова драйвера AllocateAdapterChannel.

Количество регистров карты, которые можно настроить, не может превышать максимальное значение, возвращаемое при вызове драйвера IoGetDmaAdapter.

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

Драйвер устройства master шины с поддержкой точечной и сборной может использовать возвращенный логический адрес и обновленное значение Length для создания списка точечной и сборной, вызывая MapTransfer несколько раз, пока не будет использовано все доступные регистры карты для операции передачи. Однако такой драйвер может более просто использовать подпрограмму GetScatterGatherList .

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включая 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