📄 lc_bcb_68.html
字号:
<HTML><HEAD><TITLE>读磁片磁区</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content=zyqsj name=Author>
<META content="Microsoft FrontPage 4.0" name=GENERATOR></HEAD>
<BODY >
<div align="center"><FONT
size=+2><b>读磁片磁区</b></FONT> </div>
<P>一、以前的DOS版要读、写、格式化第0轨的第1个磁区,程式大致如下:
<P>char buffer[512];
<P>reg.x.dx=0 ; /* for drive A * <BR>reg.x.cx=0x0001 /* for
boot sector */ <BR>reg.x.bx=FP_OFF(buffer); <BR>sreg.es=FP_SEG(buffer);
<BR>resg.x.ax=0x0201; /* 02 for Read, 03 for Write ,05 for
Format */ <BR>int86x(0x13,&reg,&reg,&sreg);
<P> 那麽在windows 下转换为呼叫 DeviceIoControl
以便格式化、读取、写入该磁轨,DIOC_REGISTERS 这struct 在套上 DOS 下 Int21对HDD或FDD
的各项参数如要格式化是Int21也是有, 但Windows下也另有提供。
<P>l#pragma pack(push, 1) <BR>struct DIOC_REGISTERS { <BR>
DWORD reg_EBX; <BR> DWORD reg_EDX; <BR>
DWORD reg_ECX; <BR> DWORD reg_EAX; <BR>
DWORD reg_EDI; <BR> DWORD reg_ESI; <BR>
DWORD reg_Flags; <BR>}; <BR>#pragma pack(pop)
<P> sDiskImageInfo->hDevice = ::CreateFile("\\\\.\\vwin32", 0, 0, NULL,
0, <BR>FILE_FLAG_DELETE_ON_CLOSE, NULL); <BR> if(
sDiskImageInfo->hDevice == INVALID_HANDLE_VALUE) <BR> bRunNext = false;
<P>// Reset Floppy Disk <BR> reg.reg_EBX = 0; <BR> reg.reg_EAX =
0x0000; // IOCTL for block devices
<BR> reg.reg_EDX = sDiskImageInfo->Driver; <BR> reg.reg_EDI = 0;
reg.reg_ESI= 0; <BR> reg.reg_Flags = 0x0001; //
assume error (carry flag is set) <BR> dwResult = ::DeviceIoControl(
sDiskImageInfo->hDevice, <BR>VWIN32_DIOC_DOS_INT13,
<BR>
&reg, sizeof(DIOC_REGISTERS), &reg, <BR>sizeof(DIOC_REGISTERS), &cb,
0);
<P>// Seek Floppy <BR> reg.reg_EBX = 0;
<BR> reg.reg_EAX =
0x0C00; // IOCTL for block devices
<BR> reg.reg_ECX = ( sDiskImageInfo->nC
<< 8) | sDiskImageInfo->nS; <BR>
reg.reg_EDX = ( sDiskImageInfo->nH << 8) | sDiskImageInfo->Driver;
<BR> reg.reg_EDI = 0; <BR>reg.reg_ESI= 0;
<BR> reg.reg_Flags =
0x0001; // assume error (carry flag is set)
<BR> dwResult = ::DeviceIoControl(
sDiskImageInfo->hDevice, <BR>VWIN32_DIOC_DOS_INT13,
<BR>
&reg, sizeof(DIOC_REGISTERS), &reg, <BR>sizeof(DIOC_REGISTERS), &cb,
0);
<P>// Read Floppy <BR>R_CreateDiskImageFile: <BR>
reg.reg_EBX = 0; <BR> reg.reg_EAX = 0x0200 |
0x01; // IOCTL for block devices
<BR> reg.reg_ECX = ( sDiskImageInfo->nC
<< 8) | sDiskImageInfo->nS; <BR>
reg.reg_EDX = ( sDiskImageInfo->nH << 8) | sDiskImageInfo->Driver;
<BR> reg.reg_EBX = (DWORD) &m_Buf;
<BR> reg.reg_EDI = 0; <BR> reg.reg_ESI= 0;
<BR> reg.reg_Flags =
0x0001; // assume error (carry flag is set)
<BR> dwResult = ::DeviceIoControl( hDevice,
VWIN32_DIOC_DOS_INT13,
<BR>
&reg, sizeof(DIOC_REGISTERS), &reg, <BR>sizeof(DIOC_REGISTERS), &cb,
0); <BR> if (!dwResult || (reg.reg_Flags &
0x0001)) <BR> { <BR>} <BR>
</P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -