Прежде всего, вы должны заметить, что VBR на разделе C: не участвует в процессе загрузки. VBR в "системном" разделе загружает bootmgr, который загружает ядро Windows из раздела C:.
Я только что попробовал это сам. Удобно оказалось, что при запуске bcdboot создается новая загрузочная запись в BCD, поэтому мы можем легко сравнить старую запись с новой, чтобы увидеть, что изменилось.
Используя bcdedit, мы видим, что параметры device и osdevice разные:
C:\Windows\system32>bcdedit /enum /v
Windows Boot Manager
--------------------
identifier {9dea862c-5cdd-4e70-acc1-f32b344d4795}
device partition=\Device\HarddiskVolume1
description Windows Boot Manager
locale en-us
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
default {fde483f1-1482-11e2-90a1-00505698002c}
resumeobject {fde483f0-1482-11e2-90a1-00505698002c}
displayorder {fde483f1-1482-11e2-90a1-00505698002c}
{7409376c-f38e-11e1-bc89-00505698002c}
toolsdisplayorder {b2721d73-1db4-4c62-bf78-c548a880142d}
timeout 30
Windows Boot Loader
-------------------
identifier {fde483f1-1482-11e2-90a1-00505698002c}
device partition=C:
path \Windows\system32\winload.exe
description Windows 7
locale en-us
inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
osdevice partition=C:
systemroot \Windows
resumeobject {fde483f0-1482-11e2-90a1-00505698002c}
nx OptIn
detecthal Yes
Windows Boot Loader
-------------------
identifier {7409376c-f38e-11e1-bc89-00505698002c}
device unknown
path \Windows\system32\winload.exe
description Windows 7
locale en-US
inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
recoverysequence {7409376d-f38e-11e1-bc89-00505698002c}
recoveryenabled Yes
osdevice unknown
systemroot \Windows
resumeobject {7409376b-f38e-11e1-bc89-00505698002c}
nx OptIn
К сожалению, bcdedit не сообщает нам, как хранится информация, поэтому нам придется посмотреть сам файл BCD. Как вы, возможно, уже знаете, файл BCD на самом деле является кустом реестра, и обычно он загружается в HKLM\BCD00000000
, поэтому мы можем проверить его с помощью regedit или reg reg.
Идентификатором для каждой записи является имя раздела реестра, содержащего настройки. Сами настройки являются подразделами, расположенными в том же порядке, в котором они отображаются в выводе bcdedit. Оказывается (неудивительно), что в каждой записи устройство и osdevice содержат одни и те же данные, и эти данные для функциональной записи отличаются от старой.
На моей системе это появляется в работающей записи:
"Element"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,00,00,00,00,\
00,00,00,48,00,00,00,00,00,00,00,00,00,80,06,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,01,00,00,00,b0,5d,de,33,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
и это появляется в старой записи:
"Element"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,00,00,00,00,\
00,00,00,48,00,00,00,00,00,00,00,00,00,50,06,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,01,00,00,00,b0,5d,de,33,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
Есть только одно отличие. Давайте отформатируем старую запись немного более красиво:
0000 00,00,00,00,00,00,00,00,
0008 00,00,00,00,00,00,00,00,
0010 06,00,00,00,00,00,00,00,
0018 48,00,00,00,00,00,00,00,
0020 00,00,50,06,00,00,00,00,
0028 00,00,00,00,00,00,00,00,
0030 00,00,00,00,01,00,00,00,
0038 b0,5d,de,33,00,00,00,00,
0040 00,00,00,00,00,00,00,00,
0048 00,00,00,00,00,00,00,00,
0050 00,00,00,00,00,00,00,00
В новой записи байт 0x0022 равен 0x80 вместо 0x50. Как оказалось, я переместил раздел на 3 МБ, поэтому я подозреваю, что это часть смещения. Давайте посмотрим, что произойдет, если я переместу его еще на 4 МБ (всего 7 МБ) и создам новую запись BCD, не так ли? Хорошо ... 0x80 становится 0xC0, так что это соответствует.
Разумным предположением будет то, что восемь байтов (или, может быть, шестнадцать?) начиная с 0x0020 - байтовое смещение начала раздела. Значение 0x06C00000 равно 113246208 или точно 108 МБ; исследуя таблицу разделов, я обнаружил, что это действительно начало раздела. QED. :-)