用虛擬機測試自制的操做系統,常常要覆寫虛擬軟盤鏡像的 Boot Sector,咱們今天的任務就是寫個簡單的程序自動完成這個工做。
小程序
其實很簡單,就是把 BoostSector.bin 文件寫到 vFloppy.img 文件的開頭,最多512字節。因此這個小程序除了能完成既定的覆寫虛擬軟盤 Boot Sector 的任務,順帶的也能覆寫硬盤、U盤的 Boot Sector——由於在 Windows 系統下,硬盤、U盤也是文件!代碼直接貼出來,註釋的很詳細,很少解釋了。函數
#include <stdio.h> #include <string.h> /* 一個扇區512字節 */ #define SECTOR_SIZE 512 /* 文件路徑最長260字節 */ #define MAX_PATH 260 /* 函數功能:將strFile1文件開頭的最多512字節內容拷貝到strFile2文件開頭 參數表:strFile1 = 源文件名,strFile2 = 目標文件名 返回值:0 = 成功,1 = 文件1失敗,2 = 文件2失敗 */ int CopyFirstSector(char *strFile1, char *strFile2) { FILE *fp1, *fp2; unsigned char ucBuffer[SECTOR_SIZE]; int nR = 0, nW = 0; /* 讀文件File1數據到內存 */ fp1 = fopen(strFile1, "rb"); /* rb 二進制讀,文件必須存在 */ if(fp1 == NULL) { return 1; } fseek(fp1, 0, SEEK_SET); nR = fread(ucBuffer, 1, SECTOR_SIZE, fp1); /* 最多讀 512 字節 */ fclose(fp1); if(nR == 0) { return 1; } /* 寫內存數據到文件File2 */ fp2 = fopen(strFile2, "rb+"); /* rb+ 二進制讀寫,文件必須存在 */ if(fp2 == NULL) { return 2; } fseek(fp2, 0, SEEK_SET); nW = fwrite(ucBuffer, 1, nR, fp2); /* 讀出多少就寫多少 */ fclose(fp2); if(nW == 0) { return 2; } return 0; } int main(int argc, char *argv[]) { char strFile1[MAX_PATH], strFile2[MAX_PATH]; switch(argc) { case 1: strcpy(strFile1, "BootSector.bin"); strcpy(strFile2, "vFloppy.img"); break; case 2: /* 在 Windows 中 \\.\ 前綴用於標識設備,其中的 "." 表示本地計算機。 好比用 \\.\PhysicalDrive 加一個數字序號表示物理驅動器,而且把 U 盤和硬盤等同看待。 \\.\PhysicalDrive0 表示本機的物理驅動器 0(通常是主硬盤), \\.\PhysicalDrive1 表示本機的物理驅動器 1(通常是 U 盤)。*/ strcpy(strFile1, argv[1]); strcpy(strFile2, "\\\\.\\PHYSICALDRIVE1"); break; case 3: strcpy(strFile1, argv[1]); strcpy(strFile2, argv[2]); break; default: printf("Usage : %s [BootSector.bin [vFloppy.img]]\n", argv[0]); return -1; } printf("Copy %s to %s ...", strFile1, strFile2); switch(CopyFirstSector(strFile1, strFile2)) { case 0: printf("\nSuccess\n"); return 0; case 1: printf("\nPlease check files: %s\n", strFile1); return -1; case 2: printf("\nPlease check files: %s\n", strFile2); return -1; } }