Получить handle EFI system partition
От: dwebster Россия  
Дата: 07.11.17 11:10
Оценка:
Привет,

Встала задача получить хэндл EFI system partition.
Т.е. нужно получить Device Path для данного partition, передать его в CreateFile и получить хэндл.
Загвоздка на этапе получения Device Path. Пробовал четыре способа, ни один не помог.

#1 — Win32 — FindFirstVolume/FindNextVolume — ESP не энумерирует.

#2 — SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail
Сходно с #1. ESP игнорирует

#3 — CM_Get_Device_ID_List_Size, CM_Get_Device_ID_List, CM_Locate_DevNode, CM_Locate_DevNode
ESP в результатах есть, нo не удалось извлечь DevicePath, который CreateFile приняла бы (Invalid Parameter)

#4 – SetupDiGetClassDevs, SetupDiEnumDeviceInfo, SetupDiCreateDeviceInterface, SetupDiGetDeviceInterfaceDetail
Аналогично #3

Кто-нибудь знает правильный способ получить хэндл из user mode?
Re: Получить handle EFI system partition
От: rumit7  
Дата: 07.11.17 11:46
Оценка:
Здравствуйте, dwebster, Вы писали:

D>Привет,

D>...
D>#3 — CM_Get_Device_ID_List_Size, CM_Get_Device_ID_List, CM_Locate_DevNode, CM_Locate_DevNode
D>ESP в результатах есть, нo не удалось извлечь DevicePath, который CreateFile приняла бы (Invalid Parameter)
D>...
D>Кто-нибудь знает правильный способ получить хэндл из user mode?

так пробовали?
Re[2]: Получить handle EFI system partition
От: dwebster Россия  
Дата: 07.11.17 11:50
Оценка:
Здравствуйте, rumit7, Вы писали:

R>так пробовали?


Да, это #3 и есть.

Выдает список в виде

\Device\HarddiskVolume2
\Device\HarddiskVolume3
.....

Но эти пути не пригодны для передачи в CreateFile (invalid parameter)
Re[3]: Получить handle EFI system partition
От: rumit7  
Дата: 07.11.17 11:52
Оценка: 10 (1)
Здравствуйте, dwebster, Вы писали:

D>Здравствуйте, rumit7, Вы писали:


R>>так пробовали?


D>Да, это #3 и есть.


D>Выдает список в виде


D>\Device\HarddiskVolume2

D>\Device\HarddiskVolume3
D>.....

D>Но эти пути не пригодны для передачи в CreateFile (invalid parameter)


а если скормить NtOpenFile как на SO?

UPD. вот здесь тоже вроде рабочий пример, не могу к сожалению проверить
Отредактировано 07.11.2017 13:18 rumit7 . Предыдущая версия .
Re[3]: Получить handle EFI system partition
От: Conr Россия  
Дата: 07.11.17 14:10
Оценка: 14 (2)
Здравствуйте, dwebster, Вы писали:

D>\Device\HarddiskVolume2

D>\Device\HarddiskVolume3
D>.....

D>Но эти пути не пригодны для передачи в CreateFile (invalid parameter)

Добавьте GLOBALROOT:
\\?\GLOBALROOT\Device\HarddiskVolume2
\\?\GLOBALROOT\Device\HarddiskVolume3

auto handle = CreateFile ("\\\\?\\GLOBALROOT\\Device\\HarddiskVolume2", 
                        GENERIC_READ|GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE, 
                        NULL, 
                        OPEN_EXISTING, 
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
Re[4]: Получить handle EFI system partition
От: dwebster Россия  
Дата: 07.11.17 16:54
Оценка:
Здравствуйте, Conr, Вы писали:

C>Добавьте GLOBALROOT:

C>\\?\GLOBALROOT\Device\HarddiskVolume2
C>\\?\GLOBALROOT\Device\HarddiskVolume3

C>
C>auto handle = CreateFile ("\\\\?\\GLOBALROOT\\Device\\HarddiskVolume2", 
C>                        GENERIC_READ|GENERIC_WRITE,
C>                        FILE_SHARE_READ|FILE_SHARE_WRITE, 
C>                        NULL, 
C>                        OPEN_EXISTING, 
C>                        FILE_ATTRIBUTE_NORMAL,
C>                        NULL);
C>


Действительно. Спасибо! )
Re[4]: Получить handle EFI system partition
От: dwebster Россия  
Дата: 07.11.17 18:41
Оценка:
Здравствуйте, rumit7, Вы писали:

R>а если скормить NtOpenFile как на SO?


R>UPD. вот здесь тоже вроде рабочий пример, не могу к сожалению проверить


Да, так тоже работает. Но способ с добавлением GLOBALROOT, предложенный Conr, проще
Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.