Función WdfRequestWdmFormatUsingStackLocation (wdfrequest.h)
[Solo se aplica a KMDF]
El método WdfRequestWdmFormatUsingStackLoc ation da formato a una solicitud de E/S copiando el contenido de una ubicación de pila de E/S especificada estructura a 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
Ninguno
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 la 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 solicitudes de E/S de reenvío.
Ejemplos
En el ejemplo de código siguiente se proporciona una estructura de IO_STACK_LOCATION para una solicitud de E/S, se establece un CompletionRoutine función de devolución de llamada 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 de PnP 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 | Valor |
---|---|
de la plataforma de destino de | Universal |
versión mínima de KMDF | 1.0 |
encabezado de | wdfrequest.h (incluya Wdf.h) |
biblioteca de | 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), KmdfIrq, KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf) |