Lokale und globale MS-DOS-Gerätenamen

Microsoft Windows 2000 und höhere Versionen des Windows NT-basierten Betriebssystems verwalten mehrere Versionen des Verzeichnisses DosDevices .

Unter diesen Betriebssystemen gibt es ein Globales\DosDevices-Verzeichnis und mehrere local\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 lokalenDosDevices-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 im Laufe der Lebensdauer eines Threads ändern kann. Ein Thread, der nicht in einem lokalen DosDevices-Kontext ausgeführt wird, wird im globalenDosDevices-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 ms-DOS-Gerätenamen, die er erstellt, nur im lokalen DosDevices-Verzeichnis erstellt. Threads, die in einem lokalen DosDevices-Kontext ausgeführt werden, können sich daher nicht auf die MS-DOS-Gerätenamen auswirken, 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:einhängt, wirkt sich dies nicht auf die Bedeutung von X: für einen anderen Benutzer oder für das System als Ganzes aus.

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, überschatt der lokale Name den globalen Namen.

Unter Windows 2000 erstellt das System jedes Mal, wenn eine neue Terminalserversitzung initiiert wird, das lokale Verzeichnis \DosDevices durch Kopieren des globalen Verzeichnisses \DosDevices . 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 den Namen \DosDevices\Global\DosDeviceName verwenden, um einen Namen im globalen Verzeichnis anzugeben.

Beachten Sie, dass \DosDevices\Global nicht auf Plattformen vorhanden ist, die keine lokalen und globalen Versionen von \DosDevices wie Windows 98/Me unterstützen. Im folgenden Codebeispiel wird ein globaler symbolischer Link erstellt, der sowohl unter Windows 98/Me als auch unter Windows 2000 und höher 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 einem lokalen \DosDevices-Verzeichnis erstellen, indem er den symbolischen Link als Reaktion auf eine IOCTL erstellt. Wenn ein Thread in einem bestimmten lokalen DosDevices-Kontext die IOCTL sendet, wird dispatchDeviceControl des Treibers aus dem aktuellen Threadkontext aufgerufen.

Weitere Informationen zum Kontext, in dem eine Standardtreiberroutine ausgeführt wird, finden Sie unter Dispatch Routines and IRQLs( Dispatch Routines and 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 Beschreibung der TOKEN_STATISTICS-Struktur in der Microsoft Windows SDK-Dokumentation.

  • Unter Windows 2000 werden lokale \DosDevices-Verzeichnisse durch die SessionId für die Terminalserversitzung identifiziert. Weitere Informationen zur SessionId finden Sie in der Beschreibung der WTS_SESSION_INFO-Struktur in der Windows SDK-Dokumentation.

Windows NT 4.0 Terminal Server Edition unterstützt lokale \DosDevices-Verzeichnisse auf die gleiche Weise wie Windows 2000.