2

我需要将引导管理器映射到一个分区号:

 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,但没有发现任何有用的东西。我需要将引导管理器分区与 100 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 语言开发我的应用程序,因此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);

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

4

2 回答 2

4

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

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

于 2013-03-12T16:37:46.850 回答
0

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

您可以尝试通过发送 IOCTL 代码来找到 BootIndicator 分区,例如PARTITION_INFORMATION_EX真正的解决方案。

于 2018-06-22T17:14:13.653 回答