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