AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Probelm bei RAW Zugriff auf Datenträger
Thema durchsuchen
Ansicht
Themen-Optionen

Probelm bei RAW Zugriff auf Datenträger

Ein Thema von igel457 · begonnen am 20. Jan 2007 · letzter Beitrag vom 20. Jan 2007
Antwort Antwort
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, 11: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
Benutzerbild von igel457
igel457

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

Re: Probelm bei RAW Zugriff auf Datenträger

  Alt 20. Jan 2007, 12:11
Ok, Problem hat sich gelöst:

Ich habe mal anstatt "var buf" "var buf:array of byte" geschrieben.
Anscheinend geht das...
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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