PMAP_TRANSFER función de devolución de llamada (wdm.h)

La rutina MapTransfer configura los registros de mapa de un objeto de adaptador para asignar una transferencia DMA desde un búfer bloqueado.

Sintaxis

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
)
{...}

Parámetros

[in] DmaAdapter

Puntero al objeto del adaptador DMA devuelto por IoGetDmaAdapter y pasado previamente a AllocateAdapterChannel para la solicitud de transferencia del IRP actual.

[in] Mdl

Puntero a uno de los siguientes: MDL que describe el búfer en MdlAddress en el IRP actual o el MDL que describe el búfer común configurado por el controlador de un dispositivo subordinado (modo de inicialización automática).

[in] MapRegisterBase

Especifica los registros de asignación asignados para la operación DMA. El sistema pasa este valor a la rutina AdapterControl del controlador.

[in] CurrentVa

Puntero a la dirección virtual actual de los datos que se van a transferir para una operación de transferencia de DMA.

[in, out] Length

Especifica la longitud, en bytes, que se va a asignar. Si el controlador indicó que su dispositivo era un patrón de bus con compatibilidad de dispersión/recopilación cuando llamó a IoGetDmaAdapter, el valor de Length en la devolución de MapTransfer indica cuántos bytes se asignaron. De lo contrario, los valores de entrada y salida de Length son idénticos.

[in] WriteToDevice

Indica la dirección de la operación de transferencia: TRUE para una transferencia desde el búfer bloqueado al dispositivo.

Valor devuelto

MapTransfer devuelve la dirección lógica de la región asignada, que el controlador de un adaptador bus-master puede usar. Los controladores de dispositivos que usan un controlador DMA del sistema no pueden usar este valor y deben omitirlo.

Comentarios

MapTransfer no es una rutina del sistema a la que se puede llamar directamente por nombre. Esta rutina solo es invocable por puntero de la dirección devuelta en una estructurade DMA_OPERATIONS. Los controladores obtienen la dirección de esta rutina mediante una llamada a IoGetDmaAdapter.

El DmaAdapter ya debe haberse asignado como resultado de la llamada anterior del controlador a AllocateAdapterChannel.

El número de registros de mapa que se pueden configurar no puede superar el máximo devuelto cuando el controlador llamado IoGetDmaAdapter.

Un controlador puede obtener la currentVa inicial para el inicio de una transferencia DMA basada en paquetes mediante una llamada a MmGetMdlVirtualAddress. Sin embargo, el valor devuelto es un índice en mdl, en lugar de una dirección virtual válida. Si el controlador debe dividir una solicitud de transferencia grande en más de una operación DMA, debe actualizar CurrentVa y Length para cada operación DMA.

El controlador de un dispositivo bus-master con compatibilidad de dispersión/recopilación puede usar la dirección lógica devuelta y el valor length actualizado para crear una lista de dispersión y recopilación, llamando repetidamente a MapTransfer hasta que haya usado todos los registros de mapa disponibles para la operación de transferencia. Sin embargo, un controlador de este tipo podría simplemente usar la rutina GetScatterGatherList .

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Escritorio
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
IRQL <= DISPATCH_LEVEL
Reglas de cumplimiento de DDI IrqlDispatch(wdm)

Consulte también

ADDRESS_AND_SIZE_TO_SPAN_PAGES

AllocateAdapterChannel

AllocateCommonBuffer

DMA_ADAPTER

FlushAdapterBuffers

FreeAdapterChannel

FreeMapRegisters

IoGetDmaAdapter

KeFlushIoBuffers

MmGetMdlVirtualAddress