본문 바로가기
개발 및 운영

BCD 11000001 (device) Element binary 구조

by Joseph.Lee 2020. 8. 7.
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 값인데 데이터의 의미를 파악하기가 어려웠다. (메뉴얼을 찾을 수 없다..ㅠㅠ)

 

EFI 일 때 구조
MBR일 때 구조

 

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

혹시 이건가 했는데 이거랑은 반대된다...ㅠㅠ

 

 

 

반응형

댓글