Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probelm bei RAW Zugriff auf Datenträger (https://www.delphipraxis.net/84702-probelm-bei-raw-zugriff-auf-datentraeger.html)

igel457 20. Jan 2007 11:42


Probelm bei RAW Zugriff auf Datenträger
 
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

igel457 20. Jan 2007 12:11

Re: Probelm bei RAW Zugriff auf Datenträger
 
Ok, Problem hat sich gelöst:

Ich habe mal anstatt "var buf" "var buf:array of byte" geschrieben.
Anscheinend geht das...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz