Función WdfRequestCreateFromIrp (wdfrequest.h)

[Solo se aplica a KMDF]

El método WdfRequestCreateFromIrp crea un objeto de solicitud de marco a partir de un IRP de WDM especificado.

Sintaxis

NTSTATUS WdfRequestCreateFromIrp(
  [in, optional] PWDF_OBJECT_ATTRIBUTES RequestAttributes,
  [in]           PIRP                   Irp,
  [in]           BOOLEAN                RequestFreesIrp,
  [out]          WDFREQUEST             *Request
);

Parámetros

[in, optional] RequestAttributes

Puntero a una estructura de WDF_OBJECT_ATTRIBUTES asignada por el autor de la llamada que especifica los atributos de objeto para el objeto de solicitud. Este parámetro es opcional y puede ser WDF_NO_OBJECT_ATTRIBUTES.

[in] Irp

Puntero a una estructura IRP que contiene un paquete de solicitud de E/S de WDM.

[in] RequestFreesIrp

Valor booleano que, si es TRUE, indica que el marco quita el IRP cuando se destruye el identificador de solicitud. Si es FALSE, el controlador debe llamar a IoFreeIrp para quitar el IRP, siguiendo los pasos que se muestran en la sección Ejemplos siguientes.

[out] Request

Puntero a una ubicación que recibe un identificador de un objeto de solicitud de marco.

Valor devuelto

WdfRequestCreateFromIrp devuelve STATUS_SUCCESS si la operación se realiza correctamente. Para obtener una lista de valores devueltos adicionales, vea Errores de creación de objetos de marco.

Este método también podría devolver otros valores NTSTATUS.

Comentarios

Normalmente, los controladores basados en el marco llaman a WdfRequestCreateFromIrp solo si reciben IRP de WDM en una rutina de distribución de WDM y reenvían las solicitudes a destinos de E/S del marco.

Si un controlador llama a WdfRequestCreateFromIrp para crear un objeto de solicitud, no debe llamar a WdfRequestComplete para el objeto de solicitud. En su lugar, el controlador debe llamar a WdfObjectDelete cuando haya terminado de usar el objeto de solicitud.

Además, el controlador no debe llamar a WdfRequestRetrieveOutputMemory, WdfRequestRetrieveOutputBuffer, WdfRequestRetrieveInputBuffer o WdfRequestRetrieveInputMemory con el nuevo objeto de solicitud.

De forma predeterminada, el nuevo objeto primario del objeto de solicitud es el objeto de controlador de marco que creó el método WdfDriverCreate . Puede usar el miembro ParentObject de la estructura WDF_OBJECT_ATTRIBUTES para especificar otro elemento primario. El marco elimina el objeto de solicitud cuando elimina el objeto primario. Si el controlador no cambia el elemento primario predeterminado, el controlador debe eliminar el objeto de solicitud cuando haya terminado de usar el objeto ; de lo contrario, el objeto de solicitud permanecerá hasta que el administrador de E/S descargue el controlador.

Para obtener más información sobre cómo crear objetos de solicitud de marco, vea Creating Framework Request Objects.

Los controladores basados en marcos no deben usar el miembro Tail.Overlay.DriverContext de la estructura IRP , ya que el marco usa este miembro.

Ejemplos

Ejemplo 1

En el ejemplo de código siguiente se crea un objeto de solicitud de marco a partir de un IRP de WDM especificado y, a continuación, se elimina. En este ejemplo se establece el parámetro RequestFreesIrp en TRUE, por lo que el marco quita el IRP cuando se destruye el identificador de solicitud.

WDFREQUEST request;
PIRP irp;

//Creation
status = WdfRequestCreateFromIrp(
                                 WDF_NO_OBJECT_ATTRIBUTES,
                                 irp,
                                 TRUE,
                                 &request
                                 );
...
//Deletion
WdfObjectDelete(request);

Ejemplo 2

En el ejemplo de código siguiente también se crea un objeto de solicitud de marco a partir de un IRP de WDM especificado y, a continuación, se elimina. En este ejemplo se establece el parámetro RequestFreesIrp en FALSE, por lo que el controlador debe llamar a IoFreeIrp para quitar el IRP. Se requieren todas las llamadas de función en el ejemplo.

WDF_REQUEST_REUSE_PARAMS params;
WDFREQUEST request;
PIRP irp;

//Creation
status = WdfRequestCreateFromIrp(
                                 WDF_NO_OBJECT_ATTRIBUTES,
                                 irp,
                                 FALSE,
                                 &request
                                 );
...
//Deletion
WDF_REQUEST_REUSE_PARAMS_INIT(
                              &params,
                              WDF_REQUEST_REUSE_NO_FLAGS,
                              STATUS_SUCCESS
                              );
WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(
                                     &params,
                                     NULL
                                     );
status = WdfRequestReuse(
                         request,
                         &params
                         );
ASSERT(NT_SUCCESS(status));
IoFreeIrp(irp);
WdfObjectDelete(request);

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Encabezado wdfrequest.h (incluir Wdf.h)
Library Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos).
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Consulte también

IoFreeIrp

WDF_OBJECT_ATTRIBUTES

WdfDeviceInitSetRequestAttributes

WdfDriverCreate

WdfRequestCreate

WdfRequestReuse