当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 简易软盘镜像工具的实现及操作系统编写初步
| 简易软盘镜像工具的实现及操作系统编写初步 下载源代码 本文给出了软盘镜像生成工具的实现,并用其把自己编译生成的引导文件制作成软盘镜像,写入软盘实现一个简单操作系统的引导。 1、镜像工具的基本原理 2.1 【功能1】生成软盘镜像文件 (2)然后插入一张软盘,点击写软盘,选择刚生成的镜像文件。点击【打开】,系统便开始把选择的镜像文件写入软盘中。 (3)重新启动计算机,选择从软盘启动,看操作是否成功。 //生成镜像文件函数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 |