次の方法で共有


IoGetDeviceObjectPointer 関数 (wdm.h)

IoGetDeviceObjectPointer ルーチンは、オブジェクトへの要求されたアクセスを許可できる場合、名前付きデバイス オブジェクトのスタック内の最上位オブジェクトへのポインターと、対応するファイル オブジェクトへのポインターを返します。

構文

NTSTATUS IoGetDeviceObjectPointer(
  [in]  PUNICODE_STRING ObjectName,
  [in]  ACCESS_MASK     DesiredAccess,
  [out] PFILE_OBJECT    *FileObject,
  [out] PDEVICE_OBJECT  *DeviceObject
);

パラメーター

[in] ObjectName

デバイス オブジェクトの名前である Unicode 文字列を含むバッファーへのポインター。

[in] DesiredAccess

目的のアクセスを表す ACCESS_MASK 値を指定します。 通常 DesiredAccess はFILE_READ_DATA。 頻繁に、FILE_WRITE_DATAまたはFILE_ALL_ACCESSアクセス権が指定されます。

[out] FileObject

呼び出しが成功した場合、ユーザー モード コードへの対応するデバイス オブジェクトを表すファイル オブジェクトへのポインター。

[out] DeviceObject

呼び出しが成功した場合に、名前付き論理デバイス、仮想デバイス、または物理デバイスを表すデバイス オブジェクトへのポインター。

戻り値

IoGetDeviceObjectPointer 、成功した場合はSTATUS_SUCCESSを返します。 考えられるエラー戻り値には、次の状態コードが含まれます。

STATUS_OBJECT_TYPE_MISMATCH

STATUS_INVALID_PARAMETER

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

STATUS_OBJECT_NAME_INVALID

備考

IoGetDeviceObjectPointer 、呼び出し元と次の下位レベルのドライバーの間に "接続" を確立します。 正常な呼び出し元は、返されたデバイス オブジェクト ポインターを使用して、独自のデバイス オブジェクトを初期化できます。 また、IoAttachDeviceToDeviceStack IoCallDriver、および下位ドライバー用の IRP を作成する任意のルーチンをするための引数として使用することもできます。 返されるポインターは、IoCallDriver するために必要な引数です。

このルーチンは、対応するファイル オブジェクトへのポインターも返します。 アンロード時に、ドライバーは、デバイス オブジェクトを間接的に逆参照する手段としてファイル オブジェクトを逆参照できます。 これを行うために、ドライバーは、ObDereferenceObject を Unload ルーチンから呼び出し、IoGetDeviceObjectPointer によって返されるファイル オブジェクト ポインター渡します。 ドライバーの Unload ルーチンでデバイス オブジェクトを逆参照できないと、次の下位ドライバーがアンロードされなくなります。 ただし、アンロード プロセスの前にファイル オブジェクトを閉じるドライバーは、ファイル オブジェクトを逆参照する前に、デバイス オブジェクトの追加参照を取り出す必要があります。 そうしないと、ファイル オブジェクトを逆参照すると、デバイス オブジェクトが早期に削除される可能性があります。

ファイル システム ドライバー スタックの最上位レベルのドライバーへのポインターを取得するには、ドライバーがファイル システムがマウントされていることを確認する必要があります。そうでない場合、このルーチンはストレージ デバイス スタックを走査します。 ファイル システムがストレージ デバイスに確実にマウントされるようにするには、ドライバーが適切なアクセス マスク (FILE_READ_DATAやFILE_WRITE_ATTRIBUTESなど) を DesiredAccess パラメーターで指定する必要があります。 FILE_READ_ATTRIBUTESを指定しても、ファイル システムはマウントされません。

このルーチンを正常に呼び出すことによって、上位レベルのドライバーが別のドライバーにチェーンされた後、上位レベルのドライバーは、そのデバイス オブジェクト内の StackSize フィールドを、次の下位レベルのドライバーのデバイス オブジェクトと 1 つを設定する必要があります。

IoGetDeviceObjectPointer の呼び出し元は、IRQL = PASSIVE_LEVEL で実行されている必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 する HwStorPortProhibitedDDDIs(storport), IrqlIoPassive5(wdm), PowerIrpDDis(wdm)

関連項目

ACCESS_MASK

DEVICE_OBJECT

IoAllocateIrp

IoAttachDevice

IoAttachDeviceToDeviceStack

IoCallDriver

ObDereferenceObject

ObReferenceObjectByPointer