Nomes de dispositivos MS-DOS locais e globais
O Microsoft Windows 2000 e versões posteriores do sistema operacional 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 \DosDevices locais. O diretório global \DosDevices contém os nomes de dispositivos do MS-DOS que são visíveis em todo o sistema. Um diretório \DosDevices local contém nomes de dispositivos MS-DOS que são visíveis apenas em um contexto DosDevices local específico.
Os contextos locais de DosDevices são os seguintes.
No Windows XP e posterior, 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 em execução como parte da sessão do console não é executado em um contexto DosDevices local.
Cada thread tem um contexto DosDevices atual, que pode ser alterado ao longo do tempo de vida de um thread. Um thread que não é executado em um contexto DosDevices local é considerado executado no contexto DosDevices global. Assim, a conta do sistema é executada no contexto global de DosDevices .
Se um thread estiver em execução em um contexto DosDevices local, todos os nomes de dispositivo MS-DOS criados serão criados somente no diretório DosDevices local. Assim, os threads que estão sendo executados em um contexto DosDevices local não podem afetar os nomes de dispositivo MS-DOS que são visíveis para threads que estão sendo executados em outro 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 posterior, 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 lugares, o nome local sombreará 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 de \DosDevices\Global\DosDeviceName para especificar um nome no diretório global.
Observe que \DosDevices\Global não existe em plataformas que não oferecem suporte a versões locais e globais de \DosDevices, como Windows 98/Me. O exemplo de código a seguir cria um link simbólico global que funciona no Windows 98/Me, bem como nos sistemas operacionais Windows 2000 e 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 dispositivo 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 expedição e IRQLs.
O sistema distingue os diretórios \DosDevices locais da seguinte maneira:
No Windows XP e posterior, 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.
O Windows NT 4.0 Terminal Server Edition oferece suporte a diretórios \DosDevices locais exatamente da mesma maneira que o Windows 2000.