您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 编程技术 >> Visual C >> 正文

Google
不同WINDOWS平台下磁盘逻辑扇区的直接读写
作者:Siny 文章来源:中国教师站cn-teacher 点击数: 更新时间:2007-4-22 12:40:36

             不同WINDOWS平台下磁盘逻辑扇区的直接读写
关键字:VWIN32、中断、DeviceIoControl

一、概述
    在DOS操作系统下,通过BIOS的INT13、DOS的INT25(绝对读)、INT26(绝对写)等功能调用实现对磁盘逻辑扇区或物理扇区的读写是很方便的,C语言中还有对应上述功能调用的函数:biosdisk、absread和abswrite等。但在WINDOWS操作系统下编写WIN32应用程序时却再也不能直接使用上述的中断调用或函数了。那么,在WINDOWS操作系统下能不能实现磁盘扇区的直接读写呢?如何实现磁盘扇区的读写呢?为了解决这些问题,笔者查阅了一些相关资料后发现,WINDOWS操作系统也提供了读写磁盘扇区的方法,只是在不同的版本中有着不同的方式和使用限制。最后,笔者编写了一个磁盘扇区直接读写类,不敢独专,特提供出来,希望能对大家有所帮助。
    注:这里INT13表示INT 13H,其它类同。
二、一个读取软盘扇区的例子
    WINDOWS操作系统对所有的存储设备实行了统一管理,而且为了安全起见,操作系统还不允许在WIN32应用程序(工作在Ring3级)中直接调用中断功能,如INT13、INT21、INT25、INT26等。但它同时也提供了一些服务来弥补这种缺憾,在WIN95/98中,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_DOS_INT26     (3)  实现INT26 功能  
   VWIN32_DIOC_DOS_INT13     (4)  实现INT13 功能
   VWIN32_DIOC_DOS_DRIVEINFO (6)  实现INT21 730x 功能  

如果要对磁盘进行读写,只要使用DeviceIoControl执行相应命令即可,下面的例子用来读取软盘的一个扇区(使用INT13):
    第一步:打开VWIN32服务,HANDLE hDev=CreateFile("\\.\VWIN32",0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
    第二步:填充中断所用到的相关寄存器。这里将寄存器放在一个结构中,结构定义如下(有关INT13使用的寄存器情况,请参阅相关资料):
      typedef struct INT13Regs{
  PVOID buffer;   // ebx 寄存器

        BYTE Drive;    // 磁盘号 dl
 BYTE Head;      //磁头号 dh
 WORD EDX_High;  // edx 寄存器 

 BYTE Sector;    //起始扇区 cl
 BYTE Track;     //磁道号   ch
 WORD ECX_High;  //ecx 寄存器

 BYTE Number;    //要读写的扇取数 al
 BYTE CMD;       //命令:2--读,3--写,5--格式化 ah
 WORD EAX_High;  //eax 寄存器

 DWORD EDI;       // edi 寄存器
        DWORD ESI;       // esi
        DWORD EFLAG;     // flags
      }INT13_REGISTERS;

      unsigned char Buffer[512];//定义缓冲区,放置读取扇区数据
      INT13_REGISTERS reg={0};//定义寄存器结构变量
 
      reg.buffer =(void *)Buffer;
      reg.Drive =0;//0-软盘A  1-软盘B 0x80-硬盘c
      reg.Head =0;
      reg.Track=0;
      reg.Sector=1;
      reg.Number=1;
      reg.CMD=2;  //读取
    第三步:调用设备IO API函数DeviceIoControl执行4号命令(即VWIN32_DIOC_DOS_INT13), BOOL b_ret=DeviceIoControl(hDev,4,&reg,sizeof(INT13_REGISTERS),&reg,sizeof(INT13_REGISTERS),&lpRet,0);
如果其返回值不等于零,调用成功,进一步处理....否则调用失败。
    第四步:关闭服务,CloseHandle(hDev);

三、限制或局限
    上面是使用INT13读取软盘扇区的完整步骤,在WIN95/98下它是可以工作的。那么,是否将上面的寄存器结构中的Drive置

[1] [2] [3] [4] 下一页

  • 上一篇文章:

  • 下一篇文章:
  • 相关专题:
     
     网友评论:(评论内容只代表网友观点,与本站立场无关!)
    GOOGLE广告

    阅读排行

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
    中国教师站

    中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
    [备用域名:www.JXZYW.Com] 有事请留言有事请留言
    【实力成就精品 诚信呵护品牌】

    信息产业部备案
    苏ICP备06018635号