Condividi tramite


Nomi dei dispositivi MS-DOS locali e globali

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

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

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 contesto DosDevices globale. 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 l'intero sistema.

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

In Windows 2000, ogni volta che viene avviata una nuova sessione del server terminal, il sistema compila la directory \DosDevices locale copiando la directory globale \DosDevices . Eventuali 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 di driver standard, vedere Routine dispatch e 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 \DosDevices locali esattamente come Windows 2000.