转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc

转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc

ID:56231638

大小:61.00 KB

页数:12页

时间:2020-03-22

转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc_第1页
转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc_第2页
转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc_第3页
转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc_第4页
转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc_第5页
资源描述:

《转不同WINDOWS平台下磁盘逻辑扇区的直接读写.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、转] 不同WINDOWS平台下磁盘逻辑扇区的直接读写(2007-04-2513:07:58)标签:windows 磁盘 逻辑扇区 直接读写  一、概述   在DOS操作系统下,通过BIOS的INT13、DOS的INT25(绝对读)、INT26(绝对写)等功能调用实现对磁盘逻辑扇区或物理扇区的读写是很方便的,C语言中还有对应上述功能调用的函数:biosdisk、absread和abswrite等。但在WINDOWS操作系统下编写WIN32应用程序时却再也不能直接使用上述的中断调用或函数了。那么,在WINDOWS操作系统下能不能实现磁盘扇区的直接读写呢?如何实现磁盘扇区的读

2、写呢?为了解决这些问题,笔者查阅了一些相关资料后发现,WINDOWS操作系统也提供了读写磁盘扇区的方法,只是在不同的版本中有着不同的方式和使用限制。最后,笔者编写了一个磁盘扇区直接读写类,不敢独专,特提供出来,希望能对大家有所帮助。   注:这里INT13表示INT13H,其它类同。二、一个读取软盘扇区的例子   WINDOWS操作系统对所有的存储设备实行了统一管理,而且为了安全起见,操作系统还不允许在WIN32应用程序(工作在Ring3级)中直接调用中断功能,如INT13、INT21、INT25、INT26等。但它同时也提供了一些服务来弥补这种缺憾,在WIN95/98

3、中,VWIN32服务就是其中一种。VWIN32服务是通过一个VXD来实现的,它提供了设备IO功能,通过它,使用API函数DeviceIoControl便可以实现WIN32应用程序和磁盘设备驱动程序间的通信,从而实现对磁盘的存取。VWIN32提供的服务是一系列的控制命令字,它们实现诸如DOS操作系统下的INT13、INT25、INT26和INT21等功能调用。下面是它定义的一些控制命令字:  VWIN32_DIOC_DOS_IOCTL    (1) 实现INT21功能  VWIN32_DIOC_DOS_INT25    (2) 实现INT25功能  VWIN32_DIOC

4、_DOS_INT26    (3) 实现INT26功能    VWIN32_DIOC_DOS_INT13    (4) 实现INT13功能  VWIN32_DIOC_DOS_DRIVEINFO(6) 实现INT21730x功能  如果要对磁盘进行读写,只要使用DeviceIoControl执行相应命令即可,下面的例子用来读取软盘的一个扇区(使用INT13):   第一步:打开VWIN32服务,HANDLEhDev=CreateFile("\\.\VWIN32",0,0,0,0,);   第二步:填充中断所用到的相关寄存器。这里将寄存器放在一个结构中,结构定义如下(

5、有关INT13使用的寄存器情况,请参阅相关资料):     typedefstructINT13Regs{  PVOIDbuffer;  //ebx寄存器       BYTEDrive;    //磁盘号dl BYTEHead;     //磁头号dh WORDEDX_High; //edx寄存器  BYTESector;   //起始扇区cl BYTETrack;    //磁道号  ch WORDECX_High; //ecx寄存器 BYTENumber;   //要读写的扇取数al BYTECMD;      //命令:2--读,3--写,5--格式化ah WO

6、RDEAX_High; //eax寄存器 DWORDEDI;      //edi寄存器       DWORDESI;      //esi       DWORDEFLAG;    //flags     }INT13_REGISTERS;     unsignedcharBuffer[512];//定义缓冲区,放置读取扇区数据     INT13_REGISTERSreg={0};//定义寄存器结构变量      reg.buffer=(void*)Buffer;     reg.Drive=0;//0-软盘A 1-软盘B0x80-硬盘c     reg.Head

7、=0;     reg.Track=0;     reg.Sector=1;     reg.Number=1;     reg.CMD=2; //读取   第三步:调用设备IOAPI函数DeviceIoControl执行4号命令(即VWIN32_DIOC_DOS_INT13),BOOLb_ret=DeviceIoControl(hDev,4,®,sizeof(INT13_REGISTERS),®,sizeof(INT13_REGISTERS),&lpRet,0);如果其返回值不等于零,调用成功,进一步处理....否则调用失败

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。