Autor Beitrag
Planschi69
Hält's aus hier
Beiträge: 7

win 98
ab 1.0
BeitragVerfasst: So 27.02.05 21:17 
Benutze WIN 98

Wie kann ich unter Delphi 7 einzelne sektoren der Festplatte lesen bzw. schreiben.
Habe schon verschiedene sachen ausprobiert, doch entweder stürzt mein Rechner ab oder es funktioniert nur auf Laufwerk A:\

Wer kann helfen ?
Warum funktioniert der folgende Code nicht, auch wenn ich die betreffenden Zeilen für Laufwerk c:\ ändere ?

ausblenden volle Höhe Delphi-Quelltext
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; // Prforms Interrupt 13h commands
  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  {Win95/98}
    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; // ??? ???????? read sector
    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 {Win95}
  else
  begin // Windows NT
    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 ); {????????? ? 1}
    Result := ReadFile(hDevice, buffer^, SectorSize, nb, nil) and
      (nb=SectorSize);
    CloseHandle(hDevice);
  end;
end;


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.

_________________
BM
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 27.02.05 21:23 
der code führt DOS-Interrupts aus - vermutlich ist die gewählte INT13h-funktion nur für Diskettenlaufwerke