Thema: Delphi Sektoren auslesen

Einzelnen Beitrag anzeigen

nice

Registriert seit: 26. Jan 2004
12 Beiträge
 
#16

Re: Sektoren auslesen

  Alt 1. Mär 2004, 12:21
habs immer noch nicht geschafft - es kommt ein fehler beim rawreadsektors - keine idee mehr
es geht nur um die letzten zeilen

oder hat jemand nen test - eingabe des sektors und laufwerk - ausgabe:defekt ja/nein

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDiskGeometry = packed record
    Cylinders: Int64;
    MediaType: Integer;
    TracksPerCylinder: DWORD;
    SectorsPerTrack: DWORD;
    BytesPerSector: Integer; // wichtig für die Reservierung des Buffer-Speichers
  end;

  TRawDrive = record
    DiskGeometry: TDiskGeometry;
    Handle: THandle;
  end;

  TForm1 = class(TForm)
    Ergebnis: TLabel;
    Sektor: TEdit;
    OK: TButton;
    procedure SektorKeyPress(Sender: TObject; var Key: Char);
    procedure OKClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public

    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  sektor1:Integer;
  sektordaten:String;
  handle:cardinal;
  drive:TRawDrive;
const
  IOCTL_DISK_GET_DRIVE_GEOMETRY = $00070000;
  FSCTL_LOCK_VOLUME = $00090018;
  FSCTL_UNLOCK_VOLUME = $0009001C;

implementation

{$R *.dfm}


function RawOpenDrive(DriveLetter: Char): TRawDrive;
var num,h: Cardinal;
begin
h:=0;
  FillChar(Result, SizeOf(TRawDrive), 0);

  Result.Handle := CreateFile(PChar('\\.\' + DriveLetter + ':'),
                       GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);
  if Result.Handle = INVALID_HANDLE_VALUE then RaiseLastOSError;

// Laufwerk für andere sperren
if not DeviceIoControl(h, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, num, nil) then
RaiseLastOSError;

{ Disk-Geometry ermitteln. Vor allem ist das Feld BytesPerSector wichtig, da nur vielfache Bytes gelesen werden können. Ist also BytesPerSector z.B: 512 und man will nur 1 Byte lesen, muss man 512 Bytes lesen. }
 if not DeviceIoControl(Handle,IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0,@Result.DiskGeometry,SizeOf(TDiskGeometry), num, nil) then
  RaiseLastOSError;
end;

procedure RawCloseDrive(var RawDrive: TRawDrive);
var num: Cardinal;
begin
  DeviceIoControl(RawDrive.Handle, FSCTL_UNLOCK_VOLUME, nil, 0, nil, 0, num, nil);
  CloseHandle(RawDrive.Handle);
  RawDrive.Handle := 0;
end;

procedure RawReadSectors(const RawDrive: TRawDrive; var Buf; Count: Integer);
var num: Cardinal;
begin
  if not ReadFile(RawDrive.Handle, Buf, Count * RawDrive.DiskGeometry.BytesPerSector, num, nil) then
    RaiseLastOSError;
end;

procedure RawWriteSectors(const RawDrive: TRawDrive; var Buf; Count: Integer);
var num: Cardinal;
begin
  if not WriteFile(RawDrive.Handle, Buf, Count * RawDrive.DiskGeometry.BytesPerSector, num, nil) then
    RaiseLastOSError;
end;

procedure TForm1.SektorKeyPress(Sender: TObject; var Key: Char);
var sektorstring:String ;
begin
if key = #13 then begin
sektorstring := sektor.Text;
sektor1 := StrToInt(sektorstring);
end;
end;

procedure TForm1.OKClick(Sender: TObject);
begin
Drive:=RawOpenDrive('d'); //das mach ich später variabel,jetzt reicht erstmal laufwerk d zum testen
RawReadSectors(Drive,0,sektor1) //(Fehler)unit1.pas(111):konstantenobjektkann nicht als var-parameter weitergegeben werden
//das soll noch folgen,aber nur temporär : Ergebnis.Caption:=sektordaten;
end;

end.
  Mit Zitat antworten Zitat