오전 4:42 2004-05-29
조경민 bro(bro@shinbiro.com)
MBR/ 파티션 부트섹터 읽기
==============================================
win nt를 소스 예를 들었으며 win9x는 codeproject( http://www.codeproject.com)
에서 DiskSector 라는 클래스를 가져다 쓰면 된다.
테스트되는 내 pc 는 하나의 물리 하드디스크를 3개의 파티션으로 나누어서
C: NTFS
D: NTFS
E: FAT32
로 한 상태에서 예를 보인다.

하드디스크의 물리적인 이름인 PHYSICALDRIVE0으로
열면된다. 두번째 hdd는 PHYSICALDRIVE1 이다.

        HANDLE hDrive;
        TCHAR szDrv[]=_T("\\\\.\\PHYSICALDRIVE0");
        DWORD dwRead;

        hDrive = CreateFile(szDrv, GENERIC_READ | GENERIC_WRITE,
                   FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

        //  how many bytes you want to read
        DWORD dwSize = 512;

        // Set pointer to begin of file
        SetFilePointer(hDrive, NULL, NULL, FILE_BEGIN);

        // read the first 512 bytes
        // Becarefull not to ovrewrite this because it will make you system un-bootable.  You will lose everything.
        ReadFile(hDrive, data , len , &dwRead, NULL);
        CloseHandle( hDrive );

이렇게 열면 물리적 하드디스크의 첫번째 섹터에 있는 MBR을 얻게된다.
MBR에는 파티션 정보등의 유용한 정보가 들어 있다.
다음은 MBR 512 bytes 1 sector 내용이다.

0012F654  4E 32 E4 8A 56 00 CD 13 EB E4  N2?V...陰
0012F65E  8A 56 00 60 BB AA 55 B4 41 CD  둞.`빽U퀮.
0012F668  13 72 36 81 FB 55 AA 75 30 F6  .r6괎U챬0.
0012F672  C1 01 74 2B 61 60 6A 00 6A 00  ..t+a`j.j.
0012F67C  FF 76 0A FF 76 08 6A 00 68 00  .v..v.j.h.
0012F686  7C 6A 01 6A 10 B4 42 8B F4 CD  |j.j.퀯뗵.
0012F690  13 61 61 73 0E 4F 74 0B 32 E4  .aas.Ot.2.
0012F69A  8A 56 00 CD 13 EB D6 61 F9 C3  둞...絨a荷
0012F6A4  49 6E 76 61 6C 69 64 20 70 61  Invalid pa
0012F6AE  72 74 69 74 69 6F 6E 20 74 61  rtition ta
0012F6B8  62 6C 65 00 45 72 72 6F 72 20  ble.Error
0012F6C2  6C 6F 61 64 69 6E 67 20 6F 70  loading op
0012F6CC  65 72 61 74 69 6E 67 20 73 79  erating sy
0012F6D6  73 74 65 6D 00 4D 69 73 73 69  stem.Missi
0012F6E0  6E 67 20 6F 70 65 72 61 74 69  ng operati
0012F6EA  6E 67 20 73 79 73 74 65 6D 00  ng system.
0012F6F4  00 00 00 00 00 00 00 00 00 00  ..........
0012F6FE  00 00 00 00 00 00 00 00 00 00  ..........
0012F708  00 00 00 00 00 00 00 00 00 00  ..........
0012F712  00 00 00 00 00 00 00 00 00 00  ..........
0012F71C  00 00 00 00 00 00 00 00 00 00  ..........
0012F726  00 00 00 00 00 00 00 2C 44 63  .......,Dc
0012F730  FC 8F FC 8F 00 00 80 01 01 00  ??......
0012F73A  07 FE FF FF 3F 00 00 00 37 16  ....?...7.
0012F744  71 02 00 00 C1 FF 0F FE FF FF  q......... 파티션0부터 3까지
0012F74E  76 16 71 02 8A 8F DF 06 00 00  v.q.뒒.... 4개의 파티션 정보
0012F758  00 00 00 00 00 00 00 00 00 00  .......... 16바이트 4개있음
0012F762  00 00 00 00 00 00 00 00 00 00  ..........
0012F76C  00 00 00 00 00 00 00 00 00 00  ..........
0012F776  55 AA 74 FE 12 00 B4 F7 12 00  U챫...덖..
          ~~~~~ <- 여기까지가 512

그중 첫번째 파티션0의 16바이트는 0x0012F736 으로
(http://www.pjrc.com/tech/8051/ide/fat32.html 참조)
이 곳의 8번째부터 4칸이 첫번째 파티션이 시작되는 LBA값이다.
(LBA는 하드디스크에서 특정 섹터를 찾는 방식이며 그냥 섹터값 번지로
생각하면 된다. 기존 CHS 실린더 헤더 섹터 번지값보다 쉬운 표현이다.)
3F 00 00 00 이 첫번째 파티션의 LBA Begin인데 intel은 리틀인디언이므로
00 00 00 3F 로 0x3F*512 바이트 번재가 실제 파티션의 첫 섹터(부트섹터)
가 된다.

SetFilePointer(hDrive, 0x3F*512, NULL, FILE_BEGIN);
이렇게 해서 읽어보면 첫번째 파티션의 부트섹터가 나온다.
NTFS 로 시작하는게 보일것이다 (vc 디버거의 메모리창임)
륬TFS 로 나왔는데 한글로 변환되어 보여서 그렇다..

0012F578  EB 52 90 4E 54 46 53 20 20 20  ?륬TFS  
0012F582  20 00 02 08 00 00 00 00 00 00   .........
0012F58C  00 F8 00 00 3F 00 FF 00 3F 00  ....?...?.
0012F596  00 00 00 00 00 00 80 00 80 00  ..........
0012F5A0  36 16 71 02 00 00 00 00 04 00  6.q.......
0012F5AA  00 00 00 00 00 00 63 11 27 00  ......c.'.
0012F5B4  00 00 00 00 F6 00 00 00 01 00  ..........
0012F5BE  00 00 EC 10 21 14 1F 21 14 08  ....!..!..
0012F5C8  00 00 00 00 FA 33 C0 8E D0 BC  .....3핉劇
0012F5D2  00 7C FB B8 C0 07 8E D8 E8 16  .|醯..롔..
0012F5DC  00 B8 00 0D 8E C0 33 DB C6 06  ....렳3培.
0012F5E6  0E 00 10 E8 53 00 68 00 0D 68  ...?.h..h
0012F5F0  6A 02 CB 8A 16 24 00 B4 08 CD  j.?.$....
0012F5FA  13 73 05 B9 FF FF 8A F1 66 0F  .s....딋f.
0012F604  B6 C6 40 66 0F B6 D1 80 E2 3F  뗬@f.뚜..?
0012F60E  F7 E2 86 CD C0 ED 06 41 66 0F  透녝잿.Af.
0012F618  B7 C9 66 F7 E1 66 A3 20 00 C3  령f投f. ..
0012F622  B4 41 BB AA 55 8A 16 24 00 CD  퀮빽U..$..
0012F62C  13 72 0F 81 FB 55 AA 75 09 F6  .r.괎U챬        .
0012F636  C1 01 74 04 FE 06 14 00 C3 66  ..t.....홨
0012F640  60 1E 06 66 A1 10 00 66 03 06  `..f...f..
0012F64A  1C 00 66 3B 06 20 00 0F 82 3A  ..f;. ...:
0012F654  00 1E 66 6A 00 66 50 06 53 66  ..fj.fP.Sf
0012F65E  68 10 00 01 00 80 3E 14 00 00  h.....>...
0012F668  0F 85 0C 00 E8 B3 FF 80 3E 14  ....蘊..>.
0012F672  00 00 0F 84 61 00 B4 42 8A 16  ...꼆.퀯..
0012F67C  24 00 16 1F 8B F4 CD 13 66 58  $...뗵..fX
0012F686  5B 07 66 58 66 58 1F EB 2D 66  [.fXfX..-f
0012F690  33 D2 66 0F B7 0E 18 00 66 F7  3?.....f.
0012F69A  F1 FE C2 8A CA 66 8B D0 66 C1  只혡?뗊f.
0012F6A4  EA 10 F7 36 1A 00 86 D6 8A 16  ...6..녧..
0012F6AE  24 00 8A E8 C0 E4 06 0A CC B8  $.딂잤..見
0012F6B8  01 02 CD 13 0F 82 19 00 8C C0  ........뙽
0012F6C2  05 20 00 8E C0 66 FF 06 10 00  . .렳f....
0012F6CC  FF 0E 0E 00 0F 85 6F FF 07 1F  .....꿵...
0012F6D6  66 61 C3 A0 F8 01 E8 09 00 A0  fa횪...        ..
0012F6E0  FB 01 E8 03 00 FB EB FE B4 01  .....魂

'KB > Win32/x86' 카테고리의 다른 글

파일 모니터링  (0) 2004.07.29
Implementation FAT File System  (0) 2004.05.31
mini os 세미나 ppt  (0) 2004.05.08
C++가상맴버함수 호출..  (0) 2004.04.20
How to i386 32bit OS Kernel Compile in VC6  (0) 2004.03.20

+ Recent posts