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)

Consulte también

WdfRequestSetCompletionRoutine