二、复制引导扇区

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

你可能感兴趣的:(二、复制引导扇区)