カーネル オブジェクト

カーネル オブジェクト ハンドルはプロセス固有です。 つまり、プロセスで オブジェクトを作成するか、既存の オブジェクトを開いてカーネル オブジェクト ハンドルを取得する必要があります。 カーネル ハンドルのプロセスごとの制限は 2^24 です。 ただし、ハンドルはページ プールに格納されるため、作成できるハンドルの実際の数は使用可能なメモリに基づきます。 32 ビット Windows で作成できるハンドルの数は、2^24 より大幅に少なくなっています。

プロセスがオブジェクトの名前を認識し、オブジェクトへのセキュリティ アクセス権を持っている場合は、既存のカーネル オブジェクト (別のプロセスによって作成されたものも含む) への新しいハンドルを作成できます。 カーネル オブジェクト ハンドルには、プロセスに対して許可または拒否できるアクションを示すアクセス権が含まれます。 アプリケーションは、オブジェクトを作成するとき、または既存のオブジェクト ハンドルを取得するときにアクセス権を指定します。 カーネル オブジェクトの種類ごとに、独自のアクセス権のセットがサポートされています。 たとえば、イベント ハンドルには、アクセスの設定または待機 (またはその両方)、ファイル ハンドルに読み取りアクセスまたは書き込みアクセス (またはその両方) を使用できます。 詳細については、「 セキュリティ保護可能なオブジェクト」を参照してください。

次の図では、アプリケーションによってイベント オブジェクトが作成されます。 CreateEvent 関数は、イベント オブジェクトを作成し、オブジェクト ハンドルを返します。

イベント オブジェクトを作成するアプリケーション

イベント オブジェクトが作成されると、アプリケーションはイベント ハンドルを使用して、イベントを設定または待機できます。 ハンドルは、アプリケーションがハンドルを閉じるか終了するまで有効なままです。

ほとんどのカーネル オブジェクトでは、1 つのオブジェクトに対する複数のハンドルがサポートされています。 たとえば、前の図のアプリケーションでは、次の図に示すように 、OpenEvent 関数を使用して追加のイベント オブジェクト ハンドルを取得できます。

複数のハンドルを持つイベント オブジェクトを作成するアプリケーション

このメソッドを使用すると、アプリケーションは異なるアクセス権を持つハンドルを持つことができます。 たとえば、ハンドル 1 がイベントへのアクセスを設定して待機し、ハンドル 2 が待機アクセスのみを持つ場合があります。

別のプロセスがイベント名を認識し、オブジェクトへのセキュリティ アクセス権を持つ場合は、 OpenEvent を使用して独自のイベント オブジェクト ハンドルを作成できます。 また、作成するアプリケーションでは、 DuplicateHandle 関数を使用して、ハンドルの 1 つを同じプロセスまたは別のプロセスに複製することもできます。

少なくとも 1 つのオブジェクト ハンドルが存在する限り、オブジェクトはメモリ内に残ります。 次の図では、アプリケーションは CloseHandle 関数を使用してイベント オブジェクト ハンドルを閉じます。 イベント ハンドルがない場合、次の図に示すように、システムはオブジェクトをメモリから削除します。

メモリからオブジェクトを削除するためのアプリケーション終了イベント オブジェクト ハンドル

システムは、ファイル オブジェクトを他のカーネル オブジェクトとは若干異なる方法で管理します。 ファイル オブジェクトには、ファイル ポインター (ファイル内で読み取りまたは書き込まれる次のバイトへのポインター) が含まれます。 アプリケーションが新しいファイル ハンドルを作成するたびに、システムによって新しいファイル オブジェクトが作成されます。 したがって、次の図に示すように、複数のファイル オブジェクトがディスク上の 1 つのファイルを参照できます。

ディスク上のファイルを参照する複数のファイル オブジェクト

重複または継承によってのみ、次の図に示すように、複数のファイル ハンドルが同じファイル オブジェクトを参照できます。

2 つのファイル ハンドルが同じファイル オブジェクトを参照する

次の表に、各カーネル オブジェクトと、各オブジェクトの作成者関数と破壊機能を示します。 creator 関数は、オブジェクトとオブジェクト ハンドルを作成するか、新しい既存のオブジェクト ハンドルを作成します。 破壊者関数はオブジェクト ハンドルを閉じます。 アプリケーションがカーネル オブジェクトへの最後のハンドルを閉じると、システムはメモリからオブジェクトを削除します。

Kernel オブジェクト Creator 関数 デストロイヤー関数
アクセス トークン CreateRestrictedTokenDuplicateTokenDuplicateTokenExOpenProcessTokenOpenThreadToken CloseHandle
変更通知 FindFirstChangeNotification FindCloseChangeNotification
通信デバイス CreateFile CloseHandle
コンソール入力 CREATEFile (CONIN$ を使用) CloseHandle
コンソール画面バッファー CreateFile(CONOUT$ を使用) CloseHandle
デスクトップ GetThreadDesktop アプリケーションはこのオブジェクトを削除できません。
イベント CreateEventCreateEventExOpenEvent CloseHandle
イベント ログ OpenEventLogRegisterEventSourceOpenBackupEventLog CloseEventLog
ファイル CreateFile CloseHandleDeleteFile
ファイル マッピング CreateFileMappingOpenFileMapping CloseHandle
ファイルの検索 FindFirstFile FindClose
ヒープ HeapCreate HeapDestroy
I/O 入力候補ポート CreateIoCompletionPort CloseHandle
ジョブ CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
メモリ リソース通知 CreateMemoryResourceNotification CloseHandle
モジュール LoadLibraryGetModuleHandle FreeLibrary
Mutex CreateMutexCreateMutexExOpenMutex CloseHandle
Pipe CreateNamedPipeCreatePipe CloseHandleDisconnectNamedPipe
Process CreateProcessOpenProcessGetCurrentProcess CloseHandleTerminateProcess
Semaphore CreateSemaphoreCreateSemaphoreExOpenSemaphore CloseHandle
ソケット socketaccept closesocket
スレッド CreateThreadCreateRemoteThreadGetCurrentThread CloseHandleTerminateThread
Timer CreateWaitableTimerCreateWaitableTimerExOpenWaitableTimer CloseHandle
リソースの更新 BeginUpdateResource EndUpdateResource
窓のステーション GetProcessWindowStation アプリケーションはこのオブジェクトを削除できません。

 

カーネル オブジェクトの名前空間