Поделиться через


Локальные и глобальные имена устройств 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.