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

Windows には、イベント、セマフォ、ミューテックス、待機可能タイマー、ファイル マッピング オブジェクト、ジョブ オブジェクト、シンボリック リンク オブジェクトという名前のカーネル オブジェクトに対して複数の名前空間があります。 クライアント/サーバー アプリケーションのサービスによって主に使用されるグローバル名前空間があります。 さらに、各セッションには、これらのオブジェクトに対して個別の名前空間があります。

個別のセッション名前空間を使用すると、複数のクライアントが互いに干渉することなく同じアプリケーションを実行できます。 クライアント セッションで開始されたプロセスの場合、システムは既定ではクライアント セッション名前空間を使用します。 ただし、これらのプロセスでは、"Global\" プレフィックスをオブジェクト名の前に置くことで、グローバル名前空間を使用できます。 たとえば、次のコードはCreateEventを呼び出し、CSAPP という名前のイベント オブジェクトをグローバル名前空間に作成します。

CreateEventW( NULL, FALSE, FALSE, L"Global\\CSAPP" );

サービス アプリケーションでは、既定ではグローバル名前空間が使用されます。

Note

グローバル名前空間は、Windows ストア アプリでは通話不可です。

セッション ゼロはホスティング サービスにのみ使用され、Windows Vista より前のバージョンの Windows とは異なり、コンソール セッションはありません。

グローバル名前空間を使用すると、複数のクライアント セッションのプロセスがサービス アプリケーションと通信できるようになります。 たとえば、クライアント/サーバー アプリケーションでは、同期にミューテックス オブジェクトを使用できます。 サーバー モジュールは、グローバル名前空間にミューテックス オブジェクトを作成できます。 その後、クライアント セッションで "Global\" プレフィックスを使用してミューテックス オブジェクトを開くことができます。

グローバル名前空間のもう 1 つの用途は、名前付きオブジェクトを使用して、すべてのセッションにわたってシステムで実行されているアプリケーションのインスタンスが既にあることを検出するアプリケーション用です。 この名前付きオブジェクトは、セッションごとの名前空間ではなく、グローバル名前空間で作成または開く必要があります。 名前付きオブジェクトはセッションごとの名前空間に作成されるため、セッションごとに 1 回アプリケーションを実行する場合のより一般的なケースが既定ではサポートされます。

クライアント プロセスでは、"Global\" プレフィックスに加えて、"Local\" プレフィックスを使用して、セッション名前空間にオブジェクトを明示的に作成できます。 これらのキーワードは、大文字と小文字の区別をします。

"Session\" プレフィックスはシステム用に予約されているため、カーネル オブジェクトの名前には使用しないでください。

高速ユーザー切り替えは、セッションを使用して実装されます。 ログオンする最初のユーザーはセッション 1 を使用し、次にログオンするユーザーはセッション 2 を使用します。 カーネル オブジェクト名は、アプリケーションが複数のユーザーをサポートできるように、リモート デスクトップ サービスのガイドラインに従う必要があります。

CreateFileMappingを使用するなど、グローバル名前空間にファイル マッピング オブジェクトまたはシンボリック リンク オブジェクトをセッション ゼロ以外のセッションから作成することは特権操作です。 このため、グローバル名前空間にファイル マッピング オブジェクトまたはシンボリック リンク オブジェクトを作成するには、アプリケーションで SeCreateGlobalPrivilegeを有効にする必要があります。 特権チェックはこれらのオブジェクトの作成に限定され、既存のオブジェクトを開く場合には適用されません。 たとえば、サービスまたはシステムがグローバル名前空間にファイル マッピング オブジェクトを作成する場合、プロセスが必要なアクセス権を持っている場合、任意のセッションで実行されているプロセスは、そのファイル マッピング オブジェクトにアクセスできます。