오전 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 .....魂
조경민 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 |