Registriert seit: 31. Aug 2005
1.622 Beiträge
FreePascal / Lazarus
|
Probelm bei RAW Zugriff auf Datenträger
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
|