次の方法で共有


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

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

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

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

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

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlIoPassive5(wdm), PowerIrpDDis(wdm)

こちらもご覧ください

ACCESS_MASK

DEVICE_OBJECT

IoAllocateIrp

IoAttachDevice

IoAttachDeviceToDeviceStack

IoCallDriver

ObDereferenceObject

ObReferenceObjectByPointer