Пространство имен Windows


Существует две основные категории соглашений о пространствах имен, используемых в API-интерфейсах Windows, обычно называемые пространствами имен NT и пространствами имен Win32. Пространство имен NT было разработано как пространство имен самого низкого уровня, на котором могли существовать другие подсистемы и пространства имен, включая подсистему Win32 и, в целом, пространства имен Win32. POSIX - это еще один пример подсистемы в Windows, построенной поверх пространства имен NT. Ранние версии Windows также определяли несколько предопределенных или зарезервированных имен для определенных специальных устройств, таких как порты связи (последовательные и параллельные) и консоль отображения по умолчанию, как часть пространства имен устройства NT, и по-прежнему поддерживаются в текущих версиях Windows для обратной совместимости.

Пространства имен файлов Win32

Обратите внимание, что эти примеры работы использования с функциями API Windows не обязательно работают с приложениями оболочки Windows, такими как проводник Windows. По этой причине существует более широкий диапазон возможных путей, чем обычно доступно из приложений оболочки Windows, и приложения Windows, которые используют это преимущество, могут быть разработаны с использованием этих соглашений о пространствах имен.

Для файлового ввода и вывода,"\\?\ "префикс строки пути указывает API-интерфейсам Windows отключить весь разбор строк и отправить строку, которая следует за ним прямо в файловую систему. Например, если файловая система поддерживает большие пути и имена файлов, можно превысить ограничения MAX_PATH, которые в противном случае применяются API-интерфейсами Windows. Дополнительные сведения об ограничении нормального максимального пути смотри в предыдущей статье.

Потому что он отключает автоматическое расширение строки пути,"\\?\ "префикс также позволяет использовать".." и." "в именах путей, которые могут быть полезны, если вы пытаетесь выполнить операции с файлом с этими в противном случае зарезервированными описателями относительного пути как часть полного пути. Многие, но не все API ввода/вывода поддерживают"\\?\ "; чтобы быть уверенным, вы должны посмотреть справочный раздел для каждого API.

Пространства имен устройств Win32

“\\.\ "префикс дает доступ к пространству имен устройств Win32 вместо пространства имен файлов Win32. Таким образом, доступ к физическим дискам и томам осуществляется напрямую, без использования файловой системы, если API поддерживает этот тип доступа. Таким образом можно получить доступ ко многим устройствам, кроме дисков (например, с помощью функций CreateFile и DefineDosDevice).

Например, если вы хотите открыть последовательный порт связи системы 1, Вы можете использовать "COM1" в вызове функции CreateFile. Это работает, потому что COM1-COM9 являются частью зарезервированных имен в пространстве имен NT, хотя с помощью"\\.\ "префикса все также будет работать с этими именами устройств. Для сравнения, если у вас установлена 100-Портовая плата последовательного расширения и вы хотите открыть COM56, Вы не можете открыть ее с помощью "COM56", потому что нет предопределенного пространства имен NT для COM56. Вам нужно будет открыть его с помощью"\\.\ COM56 "потому что"\\.\ "переходит непосредственно в пространство имен устройства, не пытаясь найти предопределенный псевдоним.

Другой пример использования пространства имен устройств Win32 - использование функции CreateFile с"\\.\PhysicalDiskX" (где x-действительное целое число) или "\\.\CdRomX". Это позволяет получить доступ к этим устройствам напрямую, минуя файловую систему. Это работает, потому что эти имена устройств создаются системой, поскольку эти устройства перечисляются, и некоторые драйверы также создают другие псевдонимы в системе. Например, драйвер устройства, реализующий имя " c:\", имеет собственное пространство имен, которое также является файловой системой.

API-интерфейсы, которые проходят через функции createfile, как правило, работают с "\\.\ "префиксом, потому что CreateFile-это функция, используемая для открытия файлов и устройств, в зависимости от используемых параметров.

Если вы работаете с функциями API Windows, вы должны использовать"\\.\ "префикс только для устройств доступа, а не для файлов. Большинство API не поддерживают"\\.\"; распознавать его будут только те, которые предназначены для работы с пространством имен устройства. Всегда проверяйте справки для каждого API, чтобы быть уверенным.

Пространства имен NT

Есть также API, которые позволяют использовать соглашение о пространстве имен NT, но Диспетчер объектов Windows делает это ненужным в большинстве случаев. Для иллюстрации, это полезно для просмотра пространств имен Windows в обозревателе объектов системы с помощью Windows утилиты sysinternals утилиту WinObj. Когда вы запустите этот инструмент, что вы видите, является пространством имен НТ, начиная с корневого, или "\". Подпапка под именем "Global??" где находится пространство имен Win32.

Именованные объекты устройства будут находиться в пространстве имен NT в «устройство» подкаталог. Здесь вы также можете найти Serial0 и Serial1, объектов устройства, представляющее первые два com-порта, если они присутствуют на вашей системе. Объект устройства, представляющий том, будет что-то вроде "HarddiskVolume1", хотя числовой суффикс может отличаться. Имя " DR0 "в подкаталоге" Harddisk0 " является примером объекта устройства, представляющего диск и так далее.

Чтобы сделать эти объекты устройств доступными для приложений Windows, драйверы устройств создают символическую ссылку (символическую ссылку) в пространстве имен Win32 " Global?? "для их устройства объектов. Например, COM0 и COM1 в разделе " Global?? "подкаталог просто симлинки на Serial0 и Serial1, "С:" - это симлинк на HarddiskVolume1, "Physicaldrive0" - это симлинк на DR0, и так далее. Без символической ссылки указанное устройство " Xxx " не будет доступно ни одному приложению Windows, использующему соглашения о пространстве имен Win32, как описано выше. Однако дескриптор может быть открыт для этого устройства с помощью любых API, которые поддерживают абсолютный путь пространства имен NT формата "\Device\Xxx".

С добавлением многопользовательской поддержки через службы терминалов и виртуальные машины возникла необходимость виртуализации корневого устройства в рамках всей системы в пространстве имен Win32. Это было сделано путем добавления символьной ссылки с именем "GLOBALROOT" в пространство имен Win32, которое вы можете увидеть в " Global??"подкаталоге и можете получить доступ через путь"\\?\GLOBALROOT". Этот префикс гарантирует, что следующий за ним путь будет выглядеть в истинном корневом пути System object manager, а не в пути, зависящем от сеанса.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, windows, пространство имен, теория




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Улитка Паскаля на C++ с поворотом и анимацией
Программа шутка "Не меняй!"
VirtualBox и Ubuntu: советы