2、複製引導扇區

   用虛擬機測試自制的操做系統,常常要覆寫虛擬軟盤鏡像的 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;
	}
}
相關文章
相關標籤/搜索