当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 简易软盘镜像工具的实现及操作系统编写初步

VC++
关于内联汇编的几个技巧
const使用详解
为什么要在operator=中返回*this的引用
如何在派生类中的隐藏基类的虚拟重载函数?
C++指针使用方法解惑
如何用编程获取CD-ROM的驱动器盘符?
声明函数指针并实现回调
定义函数对象
在名字空间中声明类和成员函数
自制性能测试类
为什么operator=操作符返回引用
单实例设计模式的实现
初始化类对象
C++编程杂谈之三:面向对象(续)
C++编程杂谈之二:面向对象
C++编程杂谈之一:编译器
解析动态联编(上篇) - 作者:tingya
解析动态联编(下篇) - 作者:tingya
创建和访问环境变量
在预先定义的内存位置构造一个对象

VC++ 中的 简易软盘镜像工具的实现及操作系统编写初步


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 57 ::
收藏到网摘: n/a

简易软盘镜像工具的实现及操作系统编写初步

作者:liu_sir

下载源代码


摘要

  本文给出了软盘镜像生成工具的实现,并用其把自己编译生成的引导文件制作成软盘镜像,写入软盘实现一个简单操作系统的引导。
关键词 软盘镜像工具 操作系统引导。
  为了深入的了解80X86计算机的内部原理,参照别人的程序用汇编写了几个小程序。但生成软盘镜像的工具大都是DOS版本的,于是就想自己用VC也实现一个,并用把自己的引导程序写入软盘上验证一下。

1、镜像工具的基本原理

镜像工具读取磁盘上的文件,然后安装一定的格式生成软盘镜像文件,最后把软盘镜像文以512字节扇区为单位,写入软盘上。

2、镜像工具的界面设计及功能介绍


图1 主界面

2.1 【功能1】生成软盘镜像文件
(1)要生成镜像文件,需要先选择源文件,然后点击【生成…】,如MyDiskImg.img,点击【保存】生成镜像文件。


图2 生成镜像文件

(2)然后插入一张软盘,点击写软盘,选择刚生成的镜像文件。点击【打开】,系统便开始把选择的镜像文件写入软盘中。


图3 把镜像文件写入软盘

(3)重新启动计算机,选择从软盘启动,看操作是否成功。

3、具体代码编写

3.1 生成软盘镜像代码

基本原理为对列表中的源文件依次读取,然后写入到一个img文件中,具体的代码请参考(省略了部分不关键代码):

//生成镜像文件函数UINT FuncGenImageFile(LPVOID pDialog){	//Begin 显示设置	省略…	//1.创建输出镜像文件	byte* pBuf = NULL;	DWORD count = 0,dwFileLength=0;	CFile outfile;//镜像文件	if(!outfile.Open(pCurDlg->m_ImgFileName,CFile::modeCreate | CFile::modeWrite))	{	错误提示…	return -1;	}	//2.依次对输入文件读取,写入输出镜像文件	for( int i = 0 ; i < pList->GetCount(); ++i )	{	CString sInFileName;	pList->GetText(i,sInFileName);	CFile infile;	if(!infile.Open(sInFileName,CFile::modeRead))	{	错误提示…	return -1;	}	dwFileLength = infile.GetLength();	if(i==0)	{	if(dwFileLength>512)	{	sOut.Format(_T("文件%S不是一个有效的引导区文件,请使用[功能3]裁减该文件!"),sInFileName);	return -1;	}	}	if(i==0)//对0扇区文件进行特殊处理	{	pBuf = new byte[BlOCKSIZE];	::memset(pBuf,0,BlOCKSIZE);	infile.Read(pBuf,dwFileLength);	if(pBuf[510]!=0x55) pBuf[510]=0x55;	if(pBuf[511]!=0xAA) pBuf[510]=0xAA;	outfile.Write(pBuf,BlOCKSIZE);	dwFileLength = BlOCKSIZE;	}	else	{	pBuf = new byte[dwFileLength];	infile.Read(pBuf,dwFileLength);	outfile.Write(pBuf,dwFileLength);	}	infile.Close() ;	delete[] pBuf;	count += dwFileLength;	pProgCtrl->SetPos((int)(count*100/FLOPYBYTESIZE));	}	#ifdef ADISKMODE //3.补充剩余的软盘字节为0	DWORD dwRet = FLOPYBYTESIZE-count;	pBuf = new byte[dwRet];	memset(pBuf,0,dwRet);	outfile.Write(pBuf,dwRet);	delete[] pBuf;#endif outfile.Close() ;	//end 显示设置	省略…	return 0;}
3.2 写镜像文件到软盘代码
基本原理是读取生成的镜像文件,然后把其写入软盘启动器A中, 具体的代码请参考(省略了部分不关键代码):
//写镜像文件到软驱
UINT FuncWriteFlopy(LPVOID pDialog){	//begin显示设置	省略…	int nTotalBlocks = 80*18*2;	//1.打开A驱动器	HANDLE hFile = CreateFile(_T("\\\\.\\A:"),	GENERIC_WRITE,	FILE_SHARE_WRITE,	NULL,	OPEN_EXISTING,	0,	NULL);	if(hFile==NULL)	{	sOut = _T("不能打开驱动器A");//…	return -1;	}	PBYTE pBuffer = (PBYTE)malloc(BlOCKSIZE);	if(pBuffer==NULL)	{	sOut = _T("开辟内存空间失败!");//…	return -1;	}	memset(pBuffer,0,BlOCKSIZE);	//2.打开镜像文件	CFile fInFile;	BOOL b = fInFile.Open(pCurDlg->m_ImgFileName, CFile::modeRead);	if(!b)	{	sOut.Format(_T("不能打开镜像文件%s!"),pCurDlg->m_ImgFileName);	…	return -1;	}	//3.分块写入镜像文件	DWORD dwImgLen = fInFile.GetLength();	for(int i=0;i<nTotalBlocks;i++)	{	DWORD dwLen=0;	fInFile.R