type
    TDIOC_REGISTERS = packed record
        reg_EBX: DWORD;
        reg_EDX: DWORD;
        reg_ECX: DWORD;
        reg_EAX: DWORD;
        reg_EDI: DWORD;
        reg_ESI: DWORD;
        reg_Flags: DWORD;
    end;    TTransfer = record
        StartSector: Longint;
        SectorCount: Word;
        Buffer: Longint;
    end;const
    VWIN32_DIOC_DOS_DRIVEINFO = 6;function myproc:boolean;
var
    hDevice: thandle;
    reg: TDIOC_REGISTERS;
    fResult: boolean;
    cb: dword;
    transfer: ttransfer;
    buf: array[0..511] of char;
const
    nDrive = 3; // Drive C:
begin
    hDevice := CreateFile('\\.\VWIN32', GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE,
        nil, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);    if hdevice = INVALID_HANDLE_VALUE then exit;    transfer.StartSector := 0;
    transfer.SectorCount := 1;
    transfer.Buffer := longint(@buf);    reg.reg_ESI := 0;
    reg.reg_EAX := $7305;
    reg.reg_EBX := longint(@transfer);
    reg.reg_ECX := $FFFFFFFF;
    reg.reg_EDX := ndrive;
    reg.reg_Flags := 0;    Result := DeviceIoControl(hDevice, VWIN32_DIOC_DOS_DRIVEINFO,
        @reg, sizeof(reg), @reg, sizeof(reg), cb, 0);    CloseHandle(hDevice);
end;

解决方案 »

  1.   

    呵呵,谢谢Eastunfail(恶鱼杀手) ,不过不是这个问题。我想可能是reg中填的数据不对吧。
      

  2.   

    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");
            }}