none
Wie erhalte ich die physikalische Drive-Number wenn ich einen logischen Drive-Letter habe? RRS feed

  • Frage

  • Hallo Forum

    Ich habe einen logischen Drive Letter, sagen wir "F:\" und würde dazu gerne die physikalische Device-Number haben. Tante Google liefert hierzu viele Menschen, die auch das gleiche Problem haben, aber offenbar kaum brauchbare Antworten.

    Ich war schon so weit, über DeviceIoControl mir Informationen zu holen

    int Cxxxxx::GetPhysicalDrive(wchar_t logDrv) {
    	wchar_t wcsRawDrv[] = {'\\','\\','.','\\',logDrv,':',0};
    	HANDLE drvHndl = CreateFile(wcsRawDrv,0,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    	if (drvHndl != INVALID_HANDLE_VALUE) {
    		DWORD bytesReturned;
    		VOLUME_DISK_EXTENTS vde;
    		if (DeviceIoControl(drvHndl,IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL)) return(vde.Extents->DiskNumber);
       }
       return(-1);
    }

    aber die "Community" sagt, dass dies auch nur für DRIVE_FIXED Typen geht. Ich bräuchte es aber allgemeiner, d.h., wenn eine physikalische Festplatte und ein USB-Stick angesteckt sind, dann soll die Festplatte Device #0 und der USB Stick Device #1 sein, d.h. wenn ich z.B. mit "F:\" (für den USB-Stick) reingehe, sollte #1 rauskommen.

    Grüße

    FireHeart

    PS: zum obigen Beispiel noch eine Grundsatzfrage: Was mach ich eigentlich, wenn ich "CreateFile" auf ein Raw-Device wie \\.\C: mache? Kann ich dann die einzelnen Sektoren der Festplatte auslesen? Was passiert wenn ich darauf schreibe? Ist dann die Festplatte im Eimer? ... ich habe den obigen Code aus ebendiesen Zweifeln noch nie laufen lassen.

    Donnerstag, 22. Dezember 2016 08:13

Antworten

  • Hallo

    Wieso? die physikalischen Drive-Nummern bekommst du ja so. Nur nicht die von Wechseldatenträgern... weil die keine haben (zumindest nicht, dass mir bewusst wäre... du kannst ja durchnummerieren und alle \\.\PhysicalDrive%i öffnen versuchen... da wird nix kommen).

    Und zum anderen: ja, du kannst roh jeden Sektor der Disk lesen/schreiben... ich nutze das um (halb) defekte Platten auszulesen oder um Harddisks zu überschreiben um sie zu löschen (ist mir klar, dass ich damit die defekten/ersetzten Sektoren nicht erreiche und bei SSDs haben wir noch andere Probleme... aber für den normalen Gebrauch ist das recht nützlich).

    Rudolf

    Freitag, 23. Dezember 2016 10:42

Alle Antworten

  • Hallo

    Ja, das stimmt was sie sagen. Wenn es fixed ist, geht's per VOLUME_DISK_EXTENTS. Wenn es nicht fix ist, dann hast du eine NumberOfDiskExtents von 0 (laut meinem SourceCode des Projekts, in dem ich das mal gebraucht habe :-)). In dem Fall gibt's auch kein zugehöriges "PhysicalDrive". Dann kannst du es nur per Laufwerksbuchstaben ansprechen (ist vom Treiber abhängig, wie das gemeldet wird).

    Zum schreiben auf die Disk (also, \\.\C: wäre die Partition, \\.\PhysicalDrive0 wär die Disk). Wenn du da drauf schreibst, dann ist nachher wirklich das Dateisystem oder die Partitionstabelle oder so im Eimer. Die Disk selber nicht :-) aber das hattest du ja auch nicht so gemeint.

    Rudolf

    Donnerstag, 22. Dezember 2016 16:12
  • Hallo Rudolf

    Danke erst mal für die Info.

    Es ist ja schon seltsam, dass man diese Info nicht wirklich bekommt. Wir haben uns über das Partitionstool von WinPE beholfen, das eine Liste von logischen und zugehörigen physikalischen Drive-Numbers ausgibt und diesen Text dann analysiert....weiß dieses Tool etwas, was selbst den API Funktionen des OS unzugänglich ist?

    Ich hatte tatsächlich etwas Stress, den obig angeführten Code auszuführen, weil er ja den Handle auf FILE_SHARE_READ | FILE_SHARE_WRITE macht, also offenbar auch Schreibzugriffe erlauben will. Ich hoffe mal, dass in diesem Fall nichts passiert, solange man auf das offene Handle nicht wirklich schreibt.

    Anders herum gefragt: Hab ich bei einer 500GB Platte dann quasi eine Datei zum Auslesen, die 500GB groß ist und sequentiell alle Sektoren der Platte durchläuft?

    Grüße

    FireHeart

    Freitag, 23. Dezember 2016 08:51
  • Hallo

    Wieso? die physikalischen Drive-Nummern bekommst du ja so. Nur nicht die von Wechseldatenträgern... weil die keine haben (zumindest nicht, dass mir bewusst wäre... du kannst ja durchnummerieren und alle \\.\PhysicalDrive%i öffnen versuchen... da wird nix kommen).

    Und zum anderen: ja, du kannst roh jeden Sektor der Disk lesen/schreiben... ich nutze das um (halb) defekte Platten auszulesen oder um Harddisks zu überschreiben um sie zu löschen (ist mir klar, dass ich damit die defekten/ersetzten Sektoren nicht erreiche und bei SSDs haben wir noch andere Probleme... aber für den normalen Gebrauch ist das recht nützlich).

    Rudolf

    Freitag, 23. Dezember 2016 10:42