カーネル オブジェクト

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

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

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

イベント オブジェクト

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

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

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

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

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

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

メモリ

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

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

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

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

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

Kernel オブジェクト Creator 関数 デストロイヤー関数
アクセス トークン CreateRestrictedToken、 duplicateToken、 DuplicateTokenEx、 OpenProcessToken、 OpenThreadToken CloseHandleをする
変更通知 FindFirstChangeNotificationの FindCloseChangeNotificationの
通信デバイス CreateFileの CloseHandleをする
コンソール入力 createFileを CONIN$ でする CloseHandleをする
コンソール画面バッファー createFileを CONOUT$ でする CloseHandleをする
デスクトップ GetThreadDesktopをする アプリケーションはこのオブジェクトを削除できません。
出来事 CreateEvent、CreateEventEx、OpenEvent の CloseHandleをする
イベント ログ OpenEventLog、registerEventSource、OpenBackupEventLog CloseEventLogをする
ファイル CreateFileの CloseHandle、DeleteFile
ファイル マッピング CreateFileMapping、OpenFileMapping CloseHandleをする
ファイルを検索する FindFirstFileの FindClose
ヒープ HeapCreateの HeapDestroyの
I/O 完了ポート CreateIoCompletionPortの CloseHandleをする
仕事 CreateJobObjectの CloseHandleをする
Mailslot CreateMailslotの CloseHandleをする
メモリ リソース通知 CreateMemoryResourceNotificationの CloseHandleをする
モジュール LoadLibrary、GetModuleHandle FreeLibrary
ミューテックス CreateMutex、CreateMutexEx、OpenMutex CloseHandleをする
パイプ CreateNamedPipeの、CreatePipe CloseHandle、DisconnectNamedPipe
過程 CreateProcess、OpenProcess、getCurrentProcess CloseHandle、TerminateProcess
セマフォ CreateSemaphore、CreateSemaphoreEx、OpenSemaphore CloseHandleをする
ソケット ソケット、を受け入れる closesocketをする
糸 CreateThread、CreateRemoteThread、GetCurrentThread の CloseHandle、 TerminateThread
タイマー CreateWaitableTimer、CreateWaitableTimerEx、OpenWaitableTimer の CloseHandleをする
リソースの更新 BeginUpdateResourceの EndUpdateResourceの
窓ステーション GetProcessWindowStationの アプリケーションはこのオブジェクトを削除できません。

 

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