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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 49 ::
收藏到网摘: 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