Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PhysicalDriveX - Was versteckt sich eigentlich dahinter? (https://www.delphipraxis.net/139220-physicaldrivex-versteckt-sich-eigentlich-dahinter.html)

Mithrandir 25. Aug 2009 20:48


PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Tja :oops:

Ehrlich gesagt, bin ich mir beim Titel nicht so sicher. Es geht sich strenggenommen um folgendes:

Ich schreibe eine Anwendung, die Festplatteninformationen auslesen soll. Ich habe mir dazu Luckies HDDInfo.pas angesehen, und habe festgestellt, dass er es sich recht einfach gemacht hat:

Delphi-Quellcode:
procedure THDDInfo.GetHDDsCount;
var
  i           : Integer;
  Device      : string;
  hDevice     : Cardinal;
begin
  for i := 0 to 9 do
  begin
    Device := '\\.\PhysicalDrive' + IntToStr(i);
    hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ or
      FILE_SHARE_WRITE,
      nil, OPEN_EXISTING, 0, 0);
    if hDevice <> INVALID_HANDLE_VALUE then
      Inc(FHDDsCount);
  end;
end;
So wird die Anzahl der Festplatten ermittelt. Und die DiskGeometry wird so ermittelt:

Delphi-Quellcode:
procedure THDDInfo.GetDiskGeometry;
var
  i           : Integer;
  Device      : string;
  hDevice     : Cardinal;
  dg          : DISK_GEOMETRY;
  dummy       : DWORD;
begin
  setlength(FCylinders, FHDDsCount);
  setlength(FTracksPercylinder, FHDDsCount);
  setlength(FSectorsPerTrack, FHDDsCount);
  setlength(FBytesPerSector, FHDDsCount);
  for i := 0 to FHDDsCount - 1 do
  begin
    Device := '\\.\PhysicalDrive' + IntToStr(i);
    hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ
      or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
    if hDevice <> INVALID_HANDLE_VALUE then
    begin
      if DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @dg,
        sizeof(dg), dummy, nil) = true then
      begin
        FCylinders[i] := dg.Cylinders.QuadPart;
        FTracksPerCylinder[i] := dg.TracksPerCylinder;
        FSectorsPerTrack[i] := dg.SectorsPerTrack;
        FBytesPerSector[i] := dg.BytesPerSector;
      end
      else
      begin
        FCylinders[i] := 0;
        FTracksPerCylinder[i] := 0;
        FSectorsPerTrack[i] := 0;
        FBytesPerSector[i] := 0;
      end;
    end;
    CloseHandle(hDevice);
  end;
end;
Daraus schließe ich, dass es sich bei "PhysicalDriveX" immer um "FixedMedia" handeln muss. Stimmt das? Wenn nicht, dann hat Luckies Code imho diesen Denkfehler drin...

Zacherl 25. Aug 2009 20:53

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Die PhysicalDrive Ports sind dazu da, um "physisch" auf Festplatten zu schreiben, davon zu lesen oder halt Informationen über die Medien zu ermitteln. Auf fixed Media beschränkt sind diese Zugriffe allerdings nicht. Z.B. meine Externe Festplatte (USB) kann ich ohne weiteres auch per PhysicalDrive ansprechen.

Mithrandir 25. Aug 2009 20:57

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Zitat:

Zitat von Zacherl
Ja die PhysicalDrive Ports sind dazu da, um "physisch" auf Festplatten zu schreiben oder davon zu lesen. Auf fixed Media beschränkt sind diese Zugriffe allerdings nicht. Z.b. meine Externe Festplatte (USB) kann ich ohne weiteres auch per PhysicalDrive ansprechen.

Hmm.... Ok, danke. Das heißt, folgendes Szenario wäre theoretisch auch möglich?

PhysicalDrive0 - Festplatte 1
PhysicalDrive1 - Festplatte 2
PhysicalDrive2 - DVD-Brenner
PhysicalDrive3 - Festplatte 3

Zacherl 25. Aug 2009 20:59

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Nein, das ist nicht möglich. Nach meiner Erfahrung können nur Festplatten so angesprochen werden (Hierbei ist es aber egal, ob diese fest verbaut sind, oder extern angeschlossen wurden). Ob auf USB Sticks oder sonstige festplattenähnlichen Speichermedien auch auf diese Weise zugegriffen werden kann, weiß ich nicht.

Mithrandir 25. Aug 2009 21:04

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Hm, ok. Ich denke, ich werden dann die Laufwerksnummer zusätzlich mit in meiner Struktur speichern und im Vorfeld prüfen, ob das Laufwerk SMART-fähig ist und ansonsten verwerfen.

Danke. ;)


P.S.: Hab grad ne SD-Karte in den internen Card Reader geschoben. Sie ist zumindest über PhysicalDrive ansprechbar... :|

Zacherl 25. Aug 2009 21:06

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Das meinte ich mit "festplatten-ähnliche" Medien :) Sowas wie DVD Laufwerke / Brenner wirst du nicht ansprechen können. USB Sticks, MemoryCards, etc dann wohl schon. Dazu kannst du aber auch per MSDN-Library durchsuchenGetDriveType den Typ des Laufwerks abfragen, wenn das für dich von Belang ist.

Matze 25. Aug 2009 21:18

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Ich weiß nicht, ob das alles noch seine Gültigkeit hat (Vista, Win7), aber in der Code-Library gibt es einen ganz netten Eintrag zu dem Thema: Laufwerke finden und erkennen. Evtl. kannst du das mit in deinen Code einfließen lassen.

Grüße, Matze

Mithrandir 25. Aug 2009 21:22

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Hey ihr zwei,

Danke nochmal. ;)

Da für mich eh nur Laufwerke interessant sind, die S.M.A.R.T. unterstützen, filter ich sie nach diesem Kriterium. :)

Luckie 25. Aug 2009 22:15

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Zitat:

Zitat von Daniel G
Ich habe mir dazu Luckies HDDInfo.pas angesehen,

Musst du diese Jugendsünde von mir unbedingt wieder rauskramen? :mrgreen:

himitsu 25. Aug 2009 23:34

Re: PhysicalDriveX - Was versteckt sich eigentlich dahinter?
 
Zitat:

Zitat von Daniel G
Zitat:

Zitat von Zacherl
Ja die PhysicalDrive Ports sind dazu da, um "physisch" auf Festplatten zu schreiben oder davon zu lesen. Auf fixed Media beschränkt sind diese Zugriffe allerdings nicht. Z.b. meine Externe Festplatte (USB) kann ich ohne weiteres auch per PhysicalDrive ansprechen.

Hmm.... Ok, danke. Das heißt, folgendes Szenario wäre theoretisch auch möglich?

PhysicalDrive0 - Festplatte 1
PhysicalDrive1 - Festplatte 2
PhysicalDrive2 - DVD-Brenner
PhysicalDrive3 - Festplatte 3

inkl. IDE/SATA via USB/Firewire
inkl. Speicherkarten
inkl. USB-Sticks
exkl. DVD/CD
exkl. DAT-Streamer
exkl. Disketten

also fast alles, welches sich wie eine Festplatte ansteuern läßt


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Seite 1 von 2  1 2      

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