GetLogicalDrives gibt keine Systempartition zurück?
-
hi.
beim aufruf der funktion GetLogicalDrives bekomm ich an bitindex 1 immer eine 0, wo eigentlich mein c drive ist. alle anderen drives werden problemlos im bitvektor eingetragen. woran liegt das?
andere frage: ich versuche mit GetLogicalDriveStrings die drive buchstaben in TCHAR strings zu bekommen. doch wie schreibt die funktion die buchstaben von drives in das übergebene array? teilt die funktion das array in "segmente" von je 4 arrayzellen (3 für "x:\" + 1 für 0-terminalzeichen) ein und trägt z.b. für drive i den drivebuchstaben ab arrayelement[i*4] ein, auch wenn drive i-1 fehlt, oder schreibt es einfach sequentiell ins array?
danke,
wan-hi
-
Hallo Wan-Hi,
Probleme sollte es mit der Funktion eigendlich nicht geben.
Zeig mal den Codeausschnitt den du dafür verwendest.Das Format des Rückgabestrings lautet:
c:\<null>d:\<null><null>
PS: GetLogicalDriveStrings liefert auf einen
Unicode-System automatisch Unicode zurück.
-
sorry, ich habe das problem mit anschalten meines gehirns lösen können:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { DWORD driveBitVec; TCHAR driveLetters[105]; // 26 letters * (3 volume letters + 1 0-Terminator) int counter = 0; TCHAR *driveLetter; driveBitVec = GetLogicalDrives(); GetLogicalDriveStrings(105, driveLetters); for (int i = 0, j = 1; i < 26; i++, j *= 2) { // A to Z (26 letters) -> 26 volumes max. if(driveBitVec & j) { driveLetter = &driveLetters[counter*4]; ++counter; if (GetDriveType(driveLetter) == DRIVE_REMOVABLE) { printf("Folgenden Wechseldatenträger gefunden: %s\n", driveLetter); } } } return 0; }mein ziel ist eigentlich produktdaten über drives auszugeben, z.b. hersteller, produktname, versionsnummer und seriennummer. wie kann ich das erreichen? die funktion DeviceIoControl scheint dafür notwendig, zusammen mit dem control code IOCTL_CHANGER_GET_PRODUCT_DATA. doch dafür müßte ich wieder die strings, die die drive namen beinhalten, anpassen. gibt es einen einfacheren weg?
außerdem gibt die CHANGER_PRODUCT_DATA struct nur byte arrays zurück, keine strings, wie sie in der hardware konfiguration von windows angezeigt werden. wie bekommt man die strings?
danke,
wan-hi
-
Wo ist das Problem bei DeviceIoControl mit IOCTL_CHANGER_GET_PRODUCT_DATA

Vielleicht hilft dir das hier weiter?!
Weitere Infos kannst du evtl. noch mit der WMI-Klasse "Win32_DiskDrive bekommen

-
vielen dank für die hilfe. leider bin ich noch nicht so weit mit wmi zu arbeiten, da ich gerade erst mit win32 angefangen habe und ehrlich gesagt, so gut wie keine ahnung über com habe, was laut wmi text aber wichtig ist.
mein eigentliches ziel ist es eigentlich alle angeschlossenen mass storage devices (usb wechseldatenträger) zu ermitteln und ihre volumes zu enumerieren, zusätzlich dazu noch devicenamen als strings auszugeben.
wäre es einfacher über direkte usb enumeration zu gehen? also direkt alle usb devices zu enumerieren? mein eigentlicher weg war:
- SetupDiGetClassDevs: DeviceInfoSet über alle geräte holen, die unter die interface class "Storage Device" fallen
- SetupDiEnumDeviceInfo und SetupDiEnumDeviceInterfaces: von jedem erhaltenen device, sein interface enumerieren
- SetupDiGetDeviceInterfaceDetail: von jedem interface details zu beziehen
- CreateFile / IOCTL_STORAGE_GET_MEDIA_TYPES_EX: über jedes spezielle interface detail jedes device anzusprechen
- wenn der media type nicht FILE_DEVICE_MASS_STORAGE ist, dann verwerfen.
- wenn doch, dann von dem device seine volumes enumerieren (noch k.a. wie das gehen soll)
aber das scheint alles echt umständlich. außerdem spreche ich mit der o.g. methode ein device eventuell mehrmals an, da ein device ja mehrere interfaces haben kann. geht das alles auch einfacher? ich will kein spezielles device finden, sondern einfach nur alle mass storage devices und ihre volumes.
hoffentlich kann mir jemand helfen.
gruß
wan-hi
-
Vielleicht hilft dir FindFirstVolume weiter?!
-
wenn ich wüßte, wie ich anhand von rootpathnames hardware daten beziehen könnte, wäre es sicher leichter. nur wie?
