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

2016-01-29 12:11 119 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

作者:liu_sir

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载源代码


摘要

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

  本文给出了软盘镜像生成工具的实现,并用其把自己编译生成的引导文件制作成软盘镜像,写入软盘实现一个简单操作系统的引导。
关键词 软盘镜像工具 操作系统引导。
  为了深入的了解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.补充剩余的软盘字节为0DWORD 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.
                        

来源:https://www.tulaoshi.com/n/20160129/1485027.html

延伸阅读
标签: autocad教程
    如果用户希望在Auto CAD 中执行 操作系统 命令,则可调用“shell”命令来访问操作系统,该命令的调用方式为:     命令行:shell(或sh)     调用该命令后,系统将提示用户输入操作系统命令:     OS Command:     用户可...
top top命令可实时地显示Linux系统的进程、CPU、内存、负载等的信息。它是我们了解系统整体状态最好的工具。 top命令的运行状态是一个实时的显示过程,我们可在这个界面监控系统运行情况。我们可通过几个按键来控制top命令,如按q可退出top命令状态,按s可输入信息的更新频率等。这些命令可按h帮助键查询。 Ps ps命令...
标签: windows 操作系统
无论是监视系统的性能,还是探究故障的原因,真正的关键是找到对症的工具。打开XP的“所有程序”菜单,“系统工具”下面就有一大堆工具让你选择。但是,如果你是一个富有经验的用户,Windows XP还为你准备了另一份大礼包:安装CD上隐藏着100多个五花八门的工具。它们涵盖了操作系统的方方面面,从网络和Internet连接到文件夹和磁盘管理,无...
  出处: linuxaid 在网上看到不少有关linux优化方面的好文章,在此我也不赘述这些文章了,我只想从我自己的体会来谈谈这方面的问题。 作为一个系统管理员,我下面说的都是基于服务器应用的linux来谈的,由于个人电脑上使用linux也许不是像服务器上一样,优先追求安全和稳定,因此个人电脑使用的朋友只做个参考吧。 本文...
在多个操作系统的安装中,有时候会使GRUB 丢失,如我在重装XP的时候,XP 就把GRUB 从MBR 中清除了。还有在升级LINUX 的过程中GRUB 安装失败或者进入控制台状态了,也需要重新安装GRUB。 GRUB 的功能很多,对于一般的使用者来说主要要知道ROOT,SETUP,INSTALL,ROOTNOVERIFY,CHAINLOADER,GRUB.CONF,针对不同文件系统的STAGE1...

经验教程

968

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部