在Windows Vista及更高版本上检索BootMgr的分区号

时间:2013-03-12 12:46:30

标签: windows hard-drive bootloader

我需要将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分区或以前的系统分区。

我看过IOCTLs related to disk geometry,但我找不到任何有用的东西。我需要区分引导管理器分区,比如1​​00 MB制造商恢复分区。

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开发我的应用程序,因此the BCDEDIT approach implies to include a 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);

有关更简单的解决方法的任何想法吗?

2 个答案:

答案 0 :(得分:4)

通过查看注册表,您可以找到系统卷(Windows启动的位置以及bootmgr所在的位置):HKLM\SYSTEM\Setup\SystemPartition。这将包含 \ Device \ HardDiskVolume1 之类的名称。

在由Windows 7安装程序格式化的磁盘上,这对应于在包含驱动器C:的分区之前启动的100MB分区。在Windows 7上,包含驱动器C:的大分区是 \ Device \ HardDiskVolume2

答案 1 :(得分:0)

也许为时已晚,但是此信息可以帮助某人;

您可以尝试通过发送IOCTL代码(例如PARTITION_INFORMATION_EX)来找到BootIndicator分区,以获取实际解决方案。