Physikalische Nummer eines Datenträgers ermitteln ?
-
Hallo, wer kann mir bitte helfen ?
Ich hatte schon mal vor längerer Zeit angefragt, aber mein Problem ist leider immer noch nicht gelöst... Vielleicht kann mir ja jetzt jemand helfen?
Mit der API-Funktion SetupDiEnumDeviceInterfaces() können alle im System aktiven Festplatten/Devices ermittelt werden. Über SetupDiGetDeviceInterfaceDetail() bekomme ich dann einen Device-Namen im Klartext, mit dem ich dann das Device mit CreateFile() öffnen.
Dieser Device-Name ist von der Struktur wie z.B.
\?\scsi#disk&vendor-string&production-string0&revisionsnummer#adapter-nummer#{GUID}Jetzt meine Frage: Kennt jemand eine einfache und eindeutige Möglichkeit, um von diesem Device-Namen auf die zugehörige Device-Number zu schließen ? Die Device-Nummer ist die Nummer, die man auch braucht, wenn man das Device über den alternativen Klartextnamen öffnet, zum Beispiel \\\.\\PhysicalDriveX, wobei X die Nummer ist, die ich suche.
Anmerkung: Mir ist klar, dass ich auch direkt ein Device über \\\.\\PhysicalDrive1 öffnen kann. Nur versuche ich eine eindeutige Zuordnung zwischen der Adapter-Nummer und der Datenträger-Nummer zu erhalten.
Normalerweise sind die Datenträger-Nummern "einigermaßen" statisch und stabil, doch spätestens dann, wenn ich USB-Devices reinstecke oder abziehe kommt es zu Durcheinanderwürfelungen dieser Nummern (z.B. 0 ist vorhanden, 1 nicht und dann 2 wieder vorhanden).
In irgendeiner Struktur müsste doch die gerade aktuell im System zugewiesene Datenträgernummer des durch SetupDiEnumDeviceInterfaces() ermittelten Devices auszulesen sein (so wie es die Computerverwaltung von Windows machen muss, um alle Festplatten und Partitionen zu ermitteln)?
Kann mir jemand helfen?
Beste Grüße
Holger
-
Das ist nicht so einfach möglich, da es unter Windows auch dnymaische Datenträger und Stripe-Sets geben kann. Somit ist eine 1-zu-1 Beziehung zwischen Laufwerksbuchstabe und physialischer Platte nicht immer gegeben...
Du kannst aber QueryDosDevice nehmen und man dort den Pfad übergeben...
-
Danke erst einmal. Mir ist bewusst, dass es unter Windows nicht immer eine 1:1-Beziehung zwischen Laufwerksbuchstaben und physikalischem Device gegeben ist. Nichts desto trotz kann ja z.B. die Computerverwaltung von Windows immer eine eindeutige Zuordnung anzeigen.
Etwas vergleichbares ist mir ja auch schon gelungen, über die Funktion DeviceIoControl( hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,....) bekomme ich problemlos zu jedem Laufwerksbuchstaben die zugehörigen physikalische Daternträgernummer heraus.
Was mir jetzt "nur" noch fehlt (aber für den Programmablauf unabdingbar ist) - ist die "Rückrechnung" auf die von Windows ebenfalls zu einem Device bereitgestellte GUID-Bezeichnung. Windows hat also bei jeder Festplatte eine intern vergebene Datenträgernummer (beginnend bei 0) und zusätzlich und eine in gleicher Weise benutzbare GUID-Bezeichnung.
Deshalb nochmals die Frage und ich hoffe, dass Du oder jemand anderes mir dabei helfen kann, von der physikalischen Datenträgernummer eindeutig auf diese gleichfalls im eingetragenen System-Device-GUID-Struktur (\?\scsi#disk&vendor-string&production-string0&revisionsnummer#adapter-nummer#{GUID} zu kommen ? Dann könnte ich per Programm ermitteln, an welchem Controller-Adapter welcher Laufwerksbuchstabe gekoppelt ist.
-
Wenn Du den "Vorweg" kennst und nur den "Rückweg" suchst, dann geh doch alle Laufwerksbuchstaben durch und dann hast Du ja den "Rückweg", oder hab ich da was falsch verstanden?
-
na ja nicht ganz so einfach... ich kann für jedes laufwerk ermitteln auf welchem physikalischen datenträger es sich befindet (physicaldrive0, 1 usw. ) aber ich weiss nicht, wie die zugehörige GUID-Bezeichnung aussieht. das ist ja mein problem. also ich suche irgendeine format-umwandlungs-funtkion, um die datenträgernummer auf die GUID-Nummer abbilden zu können
-
, um die datenträgernummer auf die GUID-Nummer abbilden zu können
Aus zwei Gründen geht das nicht:
-
Der GUID identifiziert das Interface, das der Treiber zur Verfügung stellt. Deswegen ist der GUID für alle Volumes der selbe. Das kannst Du schön sehen, wenn Du den Pfad zum Interface genauer unter die Lupe nimmst (also den Namen, den Du von SetupDiGetDeviceInterfaceDetail bekommst). Der an den Namen angehängte GUID wird sich nicht unterscheiden.
-
Für die Nummer des Datenträgers ist der Treiber zuständig. Normalerweise merkt sich der Treiber die Nummer in seiner DEVICE_EXTENSION. In der AddDevice Funktion wird der Device-Name für den IoCreateDevice-Aufruf entsprechend zusammengebaut und die Nummer eins weitergezählt. Die Treiber bieten Dir keine Möglichkeit, die verwendete Nummer zurückzulesen.
-