PBUILD_SCATTER_GATHER_LIST_EX función de devolución de llamada (wdm.h)
La rutina buildScatterGatherListEx de
Cautela
No llame a esta rutina para un dispositivo DMA del sistema.
Sintaxis
PBUILD_SCATTER_GATHER_LIST_EX PbuildScatterGatherListEx;
NTSTATUS PbuildScatterGatherListEx(
[in] PDMA_ADAPTER DmaAdapter,
[in] PDEVICE_OBJECT DeviceObject,
[in] PVOID DmaTransferContext,
[in] PMDL Mdl,
[in] ULONGLONG Offset,
[in] ULONG Length,
[in] ULONG Flags,
[in, optional] PDRIVER_LIST_CONTROL ExecutionRoutine,
[in, optional] PVOID Context,
[in] BOOLEAN WriteToDevice,
[in] PVOID ScatterGatherBuffer,
[in] ULONG ScatterGatherLength,
[in, optional] PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
[in, optional] PVOID CompletionContext,
[out, optional] PVOID ScatterGatherList
)
{...}
Parámetros
[in] DmaAdapter
Puntero a una estructura de DMA_ADAPTER. Esta estructura es el objeto de adaptador que representa el dispositivo DMA maestro de bus del controlador o el canal DMA del sistema. El autor de la llamada obtuvo este puntero de una llamada anterior a la rutina
[in] DeviceObject
Puntero a una estructura DEVICE_OBJECT. Esta estructura es el objeto de dispositivo físico (PDO) que representa el dispositivo de destino para la operación DMA solicitada.
[in] DmaTransferContext
Puntero a un contexto de transferencia de DMA inicializado. Este contexto se inicializó mediante una llamada anterior a la rutina de
[in] Mdl
Puntero a una cadena MDL que describe el diseño de página físico para una colección de búferes bloqueados en memoria virtual. La lista de dispersión y recopilación de la transferencia DMA usará la región de esta memoria especificada por el offset de
[in] Offset
Desplazamiento inicial de la transferencia de dispersión/recopilación de DMA. Este parámetro es un desplazamiento de bytes desde el inicio del búfer en la primera MDL de la cadena MDL. Si las MDL de la cadena MDL especifican un total de N bytes de espacio en búfer, los valores válidos de offset están en el intervalo de 0 a N-1.
[in] Length
Tamaño, en bytes, de la transferencia DMA. Si la cadena MDL especifica un total de N bytes de espacio de búfer, los valores válidos de Longitud están en el intervalo de 1 a N–Offset.
[in] Flags
Marcas de asignación del canal del adaptador. Se admite la marca siguiente:
Bandera | Significado |
---|---|
DMA_SYNCHRONOUS_CALLBACK | La rutina BuildScatterGatherListEx se denomina sincrónicamente. Si se establece esta marca y los recursos DMA necesarios no están disponibles inmediatamente, se produce un error en la llamada y se devuelve STATUS_INSUFFICIENT_RESOURCES. |
Si se establece la marca DMA_SYNCHRONOUS_CALLBACK, el parámetro ExecutionRoutine es opcional y se puede NULL. Si no se establece esta marca,
[in, optional] ExecutionRoutine
Puntero a la rutina de AdapterListControl proporcionada por el controlador que inicia la transferencia DMA para el controlador. El administrador de E/S llama a la rutina de AdapterListControl después de asignar los recursos necesarios para el objeto de adaptador. Después de que se devuelva la rutina AdapterListControl de
Si se establece la marca de DMA_SYNCHRONOUS_CALLBACK, ExecutionRoutine es opcional y se puede null. Si ExecutionRoutine es NULL, el autor de la llamada puede usar los recursos asignados por BuildScatterGatherListEx. Para obtener más información, vea la sección Comentarios.
[in, optional] Context
Contexto de control de adaptador determinado por el controlador. Este contexto se pasa a la rutina adapterListControl de
[in] WriteToDevice
Dirección de la transferencia DMA. Establezca este parámetro en TRUE para una operación de escritura, que transfiere datos de la memoria al dispositivo. Establezca este parámetro en FALSE para una operación de lectura, que transfiere datos del dispositivo a la memoria.
[in] ScatterGatherBuffer
Puntero a un búfer asignado por el autor de la llamada en el que la rutina escribe la lista de dispersión/recopilación para la transferencia DMA. Esta lista comienza con una estructura SCATTER_GATHER_LIST, seguida de una matriz de SCATTER_GATHER_ELEMENT.
[in] ScatterGatherLength
Tamaño, en bytes, del búfer pasado en el parámetro ScatterGatherBuffer. El tamaño del búfer asignado debe ser lo suficientemente grande como para contener la lista de dispersión y recopilación, además de los datos internos que almacena el sistema operativo en este búfer. Para calcular el tamaño de búfer necesario, llame a la rutina de GetDmaTransferInfo o CalculateScatterGatherList.
[in, optional] DmaCompletionRoutine
No se usa. Establezca en null.
[in, optional] CompletionContext
No se usa. Establezca en null.
[out, optional] ScatterGatherList
Puntero a una variable en la que la rutina escribe un puntero a la lista de dispersión y recopilación para la transferencia DMA. Esta lista comienza con una estructura SCATTER_GATHER_LIST, que contiene un puntero a una matriz de SCATTER_GATHER_ELEMENT. Este puntero de salida siempre coincide con el valor del parámetro ScatterGatherBuffer.
Si se establece la marca de
Valor devuelto
buildScatterGatherListEx devuelve STATUS_SUCCESS si la llamada se realiza correctamente. Entre los posibles valores devueltos de error se incluyen los siguientes códigos de estado.
Código devuelto | Descripción |
---|---|
STATUS_INVALID_PARAMETERS | Error en la rutina debido a valores de parámetro no válidos pasados por el autor de la llamada. |
STATUS_BUFFER_TOO_SMALL | El búfer proporcionado por el autor de la llamada en ScatterGatherBuffer es demasiado pequeño para contener la lista de dispersión y recopilación. |
STATUS_INSUFFICIENT_RESOURCES | La rutina no pudo asignar recursos necesarios para la transferencia DMA. |
Observaciones
BuildScatterGatherListEx* no es una rutina del sistema a la que se puede llamar directamente por su nombre. Solo se puede llamar a esta rutina por puntero desde la dirección devuelta en una estructura*DMA_OPERATIONS. Los controladores obtienen la dirección de esta rutina llamando a
Use BuildScatterGatherListEx solo para adaptadores de bus-master. No use esta rutina para un adaptador DMA del sistema.
Por ejemplo, un controlador puede preasignar uno o varios búferes de dispersión o recopilación durante la inicialización del dispositivo. Más adelante, una llamada
De forma predeterminada, buildScatterGatherListEx devuelve de forma asincrónica, sin esperar a que se complete la asignación de recursos solicitada. Después de esta devolución, el autor de la llamada puede, si es necesario, cancelar la solicitud de asignación pendiente llamando a la rutina CancelAdapterChannel.
Si el controlador de llamada establece la marca DMA_SYNCHRONOUS_CALLBACK, la rutina BuildScatterGatherListEx se comporta de la siguiente manera:
Si los recursos solicitados no están disponibles inmediatamente,
buildScatterGatherListEx no espera recursos, no crea una lista de dispersión o recopilación y no llama a la rutina adapterListControl de. En su lugar, error buildScatterGatherListEx y devuelve STATUS_INSUFFICIENT_RESOURCES. El controlador no es necesario para proporcionar una rutina AdapterListControl si se establece la marca DMA_SYNCHRONOUS_CALLBACK.
Si el controlador proporciona una rutina de AdapterListControl, la marca DMA_SYNCHRONOUS_CALLBACK indica que se debe llamar a esta rutina en el contexto del subproceso de llamada, antes de buildScatterGatherListEx.
Si el controlador no proporciona una rutina de AdapterListControl, el controlador puede usar los recursos asignados y la lista de dispersión o recopilación después de BuildScatterGatherListEx. En este caso, el controlador debe proporcionar un puntero
NULL válido ScatterGatherList. Además, una vez completada la transferencia DMA iniciada por el controlador, el controlador debe llamar a la rutina FreeAdapterObject para liberar los recursos que BuildScatterGatherListEx asignados para el objeto de adaptador.
BuildScatterGatherListEx es una versión extendida de la rutina de BuildScatterGatherList. En la lista siguiente se resumen las características que solo están disponibles en la versión extendida:
Característica | Descripción |
---|---|
Desplazamiento inicial | El controlador de llamada puede especificar un desplazamiento inicial para una transferencia DMA de dispersión o recopilación en lugar de iniciar la transferencia en la primera dirección del búfer al principio de la cadena MDL. |
Cancelación de solicitudes de asignación | El controlador puede llamar a CancelAdapterChannel para cancelar una solicitud de asignación pendiente cuando el adaptador DMA está en cola para esperar a recursos DMA. |
Devolución de llamada sincrónica | El controlador puede establecer la marca de |
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Disponible a partir de Windows 8. |
de la plataforma de destino de |
Escritorio |
encabezado de |
wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
irQL | DISPATCH_LEVEL |