enum BcdDeviceType {
kBcdDeviceTypeBoot = 0x05,
kBcdDeviceTypePartition = 0x06,
kBcdDeviceTypeLocate = 0x08
};
#pragma pack(push, 1)
typedef struct _tag_bcd_device_element {
unsigned char rev01[16];
unsigned char device_type;
unsigned char rev02[7];
unsigned char unknown_48;
unsigned char rev03[7];
union {
// kBcdDeviceTypeLocate
struct {
unsigned char rev11[4];
unsigned char custom_type[4];
};
// kBcdDeviceTypePartition
// MBR
struct {
unsigned char rev21[2];
uint16_t partition_signature;
};
// GPT
GUID partition_unique_id;
};
unsigned char rev04[4];
/**
* partition_type (Maybe...)
* 0x00 : GPT
* 0x01 : MBR
*/
unsigned char partition_type;
unsigned char rev05[3];
union {
// GPT
GUID disk_unique_id;
struct {
// MBR
DWORD disk_signature;
};
};
unsigned char rev06[16];
} bcd_device_element_t;
#pragma pack(push, 0)
BCD를 레지스트리로 읽을려고 하는데 난해한 부분이 있다...
0x11000001 Device 에 대한 Element 값인데 데이터의 의미를 파악하기가 어려웠다. (메뉴얼을 찾을 수 없다..ㅠㅠ)
GPT
일단 GPT인 경우는 쉽게 알아볼 수 있었다. GUID구조를 하고 있다.
offset[0x20] 부터 16바이트는 Partition GUID이다. mountvol을 하면 볼 수 있는 내용이다.
offset[0x38] 부터 16바이트는 Disk GUID이다. diskpart에서 uniqueid disk 를 치면 볼 수 있는 내용이다.
MBR
MBR인 경우에는 꽤나 삽질을 했다...
offset[0x38] 부터 4바이트는 동일하게 disk의 uniqueid이다. 정확하게는 MBR Signature이다.
offset[0x22] 부터 4바이트 이상 (아마도 8바이트) 의 값이 Partition을 의미하는거 같은데 파악하기가 어려웠다.
파티션을 옮겨가며 데이터를 확인해보니 대략적으로 Partition의 Offset과 유사하다는 느낌을 봤는데 MBR의 Partition Table값이랑은 일치하지 않았다.
암튼 좀더 봐 보니 BCD 데이터에서 나누기 2를 하면 MBR Partition Table에서 보이는 offset (섹터번호)와 동일했다.
Partition Number를 쓰지 않은 것은 파티션 구조가 변할것을 고려했다고 생각해볼수는 있는데,,,
왜 이런 방식으로... Offset을 다르게 표현했는지는 당췌 이해가지 않는다... 마소는 역시 이해하기 힘들다...
공통
offset[0x10] 은 device type이다.
http://mistyrebootfiles.altervista.org/documents/BCDEdit/files/device_locate.htm 여기에 몇가지 정보가 있다.
* 0x05 : boot
* 0x06 : partition
* 0x08 : Locate (custom)
이라고 한다.
offset[0x18] 은 0x48로 동일했다.
offset[0x34] 의 경우 MBR/EFI 차이라고 예상해본다.
아마도...
* 0x00 : GPT ?
* 0x01 : MBR ?
PARTITION_STYLE_MBR = 0,
PARTITION_STYLE_GPT = 1
혹시 이건가 했는데 이거랑은 반대된다...ㅠㅠ
'개발 및 운영' 카테고리의 다른 글
SHIM/GRUB 리뷰 및 코드사인에 대해 (0) | 2020.09.09 |
---|---|
postfix Received 헤더 삭제 (0) | 2020.08.21 |
CreatePipe에 PeekNamedPipe을 쓰지 마세요! (1) | 2020.08.07 |
MariaDB & Ceph & Galera 성능 테스트 (0) | 2020.05.27 |
BTRFS 복구 (0) | 2019.11.22 |
댓글