Función WdfRequestRetrieveInputBuffer (wdfrequest.h)
[Se aplica a KMDF y UMDF]
El método WdfRequestRetrieveInputBuffer recupera el búfer de entrada de una solicitud de E/S.
Sintaxis
NTSTATUS WdfRequestRetrieveInputBuffer(
[in] WDFREQUEST Request,
size_t MinimumRequiredLength,
[out] PVOID *Buffer,
[out, optional] size_t *Length
);
Parámetros
[in] Request
Identificador de un objeto de solicitud de marco.
MinimumRequiredLength
Tamaño mínimo del búfer, en bytes, que el controlador necesita para procesar la solicitud de E/S.
[out] Buffer
Puntero a una ubicación que recibe la dirección del búfer.
[out, optional] Length
Puntero a una ubicación que recibe el tamaño del búfer, en bytes. Este parámetro es opcional y puede ser NULL.
Valor devuelto
WdfRequestRetrieveInputBuffer devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, este método podría devolver uno de los siguientes valores:
Código devuelto | Descripción |
---|---|
|
Un parámetro de entrada no es válido. |
|
La longitud del búfer de entrada es cero o el parámetro MinimumRequiredSize especifica un tamaño de búfer mayor que el tamaño real del búfer. |
|
El tipo de solicitud no es válido o la solicitud no usa ni E/S almacenada en búfer ni directa. Para obtener más información sobre los métodos admitidos para acceder a los búferes de datos, consulte la sección Comentarios siguientes. |
|
La solicitud ya se ha completado. |
|
No hay memoria suficiente. |
Este método también podría devolver otros valores NTSTATUS.
Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.
Comentarios
El búfer de entrada de una solicitud contiene información, como los datos que se van a escribir en un disco, proporcionados por el autor de la solicitud. El controlador puede llamar a WdfRequestRetrieveInputBuffer para obtener el búfer de entrada para una solicitud de escritura o una solicitud de control de E/S de dispositivo, pero no para una solicitud de lectura (porque las solicitudes de lectura no proporcionan datos de entrada).
El método WdfRequestRetrieveInputBuffer recupera el búfer de entrada para las solicitudes de E/S que usan el método de E/ S almacenado en búfer o el método de E/S directa para acceder a los búferes de datos. Si el código de control de E/S de la solicitud es IRP_MJ_INTERNAL_DEVICE_CONTROL, o si la solicitud procede de otro controlador en modo kernel, WdfRequestRetrieveInputBuffer también admite solicitudes de E/S que no usan búfer ni E/S directa.
Si WdfRequestRetrieveInputBuffer devuelve STATUS_SUCCESS, el controlador recibe la dirección y, opcionalmente, el tamaño del búfer de entrada.
El controlador puede acceder al búfer recuperado hasta que complete la solicitud de E/S que representa el parámetro Request .
En lugar de llamar a WdfRequestRetrieveInputBuffer, el controlador puede llamar a WdfRequestRetrieveInputMemory, que crea un objeto de memoria de marco que representa el búfer.
Para obtener más información sobre WdfRequestRetrieveInputBuffer, consulte Acceso a búferes de datos en controladores de Framework-Based.
Ejemplos
El siguiente ejemplo de código forma parte de la función de devolución de llamada EvtIoDeviceControl del controlador de ejemplo serie. Si el código de control de E/S está IOCTL_SERIAL_SET_TIMEOUT, el controlador obtiene nuevos valores de tiempo de espera del búfer de entrada de la solicitud de E/S.
VOID
SerialEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
PVOID buffer;
size_t bufSize;
switch (IoControlCode) {
...
case IOCTL_SERIAL_SET_TIMEOUTS: {
PSERIAL_TIMEOUTS NewTimeouts;
Status = WdfRequestRetrieveInputBuffer(
Request,
sizeof(SERIAL_TIMEOUTS),
&buffer,
&bufSize
);
if (!NT_SUCCESS(Status)) {
break;
}
NewTimeouts =(PSERIAL_TIMEOUTS)buffer;
}
...
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.0 |
Versión mínima de UMDF | 2.0 |
Encabezado | wdfrequest.h (incluir Wdf.h) |
Library | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |