![]() |
Sektoren auslesen
Hallo,
wie kann ich von einem Datenträger gezielt einen Sektor auslesen. Ich möchte nämlich dann herausfinden, ob der entsprechende Sektor fehlerhaft ist. |
Für welches Betriebssystem und was für ein Dateiformat (NTFS, FAT16, FAT32, ...) Ist schon wichtig dass zu wissen, ist schliesslich immer wieder anders ;)
...:cat:... |
Also wenn ich in die Windows API Sparte poste, werde ich als Betriebssystem Windows benutzen :) (oder hab ich die falsche Sparte erwischt?!).
Und die meisten Disketten nutzen ja FAT32. |
Du hast nur "Datenträger" geschrieben und das kann auch eine Festplatte oder CD-ROM sein. :wink:
|
Bei Disketten muss ich leider passen, sorry ;)
...:cat:... |
Zitat:
Für NT-basierte ist es um einiges einfacher als für 9x-basierte. ab WinNT 3.5 (also kein 9x/ME)
Delphi-Quellcode:
Hier fehlt noch das RawSeek, jedoch brauchte ich bei meinem Diskettenkopierprogramm dieses nicht und habe es somit auch nicht programmiert. Die benötigte API Funktion wäre SetFilePointer. Hier ist aber auch wieder darauf zu achten, dass nur an Sektorgrenzen gesprungen werden kann.
uses Windows;
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; var IOCTL_DISK_GET_DRIVE_GEOMETRY = $00070000; FSCTL_LOCK_VOLUME = $00090018; FSCTL_UNLOCK_VOLUME = $0009001C; function RawOpenDrive(DriveLetter: Char): TRawDrive; var num: Cardinal; begin 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(Result, 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(h, 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; |
Zitat:
Tja so kann man sich täuschen... ;) Achso, stimmt ja in solche Sachen gehen 9x und NT anders ran. Ne ich habe (leider) Windows XP Home Edition @jbg: Danke ich werde mir später den Code nochmal genau anschauen! |
Genau das!!
Das ist genau das Programm das ich brauche.
Frage: Muss das Prog als Konsolen-Anwendung kompiliert werden? Das erste Problem tritt schon bei der Variablen Definition auf Delphi 5.0 checkt das irgendwie nicht.
Code:
[Fehler] Project2.dpr(19): ',' oder ':' erwartet, aber '=' gefunden
var
IOCTL_DISK_GET_DRIVE_GEOMETRY = $00070000; FSCTL_LOCK_VOLUME = $00090018; FSCTL_UNLOCK_VOLUME = $0009001C; [Fehler] Project2.dpr(19): '..' erwartet, aber ';' gefunden usw.... |
Jeder aufmerksame Programmierer sieht, dass es sich hier:
Delphi-Quellcode:
um keine Variabledeklaration, sondern um eine Konstantendeklaration handelt. Und jeder clevere Programmierer, kommt dann auf die Idee und ersetzt das var durch const. :wink:
IOCTL_DISK_GET_DRIVE_GEOMETRY = $00070000;
War wohl der ScripptKiddie-CopyAndPaste-Schutz und du bist voll reingetappt in die Falle. :mrgreen: |
Re: Sektoren auslesen
nabend erstmal
ich hätt mal ne frage zu dem source:
Delphi-Quellcode:
bei mir kommt bei der result ein fehler,es wäre eine Trawdrive - ist ja klar deklariert
if not DeviceIoControl(Result, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, num, nil) then
RaiseLastOSError; er will aber an der stelle eine cardinal wie kann ich das beheben ? oder gibts ne schönere variante sektoren einer cd auszulesen(als rückgabe reicht auch defekt : true/false) soll ein kleiner "kopierschutz" werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 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