Boot Manager をパーティション番号にマップする必要があります。
Manufacturer Recovery partition = Partition 0
Boot manager = Partition 1
C:\ = Partition 2
D:\ = Partition 3
C:\ や D:\ などのマウントされたパーティションの場合、IOCTL_STORAGE_GET_DEVICE_NUMBERを使用してパーティション番号を取得します。
ここで、Windows ブート マネージャーの番号を取得するために同様のことをしたいと思います。BootMgr が 100 MB のパーティションであるか、システム パーティションの前であるとは想定できません。
ディスク ジオメトリに関連する IOCTLを調べましたが、有用なものは見つかりませんでした。Boot Manager パーティションを、たとえば 100 MB のメーカーの Recovery パーティションと区別する必要があります。
BCDEDIT.exe ツールは必要な情報を表示します。
Identificador {bootmgr}
device partition=\Device\HarddiskVolume1
description Windows Boot Manager
locale es-ES
inherit {globalsettings}
extendedinput Yes
default {current}
resumeobject {5586dd33-361b-11e0-8df8-0018716eb820}
displayorder {current}
toolsdisplayorder {memdiag}
timeout 30
customactions 0x1000085000001
0x5400000f
custom:5400000f {1f473c8f-0c00-11e1-898d-78acc0c157a7}
私は C でアプリを開発しているため、BCDEDIT アプローチは、比較的単純なアプリケーションに COM/WMI 依存関係を含めることを意味します。
ここでは、WMI から取得した "\Device\HarddiskVolume1" を使用して BootMgr パーティションへのハンドルを開き、次に IOCTL_STORAGE_GET_DEVICE_NUMBER を使用することについて話していることに注意してください。
hHandle = CreateFile ("\\\\?\\GLOBALROOT\\Device\\HarddiskVolume1",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( hHandle != INVALID_HANDLE_VALUE )
{
VOLUME_DISK_EXTENTS diskExtents;
DWORD dwSize;
BOOL iRes;
iRes = DeviceIoControl(hHandle,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
(LPVOID) &diskExtents,
(DWORD) sizeof(diskExtents),
(LPDWORD) &dwSize,
NULL);
if (iRes)
{
STORAGE_DEVICE_NUMBER deviceNumber;
DWORD bytesReturned = 0;
iRes = DeviceIoControl(hHandle,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL,
0,
&deviceNumber,
sizeof(deviceNumber),
&bytesReturned, NULL);
より簡単な回避策のアイデアはありますか?