Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Probelm bei RAW Zugriff auf Datenträger

  Alt 20. Jan 2007, 12:42
Hallo,

mit folgenden Prozeduren greife ich direkt auf einen Datenträger zu (gefunden habe ich die größtenteils hier im Forum):
Delphi-Quellcode:
procedure TEFS.Close;
var num: Cardinal;
begin
  if Handle <> 0 then
  begin
    DeviceIoControl(Handle, FSCTL_UNLOCK_VOLUME, nil, 0, nil, 0, num, nil);
    CloseHandle(Handle);
    Handle := 0;
  end;
end;

constructor TEFS.Create;
begin
  inherited Create;
  Handle := 0;
end;

destructor TEFS.Destroy;
begin
  Close;
  inherited Destroy;
end;

function TEFS.Loaded: boolean;
begin
  result := handle <> 0;
end;

procedure TEFS.OpenDevice(name: string);
var num: Cardinal;
begin
  Close;
  
  Handle := CreateFile(PChar(name), GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);
  if Handle = INVALID_HANDLE_VALUE then
  begin
     RaiseLastWin32Error;
  end;

  if not DeviceIoControl(Handle, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, num, nil) then
  begin
    RaiseLastWin32Error;
  end;

  if not DeviceIoControl(Handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @Info,
                         SizeOf(TDiskGeometry), num, nil) then
  begin
    RaiseLastWin32Error;
  end;

  if Info.MediaType <> RemovableMedia then
  begin
    //Nur eine Sicherheitsabfrage für mich...
    if Application.MessageBox('Sie haben kein Wechselmedium geöffnet. Sind Sie sich sicher, dass Sie fortfahren möchten?','Wichtiger Hinweis',MB_YESNO) <> ID_YES then
    begin
      Close;
    end;
  end;
end;

procedure TEFS.ReadSektor(var buf);
var num:cardinal;
begin
  if Loaded then
  begin
    Windows.ReadFile(Handle,buf,Info.BytesPerSector,num,nil);
  end;
end;

procedure TEFS.Seek(Sektor: integer);
begin
  if Loaded then
  begin
    FileSeek(Handle, Sektor*Info.BytesPerSector, ord(soBeginning));
  end;
end;
Mit folgender Funktion greife ich darauf zu:

Delphi-Quellcode:
var i:integer;
    buf:array of Byte;
begin
  fs.OpenDevice('\\.\j:');
  fs.Seek(0);
  SetLength(buf,fs.Info.BytesPerSector);
  fs.ReadSektor(buf);
  for i := 0 to fs.Info.BytesPerSector-1 do
  begin
    Label1.Caption := Label1.Caption + inttohex(buf[i],2)+' ';
  end;
end;
Problem ist leider, dass bei fs.ReadSektor nur Müll eingelesen wird und es deshalb bei inttohex(buf[i],2) eine Zugriffsverletzung gibt.

Ich möchte aus Spaß ein kleines, einfaces Dateisystem für Speicherkarten schreiben, damit ich darauf einfach mit Microcontrolern zugreifen kann.

Ich hoffe ihr könnt mir helfen, garantiert ist es wieder ein blöder Fehler, der mich wahnsinig macht...


Igel457
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat