![]() |
Festplatten und Partitionen herausfinden
Hi
Gibt es eine Möglichkeit mit der man die Anzahl der Festplatten und wieviel Partitionen sich jeweils darauf befinden auszulesen. Ich kenne mich mit der Windows API noch nich so aus... Vielen Dank schonmal Greetz |
Re: Festplatten und Partitionen herausfinden
In dem Delphi Programm SysInfo von meiner Homepage sind entsprechende Units mit Klassen enthalten.
|
Re: Festplatten und Partitionen herausfinden
cool ich guck mal rein
|
Re: Festplatten und Partitionen herausfinden
Oder per WMI
|
Re: Festplatten und Partitionen herausfinden
könntest du n codebeispiel geben?
|
Re: Festplatten und Partitionen herausfinden
|
Re: Festplatten und Partitionen herausfinden
hmm das bringt mich nich wirklich weiter!
Ich muss das anders machen...kann man eine Festplatte genau identifizieren? Folgendes Problem: Ich habe zwei externe Festplatten die ich mit USB anschließen kann. Aber je nach dem, welche ich zuerst reinstecke ist die erste dann Festplatte 2 und die zweite ist Festplatte 3. Wenn ich die in umgekehrter reihenfolge einstecke ist es logischerweise genau umgekehrt. Ich müsste jez die Festplatten genau identifizieren können. Das Problem ist, es können auch die gleichen sein, d.h. vom gleichen Hersteller mit gleicher Größe. Gibts da ne spezifische Nummer die sich nicht ändert und die man auslesen kann? |
Re: Festplatten und Partitionen herausfinden
Also ich bin jetzt ein stückchen weiter...
ich habe hier im forum die unit hddinfo.pas gefunden:
Delphi-Quellcode:
wenn ich jetzt die funktion serialnumbertext aufrufe gibt er mir ne 8stellige seriennummer aus.
unit hddinfo;
interface uses Windows, SysUtils, Classes; const IOCTL_STORAGE_QUERY_PROPERTY = $2D1400; type THDDInfo = class (TObject) private FDriveNumber: Byte; FFileHandle: Cardinal; FInfoAvailable: Boolean; FProductRevision: string; FProductId: string; FSerialNumber: string; FVendorId: string; procedure ReadInfo; procedure SetDriveNumber(const Value: Byte); public constructor Create; property DriveNumber: Byte read FDriveNumber write SetDriveNumber; property VendorId: string read FVendorId; property ProductId: string read FProductId; property ProductRevision: string read FProductRevision; property SerialNumber: string read FSerialNumber; function SerialNumberInt: Cardinal; function SerialNumberText: string; function IsInfoAvailable: Boolean; end; implementation type STORAGE_PROPERTY_QUERY = packed record PropertyId: DWORD; QueryType: DWORD; AdditionalParameters: array[0..3] of Byte; end; STORAGE_DEVICE_DESCRIPTOR = packed record Version: ULONG; Size: ULONG; DeviceType: Byte; DeviceTypeModifier: Byte; RemovableMedia: Boolean; CommandQueueing: Boolean; VendorIdOffset: ULONG; ProductIdOffset: ULONG; ProductRevisionOffset: ULONG; SerialNumberOffset: ULONG; STORAGE_BUS_TYPE: DWORD; RawPropertiesLength: ULONG; RawDeviceProperties: array[0..511] of Byte; end; function ByteToChar(const B: Byte): Char; begin Result := Chr(B + $30) end; function SerialNumberToCardinal (SerNum: String): Cardinal; begin HexToBin(PChar(SerNum), PChar(@Result), SizeOf(Cardinal)); end; function SerialNumberToString(SerNum: String): String; var I, StrLen: Integer; Pair: string; B: Byte; Ch: Char absolute B; begin Result := ''; StrLen := Length(SerNum); if Odd(StrLen) then Exit; I := 1; while I < StrLen do begin Pair := Copy (SerNum, I, 2); HexToBin(PChar(Pair), PChar(@B), 1); Result := Result + Chr(B); Inc(I, 2); end; I := 1; while I < Length(Result) do begin Ch := Result[I]; Result[I] := Result[I + 1]; Result[I + 1] := Ch; Inc(I, 2); end; end; constructor THddInfo.Create; begin inherited; SetDriveNumber(0); end; function THDDInfo.IsInfoAvailable: Boolean; begin Result := FInfoAvailable end; procedure THDDInfo.ReadInfo; type PCharArray = ^TCharArray; TCharArray = array[0..32767] of Char; var Returned: Cardinal; Status: LongBool; PropQuery: STORAGE_PROPERTY_QUERY; DeviceDescriptor: STORAGE_DEVICE_DESCRIPTOR; PCh: PChar; begin FInfoAvailable := False; FProductRevision := ''; FProductId := ''; FSerialNumber := ''; FVendorId := ''; try FFileHandle := CreateFile( PChar('\\.\PhysicalDrive' + ByteToChar(FDriveNumber)), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if FFileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError; ZeroMemory(@PropQuery, SizeOf(PropQuery)); ZeroMemory(@DeviceDescriptor, SizeOf(DeviceDescriptor)); DeviceDescriptor.Size := SizeOf(DeviceDescriptor); Status := DeviceIoControl( FFileHandle, IOCTL_STORAGE_QUERY_PROPERTY, @PropQuery, SizeOf(PropQuery), @DeviceDescriptor, DeviceDescriptor.Size, Returned, nil ); if not Status then RaiseLastOSError; if DeviceDescriptor.VendorIdOffset <> 0 then begin PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.VendorIdOffset]; FVendorId := PCh; end; if DeviceDescriptor.ProductIdOffset <> 0 then begin PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductIdOffset]; FProductId := PCh; end; if DeviceDescriptor.ProductRevisionOffset <> 0 then begin PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductRevisionOffset]; FProductRevision := PCh; end; if DeviceDescriptor.SerialNumberOffset <> 0 then begin PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.SerialNumberOffset]; FSerialNumber := PCh; end; FInfoAvailable := True; finally if FFileHandle <> INVALID_HANDLE_VALUE then CloseHandle(FFileHandle); end; end; function THDDInfo.SerialNumberInt: Cardinal; begin Result := 0; if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToCardinal(FSerialNumber) end; function THDDInfo.SerialNumberText: string; begin Result := ''; if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToString(FSerialNumber) end; procedure THDDInfo.SetDriveNumber(const Value: Byte); begin FDriveNumber := Value; ReadInfo; end; end. wenn ich das richtig verstehe setzt der die drivenumber auf 0, also denke ich mal auf festplatte 1. wie kann ich die sereinnummern der anderen festplatten ermitteln (externe USB Festplatten)? wenn ich drive number auf 2 setzte gibt der nix aus... [EDIT]Hab jez mal Sandra installiert und geguckt was das anzeigt. Die Seriennummer stimmt schonmal von Festplatte 1. Allerdings liefert mir Sandra auch keine Seriennummer für die USB Festplatte. Also liegt es wohl daran! Wahrscheinlich kann man die Seriennummer nicht über USB auslesen :( |
Re: Festplatten und Partitionen herausfinden
Delphi-Quellcode:
Kann es sein, dass eine USB-Festplatte als Wechseldatenträger erkannt wird, und somit bei "PhysicalDrive" nicht beachtet wird. Der Code ist mir ehrlich gesagt etwas zu kompliziert, aber das ist mir eben ins Auge gefallen und in der Datenträgerverwaltung von Windows wird es als solches (Wechseldatenträger) erkannt. Vielleicht hilft es Dir ja bei Deinen Überlegungen. Weiterhin viel Glück :-)
FFileHandle := CreateFile(
PChar('\\.\PhysicalDrive' + ByteToChar(FDriveNumber)), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); SCRaT |
Re: Festplatten und Partitionen herausfinden
jo es ist als Massenspeicher aufgeführt, steht allerdings im Explorer unter Festplatten und nicht als Wechselmedium...ich muss das wohl anders angehen...
[EDIT] im Gerätemanager ist die USB Festplatte als Laufwerk aufgeführt und mein USB Stick aber auch, dieser ist aber auch noch unter Tragbare Geräte zu finden... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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