次の方法で共有


カーネル オブジェクト

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

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

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

イベント オブジェクト

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

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

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

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

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

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

メモリ

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

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

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

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

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

Kernel オブジェクト Creator 関数 デストロイヤー関数
アクセス トークン CreateRestrictedToken、 duplicateTokenDuplicateTokenExOpenProcessTokenOpenThreadToken CloseHandleする
変更通知 FindFirstChangeNotification FindCloseChangeNotification
通信デバイス CreateFile CloseHandleする
コンソール入力 createFileを CONIN$ でする CloseHandleする
コンソール画面バッファー createFileを CONOUT$ でする CloseHandleする
デスクトップ GetThreadDesktopする アプリケーションはこのオブジェクトを削除できません。
出来事 CreateEvent、CreateEventExOpenEvent CloseHandleする
イベント ログ OpenEventLog、registerEventSourceOpenBackupEventLog CloseEventLogする
ファイル CreateFile CloseHandle、DeleteFile
ファイル マッピング CreateFileMappingOpenFileMapping CloseHandleする
ファイルを検索する FindFirstFile FindClose
ヒープ HeapCreate HeapDestroy
I/O 完了ポート CreateIoCompletionPort CloseHandleする
仕事 CreateJobObject CloseHandleする
Mailslot CreateMailslot CloseHandleする
メモリ リソース通知 CreateMemoryResourceNotification CloseHandleする
モジュール LoadLibraryGetModuleHandle FreeLibrary
ミューテックス CreateMutexCreateMutexExOpenMutex CloseHandleする
パイプ CreateNamedPipe、CreatePipe CloseHandle、DisconnectNamedPipe
過程 CreateProcessOpenProcess、getCurrentProcess CloseHandleTerminateProcess
セマフォ CreateSemaphore、CreateSemaphoreExOpenSemaphore CloseHandleする
ソケット ソケットを受け入れる closesocketする
CreateThread、CreateRemoteThreadGetCurrentThread CloseHandle、 TerminateThread
タイマー CreateWaitableTimer、CreateWaitableTimerExOpenWaitableTimer CloseHandleする
リソースの更新 BeginUpdateResource EndUpdateResource
窓ステーション GetProcessWindowStation アプリケーションはこのオブジェクトを削除できません。

 

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