Compartir a través de


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 pasados 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 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 de 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 a cambio de MapTransfer indica cuántos bytes se asignaron. De lo contrario, los valores de entrada y salida de longitud 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 puede usar el controlador de un adaptador de bus-master. Los controladores de dispositivos que usan un controlador DMA del sistema no pueden usar este valor y deben omitirlo.

Observaciones

mapTransfer no es una rutina del sistema a la que se puede llamar directamente por nombre. Esta rutina solo se puede llamar por puntero desde la dirección devuelta en una estructura de DMA_OPERATIONS. Los controladores obtienen la dirección de esta rutina llamando a IoGetDmaAdapter.

El DmaAdapter de 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 el inicial de CurrentVa para el inicio de una transferencia DMA basada en paquetes llamando a MmGetMdlVirtualAddress. Sin embargo, el valor devuelto es un índice en el 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 de bus-master con compatibilidad de dispersión/recopilación puede usar la dirección lógica devuelta y actualizar valor de longitud para crear una lista de dispersión y recopilación, llamando a MapTransfer repetidamente hasta que haya usado todos los registros de mapa disponibles para la operación de transferencia. Sin embargo, este controlador podría usar más simplemente la rutina getScatterGatherList.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Escritorio
encabezado de wdm.h (include 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