当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > C++ > 硬件底层与驱动 > 正文

读磁片磁区

http://www.zk168.com.cn  招考学习网 2006-4-11 5:20:24
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
一、以前的dos版要读、写、格式化第0轨的第1个磁区,程式大致如下:

char buffer[512];

reg.x.dx=0 ;   /* for drive a *
reg.x.cx=0x0001  /* for boot sector */
reg.x.bx=fp_off(buffer);
sreg.es=fp_seg(buffer);
resg.x.ax=0x0201;   /*  02 for read, 03 for write ,05 for format */
int86x(0x13,&reg,&reg,&sreg);

    那麽在windows 下转换为呼叫 deviceiocontrol 以便格式化、读取、写入该磁轨,dioc_registers 这struct 在套上 dos 下 int21对hdd或fdd 的各项参数如要格式化是int21也是有, 但windows下也另有提供。

l#pragma pack(push, 1)
struct dioc_registers {
    dword reg_ebx;
    dword reg_edx;
    dword reg_ecx;
    dword reg_eax;
    dword reg_edi;
    dword reg_esi;
    dword reg_flags;
};
#pragma pack(pop)

sdiskimageinfo->hdevice = ::createfile("\\\\.\\vwin32", 0, 0, null, 0, file_flag_delete_on_close, null);
if( sdiskimageinfo->hdevice == invalid_handle_value)
  brunnext = false;

// reset floppy disk
  reg.reg_ebx = 0;
  reg.reg_eax = 0x0000;       // ioctl for block devices
  reg.reg_edx = sdiskimageinfo->driver;
  reg.reg_edi = 0; reg.reg_esi= 0;
  reg.reg_flags = 0x0001;     // assume error (carry flag is set)
  dwresult = ::deviceiocontrol( sdiskimageinfo->hdevice, vwin32_dioc_dos_int13, &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);

// seek floppy
      reg.reg_ebx = 0;
      reg.reg_eax = 0x0c00;       // ioctl for block devices
      reg.reg_ecx = ( sdiskimageinfo->nc << 8) | sdiskimageinfo->ns;
      reg.reg_edx = ( sdiskimageinfo->nh << 8) | sdiskimageinfo->driver;
      reg.reg_edi = 0;
reg.reg_esi= 0;
      reg.reg_flags = 0x0001;     // assume error (carry flag is set)
      dwresult = ::deviceiocontrol( sdiskimageinfo->hdevice,
vwin32_dioc_dos_int13,
                                   &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);

// read floppy
r_creatediskimagefile:
      reg.reg_ebx = 0;
      reg.reg_eax = 0x0200 | 0x01;       // ioctl for block devices
      reg.reg_ecx = ( sdiskimageinfo->nc << 8) | sdiskimageinfo->ns;
      reg.reg_edx = ( sdiskimageinfo->nh << 8) | sdiskimageinfo->driver;
      reg.reg_ebx = (dword) &m_buf;
      reg.reg_edi = 0;
reg.reg_esi= 0;
      reg.reg_flags = 0x0001;     // assume error (carry flag is set)
      dwresult = ::deviceiocontrol( hdevice, vwin32_dioc_dos_int13,
                                   &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);
      if (!dwresult || (reg.reg_flags & 0x0001))
      {
}

-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>