近来在看<自己动手写操作系统>

mengqin007 2006-08-24 03:55:01
近来在看<自己动手写操作系统>,其中有一个floppywrite工具,因为是电子书,没有光盘就从网上找相关资料,有这样一篇,不懂,求教各位!!!

我明白他的意思,把一引导程序写在软盘的特殊位置使软盘引导时加载它,其中的"&dwRead"是什么?CFloppyWriterDlg::OnButton1() 是如何把boot的二进制代码写进去的?


全文内容如下:
我写了一个基于x86的boot。想通过软盘启动。但是没有软盘,所以就安装了一个Vitual PC,然后虚拟了一个软盘,当然,这个软盘就是一个文件。我猜这个文件的第一个字节就是对应于实际的软盘的0面0道1扇。我想把可执行文件按照字节直接写到这个文件中去。结果证明,我得猜想是正确的。我得boot能够正常工作。

把关键代码写出来:

说明:BootSctr.img是启动程序的镜像。

fl.vfd是虚拟软盘的文件

void CFloppyWriterDlg::OnButton1()
{

HANDLE hFile=CreateFile("BootSctr.img",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
BYTE bt[512];
memset(bt,0,512);
DWORD dwRead;
ReadFile(hFile,bt,512,&dwRead,NULL);

CloseHandle(hFile);
//MessageBox(bt,"haha",0);
HANDLE rFile=CreateFile("fl.vfd",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(rFile,bt,512,&dwRead,NULL);
CloseHandle(rFile);
}


顺便把boot的代码贴出来

org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $

DispStr:
mov ax,Bootmessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
Bootmessage : db "Hello, OS world!"
times 510-($-$$) db 0
dw 0xaa55

...全文
248 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayqlj 2006-08-28
  • 打赏
  • 举报
回复
当然上面的参数也是放在""号内
ayqlj 2006-08-28
  • 打赏
  • 举报
回复
实际写的时候,只要把 CreateFile("BootSctr.img",GENERIC_WRITE | ... 的第一个参数改为设备名即可
\\.\PHYSICALDRIVEx
访问硬盘
\\.\A:
\\.\C:
访问逻辑盘
VirgoCeleste 2006-08-26
  • 打赏
  • 举报
回复
1.dwRead是用来存放读取/写入的实际字节的一个变量,是ReadFile和WriteFile函数需要的一个参数,常用来检验文件读写是否出错,但是这里没有用到它们,只是为了凑够参数罢了.
2."如何把boot的二进制代码写进去的?"这里他自己也说了,没有软驱,用的是fl.vfd这个虚拟软盘文件,也就是把编译好的BootSctr.img拷贝到fl.vfd这个文件中而已.
mengqin007 2006-08-24
  • 打赏
  • 举报
回复
我只会C语言,C++不太懂

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧