主要是磁盘的底层操作。明白了道理,就知道一些磁盘工具其实并没那么神秘。
-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 */