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
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

ExAllocatePool2

ExAllocatePool3

IoGetAttachedDevice

IoGetAttachedDeviceReference

IoGetLowerDeviceObject

ObDereferenceObject

ZwUnloadDriver