Funzione WdfRequestCreateFromIrp (wdfrequest.h)

[Si applica solo a KMDF]

Il metodo WdfRequestCreateFromIrp crea un oggetto richiesta framework da un oggetto WDM IRP specificato.

Sintassi

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

Parametri

[in, optional] RequestAttributes

Puntatore a una struttura di WDF_OBJECT_ATTRIBUTES allocata dal chiamante che specifica gli attributi dell'oggetto richiesta. Questo parametro è facoltativo e può essere WDF_NO_OBJECT_ATTRIBUTES.

[in] Irp

Puntatore a una struttura IRP contenente un pacchetto di richiesta di I/O WDM.

[in] RequestFreesIrp

Valore booleano che, se TRUE, indica che il framework rimuove l'IRP quando l'handle di richiesta viene eliminato. Se FALSE, il driver deve chiamare IoFreeIrp per rimuovere l'IRP , usando la procedura illustrata nella sezione Esempi seguenti.

[out] Request

Puntatore a una posizione che riceve un handle a un oggetto richiesta framework.

Valore restituito

WdfRequestCreateFromIrp restituisce STATUS_SUCCESS se l'operazione ha esito positivo. Per un elenco di valori restituiti aggiuntivi, vedere Errori di creazione di oggetti Framework.

Questo metodo potrebbe restituire anche altri valori NTSTATUS.

Commenti

In genere, i driver basati su framework chiamano WdfRequestCreateFromIrp solo se ricevono IRP WDM in una routine di invio WDM e quindi inoltrano le richieste alle destinazioni di I/O del framework.

Se un driver chiama WdfRequestCreateFromIrp per creare un oggetto request, non deve chiamare WdfRequestComplete per l'oggetto request. Il driver deve invece chiamare WdfObjectDelete al termine dell'uso dell'oggetto request.

Inoltre, il driver non deve chiamare WdfRequestRetrieveOutputMemory, WdfRequestRetrieveOutputBuffer, WdfRequestRetrieveInputBuffer o WdfRequestRetrieveInputMemory con il nuovo oggetto request.

Per impostazione predefinita, il padre del nuovo oggetto request è l'oggetto driver del framework creato dal metodo WdfDriverCreate . È possibile usare il membro ParentObject della struttura WDF_OBJECT_ATTRIBUTES per specificare un elemento padre diverso. Il framework elimina l'oggetto request quando elimina l'oggetto padre. Se il driver non modifica l'elemento padre predefinito, il driver deve eliminare l'oggetto richiesta al termine dell'uso dell'oggetto; in caso contrario, l'oggetto request rimarrà fino a quando il gestore di I/O scarica il driver.

Per altre informazioni sulla creazione di oggetti richiesta framework, vedere Creazione di oggetti richiesta framework.

I driver basati su framework non devono usare il membro Tail.Overlay.DriverContext della struttura IRP , perché il framework usa questo membro.

Esempio

Esempio 1

Nell'esempio di codice seguente viene creato un oggetto richiesta framework da un IRP WDM specificato e quindi lo elimina. In questo esempio viene impostato il parametro RequestFreesIrp su TRUE, quindi il framework rimuove l'IRP quando l'handle di richiesta viene eliminato.

WDFREQUEST request;
PIRP irp;

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

Esempio 2

L'esempio di codice seguente crea anche un oggetto richiesta framework da un'IRP WDM specificata e lo elimina. In questo esempio viene impostato il parametro RequestFreesIrp su FALSE, quindi il driver deve chiamare IoFreeIrp per rimuovere l'IRP . Tutte le chiamate di funzione nell'esempio sono necessarie.

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);

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1,0
Intestazione wdfrequest.h (include Wdf.h)
Libreria Wdf01000.sys (vedere Framework Library Versioning).
IRQL <=DISPATCH_LEVEL
Regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Vedi anche

IoFreeIrp

WDF_OBJECT_ATTRIBUTES

WdfDeviceInitSetRequestAttributes

WdfDriverCreate

WdfRequestCreate

WdfRequestReuse