\??
- это каталог виртуальных объектов ядра, в котором диспетчер объектов ищет локальные и глобальные символические ссылки устройства DOS. Сначала он проверяет локальные ссылки на устройства DOS для сеанса входа пользователя в \Sessions\0\DosDevices\[Logon_AuthenticationId]
. Затем он проверяет ссылки на глобальные устройства DOS в \Global??
. Еще в старые времена NT использовал один каталог \DosDevices
. В настоящее время \DosDevices
является ссылкой на \??
. Кроме того, в каждом локальном каталоге устройств DOS есть ссылка «Глобальная», чтобы разрешить доступ к глобальным устройствам, когда локальное устройство затеняет глобальное (например, \\?\Global\Z:
) или разрешить драйверу устройства создавать глобальное устройство, если оно не выполняется в системе нить.
В пользовательском режиме библиотека времени выполнения в файле ntdll.dll преобразует полностью определенный путь DOS / Windows к пути NT путем добавления \??\
для буквы диска или замены ведущего \\
Путь UNC с \??\UNC\
- за исключением путей \\?\
и \\.\
локального устройства просто заменяется на \??\
. Но сначала путь устройства \\.\
претерпевает некоторую предварительную обработку, например, разрешение «.». и "..", тогда как \\?\
обходит все предварительную обработку пользовательского режима.
Например, обычно \\?\C:\Windows
преобразуется в \??\C:\Windows
, который разрешает \Global??\C:\Windows
. Устройство DOS с буквой «C:» является символической ссылкой на устройство громкости NT. Конечная цель зависит от системы. Например, конечный путь NT может разрешить \Device\HarddiskVolume2\Windows
.
Соединения устройств DOS, такие как Volume{00000000-0000-0000-0000-000000000000}
, создаются диспетчером точки монтирования. Это клей между постоянными буквами дисков, точками монтирования NTFS и используемым в данный момент устройством тома NT, например \Device\HarddiskVolume2
.
Насколько я могу понять, оба \\?\
и \??\
относятся к локальному пространству имен локальных DOS-устройств, но действительны в разных контекстах.
\\?\
имеет смысл только для Win32, а не к ядру, за исключением того, что в некоторых особых случаях (например, при обработке точек соединения) ядро будет переводить пути Win32 обратно в пути ядра по мере необходимости.
\??\
имеет смысл как для ядра, так и для Win32 , однако большинство приложений Win32 (включая cmd.exe) не понимают этого.
В конкретных примерах OP: точки соединения и точки монтирования могут содержать либо пути Win32, либо ядра, но обычно содержат пути ядра и dir
просто представляет исходное содержимое без изменений. Предполагается, что WMIC намеренно преобразует путь ядра в путь Win32 или получает данные от функции API, которая делает это.