Некоторые API, которые поддерживают абсолютный путь к пространству имен NT в формате «\ Device \ Xxx» - PullRequest
2 голосов
/ 23 августа 2010

В этом документе http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths

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

Что такое API? Дайте мне знать некоторые такие функции, пожалуйста.


Например, у нас может быть устройство, находящееся в пространстве имен GLOBAL??:

GLOBAL??\
   COM227

Это устройство мы можем успешно открыть, используя CreateFile:

//Note: we have to prefix it with \\.\ in order to tell CreateFile that
//we want to open something from the Global device namespace.
//Otherwise it will try to open a file
HANDLE hdev = CreateFile("\\.\COM227", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
   raise new EWin32Exception(GetLastError);

Это устройство (вместе со всеми другими устройствами в пространстве имен Win32 Global ?? ), фактически символическая ссылка на "настоящее" устройство:

GLOBAL??\
   COM227 (SymbolicLink) ==> \Device\VCP0
Device\
   VCP0  (Device)

Итак, мы пытаемся открыть это реальное устройство:

HANDLE hdev = CreateFile("\\.\Device\VCP0", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
   raise new EWin32Exception(GetLastError);

Но происходит ошибка с кодом ошибки 3 (система не может найти указанный файл).

Short:

  • Работает : COM227 (псевдоним \Device\VCP0)
  • Сбой : \Device\VCP0

Проблема в том, что

Это означает, что CreateFile является , а не одним из "API, которые поддерживают формат абсолютного пути пространства имен NT \ Device \ Xxx" .

Однако для этого устройства можно открыть дескриптор, используя любые API, которые поддерживают абсолютный путь к пространству имен NT в формате «\ Device \ Xxx».

Какие являются API?

Ответы [ 3 ]

3 голосов
/ 01 мая 2014

Ответы, представленные до сих пор, в лучшем случае вводят в заблуждение. Они не отвечают на ваш вопрос и не охватывают важное различие между пространством имен NT и другими пространствами имен.

При доступе к пространству имен NT вам необходимо использовать вызовы API, начинающиеся с Nt, например NtOpenFile, если вы хотите получить доступ к устройствам, которые находятся только в пространстве имен NT ядра. Например, устройство в \ Devices без символической ссылки в \ GLOBAL ??.

Другие вызовы, упомянутые выше, работают нормально, если вы обращаетесь к пространству имен устройства Win32, но для этого требуется, чтобы драйвер создал символическую ссылку в этом пространстве имен.

Если вы хотите получить доступ к устройству, которое находится только в пространстве имен NT, используйте NtOpenFile . Это действительно очень старый API-вызов, и он входит и выходит из заголовочных файлов пользовательского пространства. Он снова доступен и работает просто отлично.

1 голос
/ 25 августа 2010

Бенджамин -

  1. Простой факт заключается в том, что вы МОЖЕТЕ открыть «файл специального устройства» в Windows, так же, как вы делаете * nix. Это то, что я пытался сказать в своем первоначальном ответе. Я поддерживаю все, что я сказал в своем первом посте. И я считаю, что ссылка MSDN, на которую я ссылался, тоже очень хорошо объясняет это.

  2. Синтаксис для файла устройства * nix: "/ dev / SOME_DEVICE". Несколько устройств (условно, не обязательно) различаются как "/ dev / SOME_DEVICE0", "/ dev / SOME_DEVICE1" и т. Д. Файлы устройств также могут быть "псевдонимами" с использованием * nix "символических ссылок".

  3. Синтаксис для файла устройства Windows - это UNC-имя. Я уверен, что вы знакомы с общими ресурсами UNC (например, "\\ myserver \ c $"). Во всех примерах, которые мы обсуждали выше, сервер является локальным хостом. Следовательно "\\. \ SOME_RESOURCE_NAME".

Это действительно так просто.

И это работает.

Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы.

Заранее спасибо .. PSM

1 голос
/ 23 августа 2010

Концепция обработки «устройства» как «файла» распространена в * nix (Unix, Linux, Mac OS и т. Д.).

По сути, статья MSDN означает, что любой Win32 API, открывающий «файл» (либо файл на локальном диске, либо ресурс UNC), может так же легко открыть «специальное устройство».

Пара примеров:

http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx

  CreateFile
  WriteFile
  ReadFile
  CloseHandle
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...