WINAPI: получить список устройств по их имени NT - PullRequest
2 голосов
/ 10 ноября 2010

В этой статье объясняется, как запрашивать логические имена DOS для их соглашения об именах NT, используя QueryDosDevice . В нем объясняется, как добавлять и удалять имена логических устройств с помощью соглашения об именах NT, используя DefineDosDevice . В статье объясняется, что имя DOS требуется для доступа к различным устройствам.

"Программы Win32 не могут использовать внутренние Имена устройств Windows NT для доступа устройства, потому что подсистема Win32 и Win32 API требуют больше знакомые буквы дисков и MS-DOS имена устройств, такие как A :, C :, COM1 :, и LPT1 "

Я нашел эту интересную статью , которая получает все доступные имена DOS и затем запрашивает имя NT, используя функцию GetLogicalDriveString . В этой статье не объясняется, как вернуть все определенные имена DOS для устройств, только диски.

Однако я хотел бы знать, как сделать обратное. Как бы я получить список имен устройств NT. Я не ищу только диски, но все устройства. Например, LPT1 и COM1 являются зарезервированными именами DOS, которые соответствуют определенным именам NT. Я хотел бы сопоставить дополнительные устройства, у которых может не быть имени DOS, чтобы я мог использовать функцию WINAPI CreateFile .

Как получить список всех имен устройств NT, противоположных именам DOS?

Ответы [ 3 ]

5 голосов
/ 10 ноября 2010

Под капотом DosDevice находятся символические ссылки в базе данных NT Object Manager, указывающие на базовые устройства.Я бы порекомендовал поиграть с WinObj , чтобы понять, как все складывается.

К сожалению, чтобы выполнить перечисление самостоятельно и добавить свои собственные символические ссылки, вам потребуется использовать нативный apis NT (см. this для abit по перечислению).Иногда вы можете поиграть в некоторые трюки с функцией DefineDosDevice, чтобы выполнить некоторые сопоставления, однако вам на самом деле не нужно делать это, если вы просто хотите получить доступ к объектам через CreateFile.Вы можете использовать собственный синтаксис escape NT для доступа к чему-либо в базе данных NT Object Manager, просто добавьте префикс к своему native пути с \\?\GLOBALROOT и передайте его в CreateFile, например, если вы хотите получить доступ к дисководу гибких дисков.CreateFile(L"\\?\GLOBALROOT\Device\Floppy0", ...);

0 голосов
/ 10 ноября 2010

API, который вы ищете - WMI.Кстати, на это уже был дан ответ: Как мне перечислить типы устройств с помощью WMI?

0 голосов
/ 10 ноября 2010

Документы для QueryDosDevice упоминание:

lpDeviceName - Этот параметр может быть НЕДЕЙСТВИТЕЛЕН. В этом случае функция QueryDosDevice сохранит список всех существующих имен устройств MS-DOS в буфер, на который указывает lpTargetPath.

lpTargetPath - Если lpDeviceName имеет значение NULL, функция извлекает список всех существующих имен устройств MS-DOS. Каждая строка с нулевым символом в конце, хранящаяся в буфере, является именем существующего устройства MS-DOS, например, \ Device \ HarddiskVolume1 или \ Device \ Floppy0.

Итак, вы пытались сделать:

QueryDosDevice(NULL, buffer, buffer_size);

Это должно получить список имен устройств в буфере.

...