Локальные и глобальные имена устройств MS-DOS
Оси Microsoft Windows 2000 и более поздних версий операционной системы на основе Windows поддерживают несколько версий каталога DosDevices .
В этих операционных системах существует один глобальный каталог \DosDevices и несколько локальных каталогов \DosDevices. Глобальный каталог \DosDevices содержит имена устройств MS-DOS, видимые на уровне системы. Локальный каталог \DosDevices содержит имена устройств MS-DOS, видимые только в определенном локальном контексте DosDevices.
Локальные контексты DosDevices приведены следующим образом.
В Windows XP и более поздних версиях каждый сеанс входа имеет собственный локальный контекст DosDevices . Системные потоки и все потоки, работающие в качестве пользователя LocalSystem, не выполняются в локальном контексте DosDevices .
В Windows 2000 каждый сеанс сервера терминала имеет собственный локальный контекст DosDevices . Любой поток, выполняющийся в рамках сеанса консоли, не выполняется в локальном контексте DosDevices .
Каждый поток имеет текущий контекст DosDevices , который может измениться в течение всего времени существования потока. Поток, который не выполняется в локальном контексте DosDevices, как сообщается, выполняется в глобальном контексте DosDevices. Таким образом, системная учетная запись выполняется в глобальном контексте DosDevices .
Если поток работает в локальном контексте DosDevices , все созданные им имена устройств MS-DOS создаются только в локальном каталоге DosDevices . Таким образом, потоки, работающие в локальном контексте DosDevices, не могут повлиять на имена устройств MS-DOS, которые видны потокам, работающим в другом локальном контексте DosDevices или в глобальном контексте DosDevices. Например, если пользователь в Windows XP или более поздней версии подключает сетевой диск как X:, это не влияет на значение X: для любого другого пользователя или для системы в целом.
В Windows XP и более поздних версиях, когда диспетчер объектов ищет имя в \DosDevices, сначала выполняет поиск локального каталога \DosDevices, а затем глобального каталога \DosDevices. Если имя существует в обоих местах, локальное имя тени глобального имени.
В Windows 2000 при каждом запуске нового сеанса сервера терминала система создает локальный каталог \DosDevices, копируя глобальный каталог \DosDevices. Любые последующие изменения глобального каталога не распространяются в локальный каталог.
Драйвер, который должен создавать имена устройств MS-DOS в глобальном каталоге \DosDevices , может сделать это, создавая символьные ссылки в стандартной подпрограмме драйвера, которая гарантированно выполняется в контексте системного потока, например DriverEntry. Кроме того, глобальный каталог \DosDevices доступен как \DosDevices\Global; драйверы могут использовать имя \DosDevices\Global\DosDeviceName, чтобы указать имя в глобальном каталоге.
Обратите внимание, что \DosDevices\Global не существует на платформах , которые не поддерживают локальные и глобальные версии \DosDevices, такие как Windows 98/Me. В следующем примере кода создается глобальная символьная ссылка, которая работает в Windows 98/Me, а также в операционных системах Windows 2000 и более поздних версий:
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. */
}
Драйвер может создавать имена устройств MS-DOS в локальных каталогах \DosDevices , создав символьную ссылку в ответ на IOCTL. Когда поток в определенном локальном контексте DosDevices отправляет IOCTL, драйвер DispatchDeviceControl вызывается из текущего контекста потока.
Дополнительные сведения о контексте, в котором выполняется стандартная подпрограмма драйвера, см. в разделе "Подпрограммы отправки" и irQLs.
Система различает локальные каталоги \DosDevices следующим образом:
В Windows XP и более поздних версиях локальные каталоги \DosDevices определяются идентификатором authenticationID для маркера доступа сеанса входа. Дополнительные сведения о authenticationID см. в описании структуры TOKEN_STATISTICS в документации по пакету SDK для Microsoft Windows.
В Windows 2000 локальные каталоги \DosDevices определяются сеансом сеанса для сеанса сервера терминала. Дополнительные сведения о SessionId см. в описании структуры WTS_SESSION_INFO в документации по пакету SDK для Windows.
Windows NT 4.0 Terminal Server Edition поддерживает локальные каталоги \DosDevices точно так же, как и Windows 2000.