2

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);

より簡単な回避策のアイデアはありますか?

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 に答える