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 se puede WDF_NO_OBJECT_ATTRIBUTES.
[in] Irp
Puntero a una estructura de IRP que contiene un paquete de solicitud de E/S de WDM.
[in] RequestFreesIrp
Valor booleano que, si TRUE, indica que el marco quita el IRP cuando se destruye el identificador de solicitud. Si 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 puede devolver otros valores de NTSTATUS.
Observaciones
Normalmente, los controladores basados en marcos 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 WdfDriverCreate método. Puede usar el miembro parentObject de de la estructura WDF_OBJECT_ATTRIBUTES para especificar un elemento primario diferente. 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 del IRP estructura, 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 | 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), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |