Función WdfRequestWdmFormatUsingStackLocation (wdfrequest.h)
[Solo se aplica a KMDF]
El método WdfRequestWdmFormatUsingStackLocation da formato a una solicitud de E/S copiando el contenido de una estructura de ubicación de pila de E/S de WDM especificada en la siguiente ubicación de pila de la solicitud.
Sintaxis
void WdfRequestWdmFormatUsingStackLocation(
[in] WDFREQUEST Request,
[in] PIO_STACK_LOCATION Stack
);
Parámetros
[in] Request
Identificador de un objeto de solicitud de marco.
[in] Stack
Puntero a una estructura de IO_STACK_LOCATION que contiene información proporcionada por el controlador.
Valor devuelto
None
Observaciones
Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.
El método WdfRequestWdmFormatUsingStackLocation copia la información proporcionada por el parámetro Stack en la siguiente ubicación de pila irP de la solicitud.
WdfRequestWdmFormatUsingStackLocation da formato a la solicitud independientemente de si el objeto de destino de E/S de la solicitud es local o remoto.
Si desea establecer una rutina de finalización para la solicitud, el controlador debe llamar a WdfRequestSetCompletionRoutine después de llamar a WdfRequestWdmFormatUsingStackLocation.
Para obtener más información sobre WdfRequestWdmFormatUsingStackLocation, vea Reenvío de solicitudes de E/S.
Ejemplos
En el ejemplo de código siguiente se proporciona una estructura de IO_STACK_LOCATION para una solicitud de E/S, se establece una función de devolución de llamada CompletionRoutine y, a continuación, se envía la solicitud a un destino de E/S.
IO_STACK_LOCATION ioStackLocation;
BOOLEAN sendStatus;
...
//
// Initialize the IO_STACK_LOCATION structure here.
//
...
//
// Assign the IO_STACK_LOCATION structure to the request.
//
WdfRequestWdmFormatUsingStackLocation(
request,
&ioStackLocation
);
//
// Assign a CompletionRoutine callback function.
//
WdfRequestSetCompletionRoutine(
Request,
RequestTimeoutComplete,
NULL
);
//
// Send the request.
//
sendStatus = WdfRequestSend(
Request,
target,
NULL
);
En el ejemplo de código siguiente se muestra cómo enviar una IRP_MN_QUERY_CAPABILITIES IRP a un destino de E/S.
target = WdfDeviceGetIoTarget(Device);
status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES,
target,
&request);
if (!NT_SUCCESS(status)) {
// Log failure and leave
}
//
// PnP IRPs must be initialized with STATUS_NOT_SUPPORTED
//
WDF_REQUEST_REUSE_PARAMS_INIT(&reuse,
WDF_REQUEST_REUSE_NO_FLAGS,
STATUS_NOT_SUPPORTED);
WdfRequestReuse(request, &reuse);
//
// Initialize device capabilities
//
RtlZeroMemory(Capabilities, sizeof(DEVICE_CAPABILITIES));
Capabilities->Size = sizeof(DEVICE_CAPABILITIES);
Capabilities->Version = 1;
Capabilities->Address = (ULONG) -1;
Capabilities->UINumber = (ULONG) -1;
RtlZeroMemory(&stack, sizeof(stack));
stack.MajorFunction = IRP_MJ_PNP;
stack.MinorFunction = IRP_MN_QUERY_CAPABILITIES;
stack.Parameters.DeviceCapabilities.Capabilities = Capabilities;
WdfRequestWdmFormatUsingStackLocation(request, &stack);
WDF_REQUEST_SEND_OPTIONS_INIT(&options,
WDF_REQUEST_SEND_OPTION_SYNCHRONOUS);
if (WdfRequestSend(request, target, &options) == FALSE) {
// Log failure
}
status = WdfRequestGetStatus(request);
if (!NT_SUCCESS(status)) {
// Log failure
}
// Remember to delete the WDFREQUEST after creating it
if (request != NULL) {
WdfObjectDelete(request);
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.0 |
Encabezado | wdfrequest.h (incluya Wdf.h) |
Library | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
IRQL | <=DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf) |