ローカルおよびグローバル 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 ディレクトリがサポートされています。