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(
¶ms,
WDF_REQUEST_REUSE_NO_FLAGS,
STATUS_SUCCESS
);
WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(
¶ms,
NULL
);
status = WdfRequestReuse(
request,
¶ms
);
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) |