Partilhar via


Nomes de dispositivos MS-DOS locais e globais

O Microsoft Windows 2000 e as versões posteriores do sistema operativo baseado no 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 local\DosDevices . O diretório global \DosDevices contém os MS-DOS nomes de dispositivos visíveis em todo o sistema. Um diretório local \DosDevices contém MS-DOS nomes de dispositivos que são visíveis apenas em um contextolocalDosDevices específico.

Os contextos locais de DosDevices são os seguintes.

  • No Windows XP e versões posteriores, cada sessão de logon tem seu próprio contexto DosDevices local. Os threads do sistema e qualquer thread que esteja sendo executado como o usuário LocalSystem não são executados em um contexto DosDevices local.

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

Cada thread tem um contexto DosDevices atual, que pode mudar ao longo da vida útil de um thread. Um thread que não é executado em contexto local DosDevices diz-se que é executado no contextoglobalDosDevices. Assim, a conta do sistema é executada no contexto global DosDevices .

Se um thread estiver sendo executado em um contexto DosDevices local, todos os nomes de dispositivos MS-DOS criados serão criados somente no diretório DosDevices local. Deste modo, threads que estão a ser executadas num contexto DosDevices local não podem afetar os nomes de dispositivos MS-DOS que são visíveis para threads que estão a ser executadas noutro contexto DosDevices local ou no contexto DosDevices global. 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 versões posteriores, quando o gerenciador de objetos procura um nome em \DosDevices, ele primeiro pesquisa o diretório \DosDevices local e, em seguida, o diretório global \DosDevices . Se o nome existir em ambos os locais, o nome local sombreia o nome global.

No Windows 2000, sempre que uma nova sessão do servidor de terminal é iniciada, o sistema cria o diretório \DosDevices local copiando o diretório global \DosDevices . Quaisquer 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 de driver padrão que é garantida para ser executada 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 \ DosDevices\Global\DosDeviceName para especificar um nome no diretório global.

Observe que \DosDevices\Global não existe em plataformas que não suportam 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 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 nomes de dispositivos MS-DOS em diretórios \DosDevices locais criando o link simbólico em resposta a um IOCTL. Quando um thread em um contexto DosDevices local específico envia o IOCTL, o DispatchDeviceControl do driver é chamado de dentro do contexto de thread atual.

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

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

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

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

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