ローカルおよびグローバル MS-DOS デバイス名

Microsoft Windows 2000 以降の Windows NT ベースのオペレーティング シ ステムでは、複数のバージョンの DosDevices ディレクトリが維持されています。

これらのオペレーティング システムには、1 つの global \DosDevices ディレクトリと複数の local \DosDevices ディレクトリがあります。 グローバル \DosDevices ディレクトリには、システム全体で表示される MS-DOS デバイス名が保持されます。 ローカル \DosDevices ディレクトリには、特定の local DosDevices context にのみ表示される MS-DOS デバイス名が保持されます。

ローカル DosDevices コンテキストは次のとおりです。

  • Windows XP 以降では、各ログオン セッションに独自のローカル DosDevices コンテキストがあります。 システム スレッド、および LocalSystem ユーザーとして実行されているスレッドは、ローカル DosDevices コンテキストでは実行されません。

  • Windows 2000 では、各ターミナル サーバー セッションに独自のローカル DosDevices コンテキストがあります。 コンソール セッションの一部として実行されているスレッドは、ローカル の DosDevices コンテキストでは実行されません。

各スレッドには現在の DosDevices コンテキストがあり、これはスレッドの有効期間中に変更される場合があります。 ローカル DosDevices コンテキストで実行されないスレッドは、 global DosDevices context で実行されると言われます。 したがって、システム アカウントはグローバル DosDevices コンテキストで実行されます。

スレッドが現在ローカル DosDevices コンテキストで実行されている場合、スレッドで作成されるすべての MS-DOS デバイス名は、ローカル DosDevices ディレクトリにのみ作成されます。 そのため、ローカル DosDevices コンテキストで実行されているスレッドは、別のローカル DosDevices コンテキスト、またはグローバル DosDevices コンテキストで実行されているスレッドに表示される MS-DOS デバイス名に作用を及ぼすことはできません。 たとえば、Windows XP 以降のユーザーがネットワーク ドライブを X: としてマウントしても、他のユーザーやシステム全体にとっての X: の意味には影響をもたらしません。

Windows XP 以降では、オブジェクト マネージャーが \DosDevices で名前を検索すると、最初にローカル \DosDevices ディレクトリ、次にグローバル \DosDevices ディレクトリを検索します。 両方の場所に名前が存在する場合、ローカル名がグローバル名より優先されます。

Windows 2000 では、新しいターミナル サーバー セッションが開始されるたびに、システムはグローバル \DosDevices ディレクトリをコピーしてローカル \DosDevices ディレクトリを作成します。 グローバル ディレクトリに対するその後の変更は、ローカル ディレクトリには反映されません。

グローバル \DosDevices ディレクトリに MS-DOS デバイス名を作成する必要があるドライバーは、DriverEntry などのシステム スレッド コンテキストで実行することが保証されている標準ドライバー ルーチンにシンボリック リンクを作成することで、これを行うことができます。 または、グローバル \DosDevices ディレクトリを \DosDevices\Global として使用できます。ドライバーでは、\DosDevices\Global\DosDeviceName の名前を使用して、グローバル ディレクトリ内の名前を指定できます。

\DosDevices\Global は、Windows 98/Me などの \DosDevices のローカル バージョンとグローバル バージョンをサポートしていないプラットフォームには存在しないことに注意してください。 次のコード例では、Windows 98/Me および Windows 2000 以降のオペレーティング システムで動作する、グローバル シンボリック リンクを作成しています。

UNICODE_STRING deviceName; // Already initialized.
UNICODE_STRING symbolicLinkName; // Initializing below.
NTSTATUS status;

if (IoIsWdmVersionAvailable(1, 0x10)) {
    // We're on Windows 2000 or later, so we use \DosDevices\Global.
 
    RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\Global\\SymbolicLinkName");

} else {
    // Windows 98/Me.  We just use DosDevices.
 
    RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\SymbolicLinkName");
}

status = IoCreateSymbolicLink(&symbolicLinkName, &deviceName);
if (!NT_SUCCESS(status)) {
  /* Symbolic link creation failed.  Handle error appropriately. */
}

ドライバーは、IOCTL に応答してシンボリック リンクを作成することで、ローカル \DosDevices ディレクトリに MS-DOS デバイス名を作成できます。 特定のローカル DosDevices コンテキストのスレッドが IOCTL を送信すると、ドライバーの DispatchDeviceControl が現在のスレッド コンテキスト内から呼び出されます。

標準ドライバー ルーチンが実行されるコンテキストの詳細については、「ディスパッチ ルーチンと IRQL」を参照してください。

システムは、ローカル \DosDevices ディレクトリを次のように区別します。

  • Windows XP 以降では、ローカル \DosDevices ディレクトリは、ログオン セッションのアクセス トークンの AuthenticationID によって識別されます。 AuthenticationID の詳細については、Microsoft Windows SDK ドキュメントで TOKEN_STATISTICS 構造体に関する説明を参照してください。

  • Windows 2000 では、ローカル \DosDevices ディレクトリは、ターミナル サーバー セッションの SessionId によって識別されます。 SessionId の詳細については、Windows SDK ドキュメントで WTS_SESSION_INFO 構造体に関する説明を参照してください。

Windows NT 4.0 ターミナル サーバー エディションでは、Windows 2000 とまったく同様にローカル \DosDevices ディレクトリがサポートされています。