次の方法で共有


WdfRequestCreateFromIrp 関数 (wdfrequest.h)

[KMDF にのみ適用]

WdfRequestCreateFromIrp メソッドは、指定された WDM IRP からフレームワーク要求オブジェクトを作成します。

構文

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

パラメーター

[in, optional] RequestAttributes

要求オブジェクトのオブジェクト属性を指定する呼び出し元によって割り当てられた WDF_OBJECT_ATTRIBUTES 構造体へのポインター。 このパラメーターは省略可能であり、WDF_NO_OBJECT_ATTRIBUTESできます。

[in] Irp

WDM I/O 要求パケットを含む IRP 構造体へのポインター。

[in] RequestFreesIrp

TRUE 場合、要求ハンドルが破棄されたときにフレームワークが IRP を削除することを示すブール値。 FALSE 場合、ドライバーは、次の例のセクションで示す手順を使用して、IoFreeIrp を呼び出して IRP を削除する必要があります。

[out] Request

フレームワーク要求オブジェクトへのハンドルを受け取る場所へのポインター。

戻り値

WdfRequestCreateFromIrp は、操作が成功した場合にSTATUS_SUCCESSを返します。 その他の戻り値の一覧については、「Framework オブジェクト作成エラーの」を参照してください。

このメソッドは、他の NTSTATUS 値返す場合もあります。

備考

通常、フレームワーク ベースのドライバーは、WDM ディスパッチ ルーチンで WDM IRP を受信し、フレームワーク I/O ターゲットに要求を転送する場合にのみ、WdfRequestCreateFromIrp を呼び出します。

ドライバーが要求オブジェクトを作成するために WdfRequestCreateFromIrp 呼び出す場合は、要求オブジェクト WdfRequestComplete を呼び出してはなりません。 代わりに、ドライバーは要求オブジェクト 使用が完了したときに WdfObjectDelete を呼び出す必要があります。

さらに、ドライバーは、新しい要求オブジェクト WdfRequestRetrieveOutputMemoryWdfRequestRetrieveOutputBufferWdfRequestRetrieveInputBufferまたは WdfRequestRetrieveInputMemory を呼び出してはなりません。

既定では、新しい要求オブジェクトの親は、WdfDriverCreate メソッドが作成したフレームワーク ドライバー オブジェクトです。 WDF_OBJECT_ATTRIBUTES 構造体の ParentObject メンバーを使用して、別の親を指定できます。 フレームワークは、親オブジェクトを削除すると、要求オブジェクトを削除します。 ドライバーが既定の親を変更しない場合、ドライバーは、オブジェクトの使用が完了したときに要求オブジェクトを削除する必要があります。それ以外の場合、要求オブジェクトは、I/O マネージャーがドライバーをアンロードするまで残ります。

フレームワーク要求オブジェクトの作成の詳細については、「フレームワーク要求オブジェクトの作成」を参照してください。

フレームワーク ベースのドライバーは、フレームワークがこのメンバーを使用するため、IRP 構造体の Tail.Overlay.DriverContext メンバーを使用しないでください。

例 1

次のコード例では、指定した WDM IRP からフレームワーク要求オブジェクトを作成し、それを削除します。 次の使用例は、RequestFreesIrp パラメーターを TRUE に設定するため、要求ハンドルが破棄されたときにフレームワークによって IRP が削除されます。

WDFREQUEST request;
PIRP irp;

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

例 2

次のコード例では、指定した WDM IRP からフレームワーク要求オブジェクトを作成し、それを削除します。 次の使用例は、RequestFreesIrp パラメーターを FALSE に設定するため、ドライバーは IRP を削除するために IoFreeIrp 呼び出す必要があります。 この例のすべての関数呼び出しが必要です。

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

必要条件

要件 価値
ターゲット プラットフォーム 万国
最小 KMDF バージョン 1.0
ヘッダー wdfrequest.h (Wdf.h を含む)
ライブラリ Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 する DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

関連項目

IoFreeIrp

WDF_OBJECT_ATTRIBUTES

WdfDeviceInitSetRequestAttributes

WdfDriverCreate

WdfRequestCreate

WdfRequestReuse