Compartilhar via


Nomes de dispositivos locais e globais de MS-DOS

O Microsoft Windows 2000 e versões posteriores do sistema operacional baseado em Windows NT mantêm várias versões do diretório DosDevices .

Nesses sistemas operacionais, há um diretório global\DosDevices e vários diretórios locais\DosDevices . O diretório global \DosDevices contém os nomes de dispositivo MS-DOS visíveis em todo o sistema. Um diretório local \DosDevices contém nomes de dispositivos MS-DOS visíveis apenas em um contexto específico de DosDeviceslocal.

Os contextos locais de DosDevices são os seguintes.

  • No Windows XP e posterior, cada sessão de logon tem seu próprio contexto de DosDevices local. Os threads do sistema e qualquer thread em execução como o usuário LocalSystem não são executados em um contexto local de DosDevices.

  • No Windows 2000, cada sessão do servidor de terminal tem seu próprio contexto de DosDevices local. Qualquer thread que esteja em execução como parte da sessão do console não será executada em um contexto local DosDevices.

Cada thread tem um contexto atual de DosDevices , que pode mudar ao longo do tempo de vida de um thread. Diz-se que um thread que não é executado em um contexto de DosDevices local é executado no globalDosDevicescontexto. Assim, a conta do sistema é executada no contexto global DosDevices.

Se uma thread estiver em execução no momento em um contexto de DosDevices local, quaisquer nomes de dispositivos MS-DOS que ela criar serão criados apenas no diretório DosDevices local. Portanto, as threads que estão em execução em um contexto local DosDevices não podem afetar os nomes de dispositivo MS-DOS que são visíveis para threads que estão em execução em outro contexto local DosDevices ou no contexto global DosDevices. Por exemplo, se um usuário no Windows XP ou posterior montar uma unidade de rede como X:, isso não afetará o significado de X: para qualquer outro usuário ou para o sistema como um todo.

No Windows XP e posterior, quando o gerenciador de objetos pesquisa um nome em \DosDevices, ele primeiro pesquisa o diretório local \DosDevices e, em seguida, o diretório global \DosDevices . Se o nome existir em ambos os lugares, o nome local sombreia o nome global.

No Windows 2000, sempre que uma nova sessão de servidor de terminal é iniciada, o sistema cria o diretório local \DosDevices copiando o diretório global \DosDevices . As alterações subsequentes no diretório global não são propagadas para o diretório local.

Um driver que deve criar seus nomes de dispositivo MS-DOS no diretório global \DosDevices pode fazer isso criando seus links simbólicos em uma rotina padrão de driver que possui garantia de execução em um contexto de thread do sistema, como DriverEntry. Como alternativa, o diretório global \DosDevices está disponível como \DosDevices\Global; os drivers podem usar um nome do \DosDevices\Global\DosDeviceName para especificar um nome no diretório global.

Observe que \DosDevices\Global não existe em plataformas que não dão suporte a versões locais e globais de \DosDevices, como o Windows 98/Me. O exemplo de código a seguir cria um link simbólico global que funciona no Windows 98/Me, bem como no Windows 2000 e em sistemas operacionais posteriores:

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

Um driver pode criar os nomes de dispositivo MS-DOS em diretórios locais \DosDevices ao criar o link simbólico em resposta a um IOCTL. Quando uma thread em um contexto de DosDevices local específico envia o IOCTL, o DispatchDeviceControl do driver é chamado dentro do contexto de thread atual.

Para obter mais informações sobre o contexto em que uma rotina de driver padrão é executada, consulte Rotinas de Expedição e IRQLs.

O sistema distingue os diretórios locais \DosDevices da seguinte maneira:

  • No Windows XP e posterior, os diretórios locais \DosDevices são identificados pela AuthenticationID para o token de acesso da sessão de logon. Para obter mais informações sobre a AuthenticationID, consulte a descrição da estrutura de TOKEN_STATISTICS na documentação do SDK do Microsoft Windows.

  • No Windows 2000, os diretórios locais \DosDevices são identificados pela SessionId para a sessão do servidor de terminal. Para obter mais informações sobre o SessionId, consulte a descrição da estrutura de WTS_SESSION_INFO na documentação do SDK do Windows.

O Windows NT 4.0 Terminal Server Edition dá suporte a diretórios locais \DosDevices exatamente da mesma maneira que o Windows 2000.