Windows カーネルの不透明な構造体
この記事では、Windows カーネルの不透明な構造の一覧を示し、説明します。 これらの構造体の多くでは、ドライバーはメンバーにアクセスしたり変更したりしてはなりません。代わりにシステム提供のルーチンを使用して情報にアクセスしてください。 詳細については、各構造体を参照してください。
EPROCESS
EPROCESS 構造体は、プロセスのプロセス オブジェクトとして機能する不透明な構造体です。
PsGetProcessCreateTimeQuadPart などの一部のルーチンでは、EPROCESS を使用して操作するプロセスを識別します。 ドライバーは、PsGetCurrentProcess ルーチンを使用して、現在のプロセスのプロセス オブジェクトへのポインターを取得し、ObReferenceObjectByHandle ルーチンを使用して、指定したハンドルに関連付けられているプロセス オブジェクトへのポインターを取得できます。 PsInitialSystemProcess グローバル変数は、システム プロセスのプロセス オブジェクトを指します。
プロセス オブジェクトは、オブジェクト マネージャー オブジェクトです。 ドライバーは、オブジェクトの参照カウントを維持するために、ObReferenceObject や ObDereferenceObject などのオブジェクト マネージャー ルーチンを使用する必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
ETHREAD
ETHREAD 構造体は、スレッドのスレッド オブジェクトとして機能する不透明な構造体です。
PsIsSystemThread などの一部のルーチンでは、ETHREAD を使用して操作するスレッドを識別します。 ドライバーは、PsGetCurrentThread ルーチンを使用して現在のスレッドのスレッド オブジェクトへのポインターを取得し、ObReferenceObjectByHandle ルーチンを使用して、指定したハンドルに関連付けられているスレッド オブジェクトへのポインターを取得できます。
スレッド オブジェクトは、オブジェクト マネージャー オブジェクトです。 ドライバーは、オブジェクトの参照カウントを維持するために、ObReferenceObject や ObDereferenceObject などのオブジェクト マネージャー ルーチンを使用する必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
EX_RUNDOWN_REF
EX_RUNDOWN_REF 構造体は、関連付けられた共有オブジェクトのランダウン保護の状態に関する情報が格納された不透明なシステム構造体です。
typedef struct _EX_RUNDOWN_REF {
... // opaque
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
このページの下部に示されているランダウン保護ルーチンはすべて、最初のパラメーターとして EX_RUNDOWN_REF 構造体へのポインターを受け取ります。
詳細については、「ランダウン防止 」を参照してください。 ヘッダー: Wdm.h。 Include: Wdm.h。
EX_TIMER
EX_TIMER 構造体は、オペレーティング システムが EX_TIMER タイマー オブジェクトを表すために使用する不透明な構造体です。
typedef struct _EX_TIMER *PEX_TIMER;
この構造体のすべてのメンバーは、ドライバーに対して不透明です。
次の ExXxxTimer ルーチンでは、入力パラメーターとしてシステム割り当て EX_TIMER 構造体へのポインターが必要です。
オペレーティング システムは、EX_TIMER ベースのタイマー オブジェクトを作成します。 このようなタイマー オブジェクトを取得するために、ドライバーは ExAllocateTimer ルーチンを呼び出します。 このオブジェクトが不要になった場合、ドライバーは ExDeleteTimer を呼び出してオブジェクトを削除する必要があります。
詳細については、「 ExXxxTimer ルーチンと EX_TIMER オブジェクト」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
FAST_MUTEX
FAST_MUTEX 構造体は、高速ミューテックスを表す不透明なデータ構造です。 ExInitializeFastMutex ルーチンは、この構造体を初期化します。
高速ミューテックスの詳細については、「高速ミューテックスと保護されたミューテックス」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
IO_CSQ
IO_CSQ構造体は、ドライバーのキャンセル セーフ IRP キュー ルーチンを指定するために使用される不透明な構造体です。 この構造体のメンバーを直接設定しないでください。 この構造体を初期化するには、IoCsqInitialize または IoCsqInitializeEx を使用します。
キャンセル セーフな IRP キューを使用する方法の概要については、「キャンセル セーフの IRP キュー」を参照してください。
Microsoft Windows XP 以降のバージョンの Windows オペレーティング システムで使用できます。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
IO_CSQ_IRP_CONTEXT
IO_CSQ_IRP_CONTEXT構造体は、ドライバーのキャンセル セーフ IRP キュー内の IRP の IRP コンテキストを指定するために使用される不透明なデータ構造です。 IoCsqInsertIrp、IoCsqInsertIrpEx、 IoCsqRemoveIrp ルーチンでは、この構造体をキーとして使用して、キュー内の特定の IRP を識別します。
キャンセル セーフな IRP キューを使用する方法の概要については、「キャンセル セーフの IRP キュー」を参照してください。
Microsoft Windows XP 以降のバージョンの Windows オペレーティング システムで使用できます。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
IO_WORKITEM
IO_WORKITEM構造体は、システム ワーカー スレッドの作業項目を記述する不透明な構造体です。
ドライバーは、IoAllocateWorkItem を呼び出すことによって作業項目を割り当てることができます。 または、ドライバーは独自のバッファーを割り当ててから IoInitializeWorkItem を呼び出して、そのバッファーを作業項目として初期化することもできます。
IoAllocateWorkItem によって割り当てられる作業項目は、IoFreeWorkItem によって解放する必要があります。 IoInitializeWorkItem によって初期化されたメモリは、解放する前に IoUninitializeWorkItem によって初期化を解除する必要があります。
作業項目の詳細については、「システム ワーカー スレッド」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KBUGCHECK_CALLBACK_RECORD
KBUGCHECK_CALLBACK_RECORD 構造体は、KeRegisterBugCheckCallback ルーチンと KeDeregisterBugCheckCallback ルーチンが使用する不透明な構造体です。
KBUGCHECK_CALLBACK_RECORD 構造体は、ブックキーピング用の KeRegisterBugCheckReasonCallback ルーチンと KeDeregisterBugCheckReasonCallback ルーチンによって使用されます。
構造体は、非ページ プールなどの常駐メモリに割り当てる必要があります。 構造体を使用する前 に、KeInitializeCallbackRecord ルーチンを使用して構造体を初期化します。
ヘッダー: Ntddk.h。 インクルード: Ntddk.h。
KBUGCHECK_REASON_CALLBACK_RECORD
KBUGCHECK_REASON_CALLBACK_RECORD 構造体は、KeRegisterBugCheckReasonCallback ルーチンと KeDeregisterBugCheckReasonCallback ルーチンが使用する不透明な構造体です。
KBUGCHECK_REASON_CALLBACK_RECORD 構造体は、ブックキーピング用の KeRegisterBugCheckReasonCallback ルーチンと KeDeregisterBugCheckReasonCallback ルーチンによって使用されます。
構造体は、非ページ プールなどの常駐メモリに割り当てる必要があります。 構造体を使用する前 に、KeInitializeCallbackRecord ルーチンを使用して構造体を初期化します。
Microsoft Windows XP Service Pack 1 (SP1)、Windows Server 2003、およびそれ以降のバージョンのWindowsオペレーティング システムで使用できます。
ヘッダー: Ntddk.h。 インクルード: Ntddk.h。
KDPC
KDPC 構造体は、DPC オブジェクトを表す不透明な構造体です。 この構造体のメンバーを直接設定しないでください。 DPC オブジェクトと DPC を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KFLOATING_SAVE
KFLOATING_SAVE構造体は、KeSaveFloatingPointState ルーチンが保存した浮動小数点状態を記述する不透明な構造体です。
KeRestoreFloatingPointState を使用して浮動小数点状態を復元します。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KGUARDED_MUTEX
KGUARDED_MUTEX構造体は、保護されたミューテックスを表す不透明な構造体です。
KeInitializeGuardedMutex を使用して、保護されたミューテックスとして KGUARDED_MUTEX 構造体を初期化します。
保護されたミューテックスは、非ページ プールから割り当てる必要があります。
保護されたミューテックスの詳細については、「高速ミューテックスと保護されたミューテックス」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KINTERRUPT
KINTERRUPT 構造体は、システムへの割り込みを表す不透明な構造体です。
IoConnectInterruptEx は、ドライバーが InterruptService または InterruptMessageService ルーチンを登録するときに、割り込みの KINTERRUPT 構造体へのポインターを提供します。 ドライバーは、割り込みの割り込みスピン ロックを取得または解放するときに、このポインターを使用します。 ドライバーは、InterruptService ルーチンの登録を解除するときにも、このポインターを使用します。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KLOCK_QUEUE_HANDLE
KLOCK_QUEUE_HANDLE 構造体は、キューに格納されたスピン ロックを記述する不透明な構造体です。 ドライバーは、KLOCK_QUEUE_HANDLE 構造体を割り当て、KeAcquireInStackQueuedSpinLock と KeAcquireInStackQueuedSpinLockAtDpcLevel に渡して、キューに格納されたスピン ロックを取得します。 これらのルーチンは、キューに入っているスピン ロックを表す構造体を初期化します。 ドライバーは、スピン ロックを解放するときに、KeReleaseInStackQueuedSpinLock と KeReleaseInStackQueuedSpinLockFromDpcLevel に構造体を渡します。
詳細については、「キューを使用するスピン ロック」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
KTIMER
KTIMER 構造体は、タイマー オブジェクトを表す不透明な構造体です。 この構造体のメンバーを直接設定しないでください。 詳細については、「KeXxxTimer ルーチン、KTIMER オブジェクト、DPC」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
LOOKASIDE_LIST_EX
LOOKASIDE_LIST_EX 構造体は、ルックアサイド リストを記述します。
typedef struct _LOOKASIDE_LIST_EX {
... // opaque
} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
ルックアサイド リストは、システム割り当てルーチンへの呼び出しの数を減らすためにドライバーがローカルで管理できる固定サイズのバッファーのプールであり、パフォーマンスが向上します。 バッファーは均一なサイズであり、ルックアサイド リストにエントリとして格納されます。
ドライバーは、LOOKASIDE_LIST_EX 構造体を不透明として扱う必要があります。 構造体メンバーにアクセスするドライバー、またはこれらのメンバーの場所に依存しているドライバーはメイン移植性が高く、他のドライバーと相互運用できない可能性があります。
「関連記事」セクションには、この構造体を使用するルーチンの一覧が示されています。
ルックアサイド リストの詳細については、「ルックアサイド リストの使用」を参照してください。
64 ビット プラットフォームでは、この構造体は 16 バイトアラインされている必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
NPAGED_LOOKASIDE_LIST
NPAGED_LOOKASIDE_LIST 構造体は、非ページ プールから割り当てられた固定サイズ バッファーのルックアサイド リストを記述する不透明な構造体です。 新しいエントリが作成され、必要に応じて一覧の未使用のエントリが破棄されます。 固定サイズバッファーの場合、ルックアサイド リストを使用する方が、メモリを直接割り当てるよりも高速です。
ExInitializeNPagedLookasideList を使用して、ルックアサイド リストを初期化します。 ExAllocateFromNPagedLookasideList を使用してリストからバッファーを割り当て、ExFreeToNPagedLookasideList を使用してリストにバッファーを返します。
ドライバーは、アンロードする前に作成したルックアサイド リストを常に明示的に解放する必要があります。 そうでない場合、重大なプログラミング エラーとなります。 リストを解放するには、ExDeleteNPagedLookasideList を使用します。
ドライバーは、ページ プールのルックアサイド リストを使用することもできます。 PAGED_LOOKASIDE_LIST構造体は、ページングされたバッファーを含むルックアサイド リストを記述します。 LOOKASIDE_LIST_EX構造体は、ページ バッファーまたは非ページ バッファーを含むルックアサイド リストを記述できます。 詳細については、「ルックアサイド リストの使用」を参照してください。
64 ビット プラットフォームでは、この構造体は 16 バイトアラインされている必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
OBJECT_TYPE
OBJECT_TYPE は、ハンドルのオブジェクトの種類を指定する不透明な構造体です。 詳細については、「ObReferenceObjectByHandle」を参照してください。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
PAGED_LOOKASIDE_LIST
PAGED_LOOKASIDE_LIST 構造体は、ページ プールから割り当てられた固定サイズ バッファーのルックアサイド リストを記述する不透明な構造体です。 新しいエントリが作成され、必要に応じて一覧の未使用のエントリが破棄されます。 固定サイズバッファーの場合、ルックアサイド リストを使用する方が、メモリを直接割り当てるよりも高速です。
ExInitializePagedLookasideList を使用して、ルックアサイド リストを初期化します。 ExAllocateFromPagedLookasideList を使用してリストからバッファーを割り当て、ExFreeToPagedLookasideList を使用してリストにバッファーを返します。
ドライバーは、アンロードする前に作成したルックアサイド リストを常に明示的に解放する必要があります。 そうでない場合、重大なプログラミング エラーとなります。 リストを解放するには、ExDeletePagedLookasideList を使用します。
ドライバーは、非ページ プールのルックアサイド リストを使用することもできます。 NPAGED_LOOKASIDE_LIST構造体は、非ページ バッファーを含むルックアサイド リストを記述します。 LOOKASIDE_LIST_EX構造体は、ページ バッファーまたは非ページ バッファーを含むルックアサイド リストを記述できます。 詳細については、「ルックアサイド リストの使用」を参照してください。
64 ビット プラットフォームでは、この構造体は 16 バイトアラインされている必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
RTL_BITMAP
RTL_BITMAP 構造体は、ビットマップを記述する不透明な構造体です。
typedef struct _RTL_BITMAP {
// opaque
} RTL_BITMAP, *PRTL_BITMAP;
この構造体のメンバーに直接アクセスしないでください。 メンバーの場所に依存関係があるドライバー、またはメンバー値に直接アクセスするドライバーは、今後のバージョンの Windows オペレーティング システムと互換性がない可能性があります。
RTL_BITMAP 構造体は、任意の長さの汎用の 1 次元ビットマップのヘッダーとして機能します。 ドライバーは、一連の再利用可能な項目を追跡するための経済的な方法として、このようなビットマップを使用できます。 たとえば、ファイル システムはビットマップを使用して、ハード ディスク上のどのクラスターとセクターがファイル データを保持するためにすでに割り当てられているかを追跡できます。
RTL_BITMAP 構造体を使用する RtlXxx ルーチンの一覧については、「関連記事」セクションを参照してください。 これらの RtlXxx ルーチンの呼び出し元は、RTL_BITMAP 構造体とビットマップを含むバッファーにストレージを割り当てる役割を担います。 このバッファーは、メモリ内の 4 バイト境界で始まり、長さが 4 バイトの倍数である必要があります。 ビットマップはバッファーの先頭から始まりますが、割り当てられたバッファーに収まる任意の数のビットを含めることができます。
RtlXxx ルーチンにパラメーターとして RTL_BITMAP 構造体を指定する前に、RtlInitializeBitMap ルーチンを呼び出して構造体を初期化します。 このルーチンへの入力パラメーターは、ビットマップを含むバッファーへのポインターであり、ビットマップのサイズ (ビット単位) です。 RtlInitializeBitMap では、このバッファーの内容は変更されません。
呼び出し元がページ メモリ内の RTL_BITMAP 構造体とビットマップのストレージを割り当てる場合、呼び出し元は IRQL <= APC_LEVELで実行されている必要があります。この構造体へのポインターをパラメーターとして、「関連記事」のセクションに記載されている RtlXxx ルーチンのいずれかに渡します。 呼び出し元が非ページ メモリ (または、同様に、ロックされたページ メモリ) からストレージを割り当てる場合、RtlXxxルーチンを呼び出すときに、呼び出し元は任意の IRQL で実行できます。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
RTL_RUN_ONCE
RTL_RUN_ONCE 構造体は、1 回限りの初期化の情報を格納する不透明な構造体です。
ドライバーは、他の RtlRunOnceXxx ルーチンに渡す前に RtlRunOnceInitialize ルーチンを呼び出して、この構造体を初期化した後、する必要があります。
ヘッダー: Ntddk.h。 インクルード: Ntddk.h。
SECURITY_SUBJECT_CONTEXT
SECURITY_SUBJECT_CONTEXT 構造体は、特定の操作が実行されているセキュリティ コンテキストを表す不透明な構造体です。 ドライバーは、この構造体のメンバーを変更したり、直接アクセスしたりしてセキュ リティ上の決定を行ってはなりません。 代わりに、承認におけるセキュリティ上の問題を回避できるよう、SeAccessCheck または SePrivilegeCheck を呼び出して、この不透明な構造体を渡し、
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
SLIST_HEADER
SLIST_HEADER 構造体は、1 つの順序でリンクされたリストのヘッダーとして機能する不透明な構造体です。 詳細については、「片方向および双方向リンク リスト」を参照してください。
64 ビット プラットフォームでは、 SLIST_HEADER 構造体は 16 バイトアラインされている必要があります。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
XSTATE_SAVE
XSTATE_SAVE 構造体は、カーネル モード ドライバーが保存および復元する拡張プロセッサ状態情報を記述する不透明な構造体です。
typedef struct _XSTATE_SAVE {
... // opaque
} XSTATE_SAVE, *PXSTATE_SAVE;
すべてのメンバーは不透明です。
KeSaveExtendedProcessorState ルーチンと KeRestoreExtendedProcessorStateルーチンは、この構造体を使用します。
ヘッダー: Wdm.h。 インクルード: Wdm.h、Ntddk.h、Ntifs.h。
関連記事
ExAllocateFromNPagedLookasideList
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
ExInitializeNPagedLookasideList
KeAcquireInStackQueuedSpinLock
KeAcquireInStackQueuedSpinLockAtDpcLevel
KeRestoreExtendedProcessorState
KeDeregisterBugCheckReasonCallback
KeRegisterBugCheckReasonCallback
KeReleaseInStackQueuedSpinLock
KeReleaseInStackQueuedSpinLockFromDpcLevel