次の方法で共有


IoEnumerateDeviceObjectList 関数 (ntifs.h)

IoEnumerateDeviceObjectList ルーチンは、ドライバーのデバイス オブジェクトの一覧を列挙します。

構文

NTSTATUS IoEnumerateDeviceObjectList(
  [in]  PDRIVER_OBJECT DriverObject,
  [out] PDEVICE_OBJECT *DeviceObjectList,
  [in]  ULONG          DeviceObjectListSize,
  [out] PULONG         ActualNumberDeviceObjects
);

パラメーター

[in] DriverObject

ドライバーのドライバー オブジェクトへのポインター。

[out] DeviceObjectList

デバイス オブジェクト ポインターを受け取る呼び出し元によって割り当てられた配列へのポインター。 この配列は、非ページ プールから割り当てる必要があります。 このパラメーターには NULL を指定できます。 「解説」を参照してください。

[in] DeviceObjectListSize

DeviceObjectList 配列のサイズ (バイト単位)。 このパラメーターには 0 を指定できます。 「解説」を参照してください。

[out] ActualNumberDeviceObjects

ドライバー オブジェクトのデバイス オブジェクトの一覧で見つかったデバイス オブジェクトの実際の数。 DeviceObjectList の配列が小さすぎる場合、配列にコピーされるデバイス オブジェクト ポインターの数は、ActualNumberDeviceObjects 未満になることに注意してください。

戻り値

IoEnumerateDeviceObjectList は、次のいずれかの値のような NTSTATUS コードを返します。

リターン コード 形容
STATUS_SUCCESS IoEnumerateDeviceObjectList の呼び出し 正常に完了しました。
STATUS_BUFFER_TOO_SMALL DeviceObjectList 配列が小さすぎて、デバイス オブジェクト リスト全体を保持できません。 この場合、IoEnumerateDeviceObjectList は、可能な限り多くのデバイス オブジェクト ポインターを配列にコピーします。

備考

ファイル システム フィルター ドライバーは、IoEnumerateDeviceObjectList を呼び出して列挙します。

  • 作成したデバイス オブジェクト。 これは通常、ドライバーがアンロードの準備をしているときに行われます。 実行中のシステムからフィルター ドライバーを安全にアンロードできないことに注意してください。 詳細については、ZwUnloadDriverを参照してください。

  • 基本ファイル システムによって作成されたデバイス オブジェクト。フィルターは、アタッチできるボリュームの数を認識します。

IoEnumerateDeviceObjectList は、フィルター ドライバーによって作成されたすべてのデバイス オブジェクトを返します。 これには、制御デバイス オブジェクト (CTO) とボリューム デバイス オブジェクト (VTO) が含まれます。 2 種類のデバイス オブジェクトは、慣例により、CTO が名前付けされ、VTO が指定されていないという事実によって区別できます。

後者の場合、フィルター ドライバーは通常、IoEnumerateDeviceObjectList を 2 回呼び出します。1 回はリスト内のデバイス オブジェクトの数を取得し、1 回はデバイス オブジェクト リスト自体を取得します。 最初の呼び出しでは、呼び出し元は、DeviceObjectList パラメーターを NULL に設定し、DeviceObjectListSize を 0 に する必要があります。 2 番目の呼び出しでは、DeviceObjectList には適切なサイズのポインター配列へのポインターが含まれている必要があり、DeviceObjectListSize には、その配列のサイズ (バイト単位) が含まれている必要があります。

IoEnumerateDeviceObjectList 、DeviceObjectList によって指されるリスト内のすべてのデバイス オブジェクト参照カウントをインクリメントします。 したがって、IoEnumerateDeviceObjectList への正常な呼び出しはすべて、一覧内の各デバイス オブジェクトに対する ObDereferenceObject への後続の呼び出しと一致する必要があります。 これを行わないと、参照カウントが未処理であるため、システムがこれらのデバイス オブジェクトを解放または削除できなくなります。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 SP4 更新プログラムのロールアップ。Windows XP
ターゲット プラットフォーム 万国
ヘッダー ntifs.h (Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

関連項目

ExAllocatePool2

ExAllocatePool3

IoGetAttachedDevice

IoGetAttachedDeviceReference

IoGetLowerDeviceObject

ObDereferenceObject

ZwUnloadDriver