![]() |
Direktes lesen auf dem physischen Datenträger
Wie kann man direkt auf dem physischen Datenträger lesen? Ich würde gerne auf den MBR/GPT und die Bootblöcke der einzelnen Partitionen zugreifen.
Verwendet wird Lazarus. |
AW: Direktes lesen auf dem physischen Datenträger
![]() Das öffnet Festplatte 0 bei Dir (also die erste) |
AW: Direktes lesen auf dem physischen Datenträger
Danke.
Gibt es denn eine Funktion, die mir die erkannten physischen Datenträger auflisten kann? |
AW: Direktes lesen auf dem physischen Datenträger
Hmmm.... das erste war noch einfach für mich zu beantworten da es Winapi war.
Hier mische ich Delphi mit Winapi, keine Ahnung in wie fern das kompatibel zu Lazarus ist. Folgender Code ermittelt alle Laufwerke mit Ihren Namen, da findest Du schon die passende Stelle wo Du Dich reinklinken kannst, wenn nicht, frage :-)
Delphi-Quellcode:
oder enumeriere die Laufwerke auf diese Winapi/Delphi Weise wie
function GetVolumeLabel(DriveChar: Char): string;
var NotUsed: DWORD; VolumeFlags: DWORD; VolumeInfo: array[0..MAX_PATH] of Char; VolumeSerialNumber: DWORD; Buf: array [0..MAX_PATH] of Char; begin GetVolumeInformation(PChar(DriveChar + ':\'), Buf, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed, VolumeFlags, nil, 0); SetString(Result, Buf, StrLen(Buf)); { Set return result } Result:=AnsiUpperCase(Result) end; procedure TForm1.Button1Click(Sender: TObject); var Drive : Char; DriveLetter : String; begin For Drive := 'A' To 'Z' Do begin DriveLetter := Drive + ':\'; If GetDriveType(PChar(DriveLetter)) = DRIVE_FIXED Then begin Memo1.Lines.Add(Drive + ': ' + GetVolumeLabel(Drive)); end; end; end; ![]() Zitat:
|
AW: Direktes lesen auf dem physischen Datenträger
Oder du machst die Abfrage über WMI. Oft bekommt man hier schneller mehr Infos, als sich mit irgendwelche APIs herumzuschlagen.
lg, jus |
AW: Direktes lesen auf dem physischen Datenträger
Liste der Anhänge anzeigen (Anzahl: 1)
*entfernt*
und er schrieb Zitat:
An TE, im Anhang ist ein Binary von dem WMI Beispiel, schau es Dir an, wenn es das ist was Du brauchst das findest Du als ![]() |
AW: Direktes lesen auf dem physischen Datenträger
Er schreibt, dass er auf den MBR zugreifen möchte. Wie hilft ihm da dieses WMI-Beispiel?
|
AW: Direktes lesen auf dem physischen Datenträger
Zitat:
Delphi-Quellcode:
So könnte ein möglicher Aufruf aussehen:
type
TMBR = Array of Byte; Function GetMBR (const DiskNumber: Byte; const MBRSize: Cardinal; out MBR: TMBR): Boolean; var nBytesRead , fHandle : Cardinal; begin fHandle := CreateFile( PChar('\\.\PHYSICALDRIVE'+IntToStr(DiskNumber)), GENERIC_READ, FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if fHandle = INVALID_HANDLE_VALUE then begin Result := False; ShowMessage('CreateFile - Fehler: Invalid Handle' +#13#10#13#10+ 'Hinweis: liegen Admin-Rechte vor?'); exit; end; SetLength(MBR, MBRSize); Result := ReadFile(fHandle, MBR[0], MBRSize, nBytesRead, nil); if nBytesRead-1 <> High(MBR) then Result := False; if not Result then begin ShowMessage('ReadFile - Fehler' +#13#10#13#10+ 'Es sollten '+IntToStr(High(MBR))+ ' bytes gelesen werden' +#13#10+ 'aber nur '+ IntToStr(nBytesRead-1) +' bytes waren lesbar!'); end; CloseHandle(fHandle); end;
Delphi-Quellcode:
So könnte ein möglicher Ansatz für MBR sein.
procedure x;
var MyMBR: TMBR; begin if GetMBR(0, 512, MyMBR) then // <<-- 512 als MBR Größe ist nicht immer korrekt, also vorher diesen Wert ermitteln, das dient nur als Beispiel begin // mach was mit MyMBR end; end; |
AW: Direktes lesen auf dem physischen Datenträger
Ich bin gerade den Code nochmal durchgegangen, es kann sehr gut möglich sein das ich
Delphi-Quellcode:
das falsch habe und es
if nBytesRead-1 <> High(MBR) then Result := False;
Delphi-Quellcode:
lauten müsste, beim weiteren
if nBytesRead <> High(MBR)+1 then Result := False;
Delphi-Quellcode:
das
nBytesRead
Delphi-Quellcode:
dann weglassen aber beim
-1
Delphi-Quellcode:
ein
High(MBR)
Delphi-Quellcode:
ranbaumeln.
+1
|
AW: Direktes lesen auf dem physischen Datenträger
Vielen Dank, für deine großartige Hilfe.
Deine Exe liefert sogar noch viel mehr Informationen, als ich brauche. ;) Mit dem Code lässt sich also sehr gut was anfangen. Der verlinkte Code ließ sich auch fehlerfrei im Lazarus kompilieren. Edit: Hab auch noch einen Fehler im Code gefunden. Bei Writeln(Format('Size %d',[VarToInt(FWbemObject.Size)]));// Uint64 kommt es zu einem Überlauf, da die Funktion selbst nur einen 32 Bit Integer verwendet. Angepasst:
Delphi-Quellcode:
//-----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator http://theroadtodelphi.wordpress.com // Version: 1.8.3.0 // LIABILITY DISCLAIMER // THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. // YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, // DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. //---------------------------------------------------------------------------------------------------- program GetWMI_DiskDriveInfo; {$APPTYPE CONSOLE} uses // SysUtils, ActiveX, ComObj, Variants; SysUtils, ActiveX, ComObj, Variants; function VarToInt(const AVariant: Variant): integer; begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end; function VarToQWord(const AVariant: Variant): QWord; begin Result := StrToQWordDef(Trim(VarToStr(AVariant)), 0); end; // Die Klasse "Win32_DiskDrive" stellt ein physikalisches Laufwerk eines Computer dar, // auf dem das Win32-Betriebssystem ausgeführt wird. Jede Schnittstelle zu einem physikalischen // Win32-Laufwerk ist ein Mitglied dieser Klasse. Die Funktionen des Laufwerks in diesem // Objekt entsprechen den logischen Laufwerkmerkmalen. Ein Objekt, das auf einem anderen logischen Gerät basiert, // ist kein Mitglied dieser Klasse. // Beispiel: IDE-Festplatte. procedure GetWin32_DiskDriveInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; i: integer; begin FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; i:=0; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('*** DISK %d ***',[i])); Writeln(Format('Availability %d',[VarToInt(FWbemObject.Availability)]));// Uint16 Writeln(Format('BytesPerSector %d',[VarToInt(FWbemObject.BytesPerSector)]));// Uint32 // Writeln(Format('Capabilities %d',[VarToInt(FWbemObject.Capabilities)]));// Array of Uint16 // Writeln(Format('CapabilityDescriptions %s',[VarToStr(FWbemObject.CapabilityDescriptions)]));// Array of VarToStr Writeln(Format('Caption %s',[VarToStr(FWbemObject.Caption)]));// VarToStr Writeln(Format('CompressionMethod %s',[VarToStr(FWbemObject.CompressionMethod)]));// String Writeln(Format('ConfigManagerErrorCode %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32 Writeln(Format('ConfigManagerUserConfig %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean Writeln(Format('CreationClassName %s',[VarToStr(FWbemObject.CreationClassName)]));// String Writeln(Format('DefaultBlockSize %d',[VarToInt(FWbemObject.DefaultBlockSize)]));// Uint64 Writeln(Format('Description %s',[VarToStr(FWbemObject.Description)]));// String Writeln(Format('DeviceID %s',[VarToStr(FWbemObject.DeviceID)]));// String Writeln(Format('ErrorCleared %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean Writeln(Format('ErrorDescription %s',[VarToStr(FWbemObject.ErrorDescription)]));// String Writeln(Format('ErrorMethodology %s',[VarToStr(FWbemObject.ErrorMethodology)]));// String Writeln(Format('FirmwareRevision %s',[VarToStr(FWbemObject.FirmwareRevision)]));// String Writeln(Format('Index %d',[VarToInt(FWbemObject.Index)]));// Uint32 Writeln(Format('InstallDate %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime Writeln(Format('InterfaceType %s',[VarToStr(FWbemObject.InterfaceType)]));// String Writeln(Format('LastErrorCode %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32 Writeln(Format('Manufacturer %s',[VarToStr(FWbemObject.Manufacturer)]));// String Writeln(Format('MaxBlockSize %d',[VarToInt(FWbemObject.MaxBlockSize)]));// Uint64 Writeln(Format('MaxMediaSize %d',[VarToInt(FWbemObject.MaxMediaSize)]));// Uint64 Writeln(Format('MediaLoaded %s',[VarToStr(FWbemObject.MediaLoaded)]));// Boolean Writeln(Format('MediaType %s',[VarToStr(FWbemObject.MediaType)]));// String Writeln(Format('MinBlockSize %d',[VarToInt(FWbemObject.MinBlockSize)]));// Uint64 Writeln(Format('Model %s',[VarToStr(FWbemObject.Model)]));// String Writeln(Format('Name %s',[VarToStr(FWbemObject.Name)]));// String Writeln(Format('NeedsCleaning %s',[VarToStr(FWbemObject.NeedsCleaning)]));// Boolean Writeln(Format('NumberOfMediaSupported %d',[VarToInt(FWbemObject.NumberOfMediaSupported)]));// Uint32 Writeln(Format('Partitions %d',[VarToInt(FWbemObject.Partitions)]));// Uint32 Writeln(Format('PNPDeviceID %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String Writeln(Format('PowerManagementCapabilities %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16 Writeln(Format('PowerManagementSupported %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean Writeln(Format('SCSIBus %d',[VarToInt(FWbemObject.SCSIBus)]));// Uint32 Writeln(Format('SCSILogicalUnit %d',[VarToInt(FWbemObject.SCSILogicalUnit)]));// Uint16 Writeln(Format('SCSIPort %d',[VarToInt(FWbemObject.SCSIPort)]));// Uint16 Writeln(Format('SCSITargetId %d',[VarToInt(FWbemObject.SCSITargetId)]));// Uint16 Writeln(Format('SectorsPerTrack %d',[VarToInt(FWbemObject.SectorsPerTrack)]));// Uint32 Writeln(Format('SerialNumber %s',[TRIM(VarToStr(FWbemObject.SerialNumber))]));// String Writeln(Format('Signature %d',[VarToInt(FWbemObject.Signature)]));// Uint32 Writeln(Format('Size %d Byte = %f GB',[VarToQWord(FWbemObject.Size),VarToQWord(FWbemObject.Size)/(1000000000)]));// Uint64 Writeln(Format('Status %s',[VarToStr(FWbemObject.Status)]));// String Writeln(Format('StatusInfo %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16 Writeln(Format('SystemCreationClassName %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String Writeln(Format('SystemName %s',[VarToStr(FWbemObject.SystemName)]));// String Writeln(Format('TotalCylinders %d',[VarToInt(FWbemObject.TotalCylinders)]));// Uint64 Writeln(Format('TotalHeads %d',[VarToInt(FWbemObject.TotalHeads)]));// Uint32 Writeln(Format('TotalSectors %d',[VarToInt(FWbemObject.TotalSectors)]));// Uint64 Writeln(Format('TotalTracks %d',[VarToInt(FWbemObject.TotalTracks)]));// Uint64 Writeln(Format('TracksPerCylinder %d',[VarToInt(FWbemObject.TracksPerCylinder)]));// Uint32 Writeln('----------------------------------------------------------------------------'); FWbemObject:=Unassigned; inc(i); end; end; begin try CoInitialize(nil); try GetWin32_DiskDriveInfo; finally CoUninitialize; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 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