用虚拟机测试自制的操做系统,常常要覆写虚拟软盘镜像的 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; } }