Nomi dei dispositivi MS-DOS locali e globali

Microsoft Windows 2000 e versioni successive del sistema operativo basato su Windows NT gestiscono più versioni della directory DosDevices .

In questi sistemi operativi è presente una directory global\DosDevices e più directory local\DosDevices . La directory globale \DosDevices contiene i nomi dei dispositivi MS-DOS visibili a livello di sistema. Una directory \DosDevices locale contiene nomi di dispositivo MS-DOS visibili solo in un particolare contestoDosDeviceslocale.

I contesti DosDevices locali sono i seguenti.

  • In Windows XP e versioni successive, ogni sessione di accesso ha un proprio contesto DosDevices locale. I thread di sistema e qualsiasi thread in esecuzione come utente LocalSystem non vengono eseguiti in un contesto DosDevices locale.

  • In Windows 2000 ogni sessione del server terminal ha un proprio contesto DosDevices locale. Qualsiasi thread in esecuzione come parte della sessione della console non viene eseguito in un contesto DosDevices locale.

Ogni thread ha un contesto DosDevices corrente, che può cambiare per tutta la durata di un thread. Un thread che non viene eseguito in un contesto DosDevices locale viene detto eseguito nel contestoDosDevicesglobale. Di conseguenza, l'account di sistema viene eseguito nel contesto DosDevices globale.

Se un thread è attualmente in esecuzione in un contesto DosDevices locale, tutti i nomi di dispositivo MS-DOS creati vengono creati solo nella directory DosDevices locale. Pertanto, i thread in esecuzione in un contesto DosDevices locale non possono influire sui nomi dei dispositivi MS-DOS visibili ai thread in esecuzione in un altro contesto DosDevices locale o nel contesto DosDevices globale. Ad esempio, se un utente in Windows XP o versioni successive monta un'unità di rete come X:, questo non influisce sul significato di X: per qualsiasi altro utente o per il sistema nel suo complesso.

In Windows XP e versioni successive, quando il gestore oggetti cerca un nome in \DosDevices, cerca prima la directory \DosDevices locale e quindi la directory globale \DosDevices . Se il nome esiste in entrambe le posizioni, il nome locale ombreggiato dal nome globale.

In Windows 2000, ogni volta che viene avviata una nuova sessione del server terminal, il sistema compila la directory locale \DosDevices copiando la directory globale \DosDevices . Le modifiche successive alla directory globale non vengono propagate alla directory locale.

Un driver che deve creare i nomi dei dispositivi MS-DOS nella directory globale \DosDevices può farlo creando i collegamenti simbolici in una routine di driver standard che è garantita l'esecuzione in un contesto di thread di sistema, ad esempio DriverEntry. In alternativa, la directory globale \DosDevices è disponibile come \DosDevices\Global; i driver possono usare un nome di \DosDevices\Global\DosDeviceName per specificare un nome nella directory globale.

Si noti che \DosDevices\Global non esiste su piattaforme che non supportano versioni locali e globali di \DosDevices, ad esempio Windows 98/Me. L'esempio di codice seguente crea un collegamento simbolico globale che funziona in Windows 98/Me e nei sistemi operativi Windows 2000 e versioni successive:

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. */
}

Un driver può creare nomi di dispositivo MS-DOS in una directory \DosDevices locale creando il collegamento simbolico in risposta a un IOCTL. Quando un thread in un particolare contesto DosDevices locale invia l'IOCTL, il controllo DispatchDeviceControl del driver viene chiamato dall'interno del contesto del thread corrente.

Per altre informazioni sul contesto in cui viene eseguita una routine del driver standard, vedere Dispatch Routines and IRQLs.For more information about the context in which a standard driver routine runs, see Dispatch Routines and IRQLs.

Il sistema distingue le directory locali \DosDevices come indicato di seguito:

  • In Windows XP e versioni successive, le directory \DosDevices locali sono identificate dall'AuthenticationID per il token di accesso della sessione di accesso. Per altre informazioni su AuthenticationID, vedere la descrizione della struttura TOKEN_STATISTICS nella documentazione di Microsoft Windows SDK.

  • In Windows 2000 le directory \DosDevices locali sono identificate dal SessionId per la sessione del server terminal. Per altre informazioni su SessionId, vedere la descrizione della struttura WTS_SESSION_INFO nella documentazione di Windows SDK.

Windows NT 4.0 Terminal Server Edition supporta directory locali \DosDevices esattamente come Windows 2000.