??

解决方案 »

  1.   

    (转贴)用C++ BUILDER 编写如下的程序来读区物理磁盘的绝对扇区,对软盘可用,但对硬盘不管用
    不知问题出在哪里,请各位指教:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            DWORD w;
            int v;
            hDevice=CreateFile("\\\\.\\VWIN32",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
            NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
            if(hDevice!=NULL)
            {  w=1;
               w=w<<8;
               v=0x80;
               reg.reg_EAX=0x440D;
               reg.reg_EBX=v|w;
               reg.reg_ECX=0x084B;
               reg.reg_EDX=1;
               reg.reg_Flags=0x0001;
              fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_IOCTL,?,sizeof(reg),?,sizeof(reg),&cb1,0);
               if(!fresult||(reg.reg_Flags & 0x0001))
                  ShowMessage("Fail1");
               reg.reg_EAX=0x0201; //读硬盘的0面0柱面1扇区,数量为一扇区.
               reg.reg_EBX=(DWORD)&boot; //定义为 BYTE boot[512];
               reg.reg_ECX=0x0001;//
               reg.reg_EDX=v;
               reg.reg_Flags=0x0001;
               fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,?,sizeof(reg),?,sizeof(reg),&cb1,0);
               if(!fresult||(reg.reg_Flags & 0x0001))
                  ShowMessage("Fail2");
               Edit2->Text=AnsiString(boot[StrToInt(Edit1->Text)]);
               reg.reg_EAX=0x440d;
               reg.reg_EBX=v;
               reg.reg_ECX=0x086b;
               reg.reg_Flags=0x0001;
               DeviceIoControl(hDevice,VWIN32_DIOC_DOS_IOCTL,?,sizeof(reg),?,sizeof(reg),&cb1,0);
               if(!fresult||(reg.reg_Flags & 0x0001))
                  ShowMessage("Fail3");
            }}
      

  2.   

    Win95和DOS不一样,不支持对硬盘BIOS函数的调用,不能从保护模式到V86模式BIOS硬盘请求的转化。调用ROM BIOS会变成使用了一个无效的地址。