Partager via


WdfRequestCreateFromIrp, fonction (wdfrequest.h)

[S’applique uniquement à KMDF]

La méthode WdfRequestCreateFromIrp crée un objet de requête d’infrastructure à partir d’un IRP WDM spécifié.

Syntaxe

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

Paramètres

[in, optional] RequestAttributes

Pointeur vers une structure WDF_OBJECT_ATTRIBUTES allouée par l’appelant qui spécifie les attributs d’objet pour l’objet de requête. Ce paramètre est facultatif et peut être WDF_NO_OBJECT_ATTRIBUTES.

[in] Irp

Pointeur vers une structure IRP qui contient un paquet de requête d’E/S WDM.

[in] RequestFreesIrp

Valeur booléenne qui, si TRUE, indique que l’infrastructure supprime l’IRP lorsque le handle de requête est détruit. Si FAUX, le pilote doit appeler IoFreeIrp pour supprimer le protocole IRP, en suivant les étapes décrites dans la section Exemples suivants.

[out] Request

Pointeur vers un emplacement qui reçoit un handle vers un objet de requête framework.

Valeur de retour

WdfRequestCreateFromIrp retourne STATUS_SUCCESS si l’opération réussit. Pour obtenir la liste des valeurs de retour supplémentaires, consultez Erreurs de création d’objets Framework.

Cette méthode peut également retourner d’autres valeurs NTSTATUS .

Remarques

En règle générale, les pilotes basés sur l’infrastructure appellent WdfRequestCreateFromIrp uniquement s’ils reçoivent des ADRESSES IP WDM dans une routine de distribution WDM, puis transfèrent les requêtes aux cibles d’E/S de l’infrastructure.

Si un pilote appelle WdfRequestCreateFromIrp pour créer un objet de requête, il ne doit pas appeler WdfRequestComplete pour l’objet de requête. Au lieu de cela, le pilote doit appeler WdfObjectDelete lorsqu’il a terminé d’utiliser l’objet de requête.

En outre, le pilote ne doit pas appeler WdfRequestRetrieveOutputMemory, WdfRequestRetrieveOutputBuffer, WdfRequestRetrieveInputBuffer, ou WdfRequestRetrieveInputMemory avec le nouvel objet de requête.

Par défaut, le parent de l’objet de nouvelle requête est l’objet de pilote d’infrastructure créé par la méthode WdfDriverCreate créée. Vous pouvez utiliser le membre ParentObject de la structure WDF_OBJECT_ATTRIBUTES pour spécifier un parent différent. L’infrastructure supprime l’objet de requête lorsqu’il supprime l’objet parent. Si votre pilote ne modifie pas le parent par défaut, le pilote doit supprimer l’objet de requête une fois l’objet terminé à l’aide de l’objet ; sinon, l’objet de requête reste jusqu’à ce que le gestionnaire d’E/S décharge votre pilote.

Pour plus d’informations sur la création d’objets de requête de framework, consultez Création d’objets de requête framework.

Les pilotes basés sur l’infrastructure ne doivent pas utiliser le membre Tail.Overlay.DriverContext de la structure IRP, car le framework utilise ce membre.

Exemples

Exemple 1

L’exemple de code suivant crée un objet de requête de framework à partir d’un IRP WDM spécifié, puis le supprime. Cet exemple montre comment définir le paramètre RequestFreesIrp sur TRUE. Par conséquent, l’infrastructure supprime l’IRP lorsque le handle de requête est détruit.

WDFREQUEST request;
PIRP irp;

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

exemple 2

L’exemple de code suivant crée également un objet de requête de framework à partir d’un IRP WDM spécifié, puis le supprime. Cet exemple montre comment définir le paramètre RequestFreesIrp sur faux. Le pilote doit donc appeler IoFreeIrp pour supprimer le protocole IRP. Tous les appels de fonction dans l’exemple sont requis.

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

Exigences

Exigence Valeur
plateforme cible Universel
version minimale de KMDF 1.0
d’en-tête wdfrequest.h (include Wdf.h)
bibliothèque Wdf01000.sys (voir Versioning de la bibliothèque Framework.)
IRQL <=DISPATCH_LEVEL
règles de conformité DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Voir aussi

IoFreeIrp

WDF_OBJECT_ATTRIBUTES

WdfDeviceInitSetRequestAttributes

WdfDriverCreate

WdfRequestCreate

WdfRequestReuse