![]() |
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:
Mit folgender Funktion greife ich darauf zu:
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;
Delphi-Quellcode:
Problem ist leider, dass bei fs.ReadSektor nur Müll eingelesen wird und es deshalb bei inttohex(buf[i],2) eine Zugriffsverletzung gibt.
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; 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 |
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 05:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz