我写了一个基于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
|