主要是磁盘的底层操作。明白了道理,就知道一些磁盘工具其实并没那么神秘。
-a 100 mov ax, 0201 ; AH=02 代表“读”, (AL=要读的扇区数) mov bx, 0200 ; 运行结果放在内存地址 0200 处 mov cx, 1 ; mov dx, 80 ; (DH=磁头, DL=0、1软盘,80、81硬盘) 80 代表第一硬盘 int 13 ; 调用磁盘中断 int 20 ; 结束程序 -g =100 ; 从 100 处开始运行程序 -d 200 ; 显示主引导记录
在Windows上Mingw 环境下编译通过。
#include <stdio.h>
#include <windows.h>
// 一个扇区可能的字节数为128×2n (n=0,1,2,3)。大多情况下,取n=2,为512字节
const static int DISK_SECTOR_SIZE = 512;
int read_mbr(const char *devname){
char buffer[DISK_SECTOR_SIZE];
HANDLE hDev = CreateFile(devname, GENERIC_READ,
FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE){
printf("Open %s FAIL.\n", devname);
exit(0);
}
printf("Open %s PASS.\n", devname);
//SetFilePointer(hDev, 0, 0, FILE_BEGIN);
int cb;
BOOL ret = (BOOL) ReadFile(hDev, buffer, 512, (DWORD*) &cb, NULL);
CloseHandle(hDev);
if ( 0 == ret || DISK_SECTOR_SIZE != cb) {
printf("Error: read error! ret=%d #bytes=%d\n", ret, cb);
exit(0);
}
printf("#bytes = %d\n", cb);
printf("%10s 0 1 2 3 4 5 6 7 8 9 a b c d e f \n", " ");
for (int i=0 ;i<32 ;i++ ){
printf("%.8Xh: ", i);
for (int j=0 ;j<16 ;j++ ){
printf("%.2x ", buffer[i*16+j] & 0xFF);
}
printf("\n");
}
printf("====MBR Partition Entry====\n");
for(int i=0x01be; i<0x01FE; i+=16){
for (int j=0 ;j<16 ;j++ ){
printf("%02x ", buffer[i + j] & 0xFF);
}
int d_status = buffer[i+0] & 0xff;
int d_format = buffer[i+4] & 0xff;
int s_head = buffer[i+1] & 0xff;
int s_sector = buffer[i+2] & 0x3f;
int s_cylinder = (((buffer[i+2] & 0xff) >> 6) << 8) + (buffer[i+3] & 0xff);
int e_head = buffer[i+5] & 0xff;
int e_sector = buffer[i+6] & 0x3f;
int e_cylinder = (((buffer[i+6] & 0xff >> 6)) << 8) + (buffer[i+7] & 0xff);
unsigned int sector_offset = *((unsigned int*)(buffer+i+8));
unsigned int sector_size = *((unsigned int*)(buffer+i+12));
printf("\n");
long d_mbytes = sector_size/1024*DISK_SECTOR_SIZE/1024/1024;
printf("%02x | %02x | (%d, %d, %d) (%d, %d, %d) | %d+%d = %i GB\n",
d_status, d_format,
s_cylinder, s_head, s_sector, e_cylinder, e_head, e_sector,
sector_offset, sector_size, d_mbytes);
printf("\n");
}
return 0;
}
int main(int argc, char *argv[]){
//-- read_mbr("\\\\.\\C:");
read_mbr("\\\\.\\PhysicalDrive0");
return 0;
}
/****** Demo Output ******
====MBR Partition Entry====
80 01 01 00 07 fe ff ff 3f 00 00 00 82 37 f9 0d
80 | 07 | (0, 1, 1) (1023, 254, 63) | 63+234436482 = 111 GB
*/