Lokale und globale MS-DOS-Gerätenamen
Microsoft Windows 2000 und höhere Versionen des Windows NT-basierten Betriebssystems verwalten mehrere Versionen des DosDevices-Verzeichnisses .
Auf diesen Betriebssystemen gibt es ein globales Verzeichnis \DosDevices und mehrere lokale \DosDevices-Verzeichnisse . Das globale Verzeichnis \DosDevices enthält die MS-DOS-Gerätenamen, die systemweit sichtbar sind. Ein lokales Verzeichnis "\DosDevices" enthält MS-DOS-Gerätenamen, die nur in einem bestimmten lokalen DosDevices-Kontext sichtbar sind.
Die lokalen DosDevices-Kontexte sind wie folgt.
Unter Windows XP und höher verfügt jede Anmeldesitzung über einen eigenen lokalen DosDevices-Kontext . Systemthreads und alle Threads, die als LocalSystem-Benutzer ausgeführt werden, werden nicht in einem lokalen DosDevices-Kontext ausgeführt.
Unter Windows 2000 verfügt jede Terminalserversitzung über einen eigenen lokalen DosDevices-Kontext . Jeder Thread, der als Teil der Konsolensitzung ausgeführt wird, wird nicht in einem lokalen DosDevices-Kontext ausgeführt.
Jeder Thread verfügt über einen aktuellen DosDevices-Kontext , der sich über die Lebensdauer eines Threads ändern kann. Ein Thread, der nicht in einem lokalen DosDevices-Kontext ausgeführt wird, wird im globalen DosDevices-Kontext ausgeführt. Daher wird das Systemkonto im globalen DosDevices-Kontext ausgeführt.
Wenn ein Thread derzeit in einem lokalen DosDevices-Kontext ausgeführt wird, werden alle von ihr erstellten MS-DOS-Gerätenamen nur im lokalen DosDevices-Verzeichnis erstellt. Daher können Threads, die in einem lokalen DosDevices-Kontext ausgeführt werden, keine Auswirkungen auf die MS-DOS-Gerätenamen haben, die für Threads sichtbar sind, die in einem anderen lokalen DosDevices-Kontext oder im globalen DosDevices-Kontext ausgeführt werden. Wenn z. B. ein Benutzer unter Windows XP oder höher ein Netzlaufwerk als X:bereit stellt, hat dies keine Auswirkungen auf die Bedeutung von X: für einen anderen Benutzer oder für das gesamte System.
Wenn der Objekt-Manager unter Windows XP und höher einen Namen in \DosDevices sucht, durchsucht er zuerst das lokale Verzeichnis "\DosDevices " und dann das globale Verzeichnis "\DosDevices ". Wenn der Name an beiden Stellen vorhanden ist, schattiert der lokale Name den globalen Namen.
Unter Windows 2000 erstellt das System bei jedem Initiieren einer neuen Terminalserversitzung das lokale Verzeichnis "\DosDevices ", indem das globale Verzeichnis "\DosDevices " kopiert wird. Alle nachfolgenden Änderungen am globalen Verzeichnis werden nicht an das lokale Verzeichnis weitergegeben.
Ein Treiber, der seine MS-DOS-Gerätenamen im globalen Verzeichnis \DosDevices erstellen muss, kann dies tun, indem er seine symbolischen Verknüpfungen in einer Standardtreiberroutine erstellt, die garantiert in einem Systemthreadkontext ausgeführt wird, z . B. DriverEntry. Alternativ ist das globale Verzeichnis \DosDevices als \DosDevices\Global verfügbar. Treiber können einen Namen der \DosDevices\Global\DosDeviceName verwenden, um einen Namen im globalen Verzeichnis anzugeben.
Beachten Sie, dass \DosDevices\Global nicht auf Plattformen vorhanden ist, die lokale und globale Versionen von \DosDevices, z. B. Windows 98/Me, nicht unterstützen. Im folgenden Codebeispiel wird eine globale symbolische Verknüpfung erstellt, die unter Windows 98/Me sowie unter Windows 2000 und höheren Betriebssystemen funktioniert:
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. */
}
Ein Treiber kann MS-DOS-Gerätenamen in lokalen \DosDevices-Verzeichnissen erstellen, indem der symbolische Link als Reaktion auf eine IOCTL erstellt wird. Wenn ein Thread in einem bestimmten lokalen DosDevices-Kontext die IOCTL sendet, wird das DispatchDeviceControl des Treibers innerhalb des aktuellen Threadkontexts aufgerufen.
Weitere Informationen zum Kontext, in dem eine Standardtreiberroutine ausgeführt wird, finden Sie unter Dispatch Routines und IRQLs.
Das System unterscheidet lokale \DosDevices-Verzeichnisse wie folgt:
Unter Windows XP und höher werden lokale \DosDevices-Verzeichnisse durch die AuthenticationID für das Zugriffstoken der Anmeldesitzung identifiziert. Weitere Informationen zur AuthenticationID finden Sie in der Dokumentation zum Microsoft Windows SDK in der Beschreibung der TOKEN_STATISTICS Struktur.
Unter Windows 2000 werden lokale \DosDevices-Verzeichnisse durch die SessionId für die Terminalserversitzung identifiziert. Weitere Informationen zur SessionId finden Sie in der Windows SDK-Dokumentation in der Beschreibung der WTS_SESSION_INFO Struktur.
Windows NT 4.0 Terminal Server Edition unterstützt lokale \DosDevices-Verzeichnisse auf die gleiche Weise wie Windows 2000.