カーネル オブジェクト
カーネル オブジェクト ハンドルはプロセス固有です。 つまり、プロセスで オブジェクトを作成するか、既存の オブジェクトを開いてカーネル オブジェクト ハンドルを取得する必要があります。 カーネル ハンドルのプロセスごとの制限は 2^24 です。 ただし、ハンドルはページ プールに格納されるため、作成できるハンドルの実際の数は使用可能なメモリに基づきます。 32 ビット Windows で作成できるハンドルの数は、2^24 より大幅に少なくなっています。
プロセスがオブジェクトの名前を認識し、オブジェクトへのセキュリティ アクセス権を持っている場合は、既存のカーネル オブジェクト (別のプロセスによって作成されたものも含む) への新しいハンドルを作成できます。 カーネル オブジェクト ハンドルには、プロセスに対して許可または拒否できるアクションを示すアクセス権が含まれます。 アプリケーションは、オブジェクトを作成するとき、または既存のオブジェクト ハンドルを取得するときにアクセス権を指定します。 カーネル オブジェクトの種類ごとに、独自のアクセス権のセットがサポートされています。 たとえば、イベント ハンドルには、アクセスの設定または待機 (またはその両方)、ファイル ハンドルに読み取りアクセスまたは書き込みアクセス (またはその両方) を使用できます。 詳細については、「 セキュリティ保護可能なオブジェクト」を参照してください。
次の図では、アプリケーションによってイベント オブジェクトが作成されます。 CreateEvent 関数は、イベント オブジェクトを作成し、オブジェクト ハンドルを返します。
イベント オブジェクトが作成されると、アプリケーションはイベント ハンドルを使用して、イベントを設定または待機できます。 ハンドルは、アプリケーションがハンドルを閉じるか終了するまで有効なままです。
ほとんどのカーネル オブジェクトでは、1 つのオブジェクトに対する複数のハンドルがサポートされています。 たとえば、前の図のアプリケーションでは、次の図に示すように 、OpenEvent 関数を使用して追加のイベント オブジェクト ハンドルを取得できます。
このメソッドを使用すると、アプリケーションは異なるアクセス権を持つハンドルを持つことができます。 たとえば、ハンドル 1 がイベントへのアクセスを設定して待機し、ハンドル 2 が待機アクセスのみを持つ場合があります。
別のプロセスがイベント名を認識し、オブジェクトへのセキュリティ アクセス権を持つ場合は、 OpenEvent を使用して独自のイベント オブジェクト ハンドルを作成できます。 また、作成するアプリケーションでは、 DuplicateHandle 関数を使用して、ハンドルの 1 つを同じプロセスまたは別のプロセスに複製することもできます。
少なくとも 1 つのオブジェクト ハンドルが存在する限り、オブジェクトはメモリ内に残ります。 次の図では、アプリケーションは CloseHandle 関数を使用してイベント オブジェクト ハンドルを閉じます。 イベント ハンドルがない場合、次の図に示すように、システムはオブジェクトをメモリから削除します。
システムは、ファイル オブジェクトを他のカーネル オブジェクトとは若干異なる方法で管理します。 ファイル オブジェクトには、ファイル ポインター (ファイル内で読み取りまたは書き込まれる次のバイトへのポインター) が含まれます。 アプリケーションが新しいファイル ハンドルを作成するたびに、システムによって新しいファイル オブジェクトが作成されます。 したがって、次の図に示すように、複数のファイル オブジェクトがディスク上の 1 つのファイルを参照できます。
重複または継承によってのみ、次の図に示すように、複数のファイル ハンドルが同じファイル オブジェクトを参照できます。
次の表に、各カーネル オブジェクトと、各オブジェクトの作成者関数と破壊機能を示します。 creator 関数は、オブジェクトとオブジェクト ハンドルを作成するか、新しい既存のオブジェクト ハンドルを作成します。 破壊者関数はオブジェクト ハンドルを閉じます。 アプリケーションがカーネル オブジェクトへの最後のハンドルを閉じると、システムはメモリからオブジェクトを削除します。
関連トピック