1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| type
pDIOCRegs = ^TDIOCRegs; TDIOCRegs = packed record rEBX, rEDX, rECX, rEAX, rEDI, rESI, rFlags : DWORD; end;
const VWIN32_DIOC_DOS_IOCTL = 1; VWIN32_DIOC_DOS_INT13 = 4; SectorSize = 512;
function ReadSector(Head, Track, Sector: Integer; buffer: pointer; Floppy: char):Boolean; var hDevice: THandle; Regs: TDIOCRegs; DevName: string; nb: Integer; begin if WIN32PLATFORM <> VER_PLATFORM_WIN32_NT then begin hDevice := CreateFile('\\.\vwin32',GENERIC_READ, 0, nil, 0, FILE_FLAG_DELETE_ON_CLOSE, 0); if (hDevice = INVALID_HANDLE_VALUE) then begin Result:=False; Exit; end; Regs.rEDX := Head * $100 + Ord(Floppy in ['b','B']); Regs.rEAX := $201; Regs.rEBX := DWORD(buffer); Regs.rECX := Track * $100 + Sector; Regs.rFlags := $0; Result := DeviceIOControl(hDevice, VWIN32_DIOC_DOS_INT13, @Regs, sizeof(Regs), @Regs, sizeof(Regs), nb, nil) and ((Regs.rFlags and $1)=0); CloseHandle(hDevice); end else begin DevName := '\\.\A:'; if Floppy in ['b','B'] then DevName[5] := Floppy; hDevice := CreateFile(pChar(DevName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hDevice = INVALID_HANDLE_VALUE) then begin Result:=False; Exit; end; SetFIlePointer(hDevice, (Sector-1) * SectorSize, nil, FILE_BEGIN ); Result := ReadFile(hDevice, buffer^, SectorSize, nb, nil) and (nb=SectorSize); CloseHandle(hDevice); end; end; |