Compartir a través de


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)

Consulte también

WdfRequestSetCompletionRoutine