AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Festplatten und Partitionen herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Festplatten und Partitionen herausfinden

Ein Thema von delphin06 · begonnen am 13. Apr 2007 · letzter Beitrag vom 14. Apr 2007
Antwort Antwort
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#1

Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:13
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:30
In dem Delphi Programm SysInfo von meiner Homepage sind entsprechende Units mit Klassen enthalten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#3

Re: Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:31
cool ich guck mal rein
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:35
Oder per WMI
Markus Kinzler
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#5

Re: Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:38
könntest du n codebeispiel geben?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Festplatten und Partitionen herausfinden

  Alt 13. Apr 2007, 14:43
http://derentwickler.de/itr/online_a...nodeid,56.html
http://www.delphipraxis.net/internal...ct.php?t=89423
Markus Kinzler
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#7

Re: Festplatten und Partitionen herausfinden

  Alt 14. Apr 2007, 13:32
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?
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#8

Re: Festplatten und Partitionen herausfinden

  Alt 14. Apr 2007, 16:03
Also ich bin jetzt ein stückchen weiter...
ich habe hier im forum die unit hddinfo.pas gefunden:

Delphi-Quellcode:
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 jetzt die funktion serialnumbertext aufrufe gibt er mir ne 8stellige seriennummer aus.
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
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Festplatten und Partitionen herausfinden

  Alt 14. Apr 2007, 16:55
Delphi-Quellcode:
  FFileHandle := CreateFile(
                     PChar('\\.\PhysicalDrive' + ByteToChar(FDriveNumber)),
                     0,
                     FILE_SHARE_READ or FILE_SHARE_WRITE,
                     nil,
                     OPEN_EXISTING,
                     0,
                     0
                   );
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

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#10

Re: Festplatten und Partitionen herausfinden

  Alt 14. Apr 2007, 17:11
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...
  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 16:40 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