Gerät zu Laufwerksbuchstaben herausfinden



  • Wie kann ich herausfinden welches Gerät sich hinter einem Laufwerksbuchstaben vebirgt? Also z.B. C:\ = HDD, A:\ = FDD, E:\ = CD-Brumm





  • Gibts auch eine Möglichkeit zwischen Floppydisk und Kartenleser zu unterscheiden? Die werden beide als DRIVE_REMOVABLE erkannt.



  • Kannst du an der Größe unterscheiden...



  • GetDriveType war schon mal nicht schlecht, um die Laufwerke aber nicht anhand der Größe zu unterscheiden, kann man mit DeviceIoControl, dem STORAGE_DEVICE_DESCRIPTOR und IOCTL_STORAGE_QUERY_PROPERTY den Bus Typ herausfinden.



  • Lordesty schrieb:

    GetDriveType war schon mal nicht schlecht, um die Laufwerke aber nicht anhand der Größe zu unterscheiden, kann man mit DeviceIoControl, dem STORAGE_DEVICE_DESCRIPTOR und IOCTL_STORAGE_QUERY_PROPERTY den Bus Typ herausfinden.

    Ähh, ja danke für den Hinweis, leider weiss ich nicht wie ich die Funktion aufrufen und auswerten muss. Ist vieleicht jemand so nett und hat einen Codeschnippsel für mich?



  • Schau mal, ob du damit zurecht kommst...

    HANDLE hDevice ;
    _stprintf ( szFileName, "\\\\?\\%c:", cDriveLetter ) ;
    hDevice = GetHandle ( szFileName ) ;
    
    if ( hDevice == INVALID_HANDLE_VALUE )
    {
    	bReturnValue = FALSE ;
    }
    else
    {
    	DWORD dwOutBytes  = 0 ;
    
    	// Eine Standardabfrage:
    	STORAGE_PROPERTY_QUERY Query ;
    	Query.PropertyId = StorageDeviceProperty ;
    	Query.QueryType  = PropertyStandardQuery ;
    
    	// 1.) Erforderliche Größe für STORAGE_DEVICE_DESCRIPTOR zum ermitteln des BusType herausfinden:
    	STORAGE_DEVICE_DESCRIPTOR storageDeviceDescriptorTemp;
    	bResultDeviceIoControl = DeviceIoControl ( hDevice,
    											   IOCTL_STORAGE_QUERY_PROPERTY,
    											   &Query,
    											   sizeof ( STORAGE_PROPERTY_QUERY ),
    											   &storageDeviceDescriptorTemp,
    											   sizeof(storageDeviceDescriptorTemp) ,
    											   &dwOutBytes,
    											   ( LPOVERLAPPED ) NULL ) ;
    	if ( bResultDeviceIoControl == TRUE )
    	{
    		DWORD storageDeviceDescriptorSize = ( ( PSTORAGE_DESCRIPTOR_HEADER ) &storageDeviceDescriptorTemp )->Size ;
    
    		// 2.) STORAGE_DEVICE_DESCRIPTOR mit richtiger Größe anlegen und BusType prüfen:
    		PSTORAGE_DEVICE_DESCRIPTOR storageDeviceDescriptor = ( PSTORAGE_DEVICE_DESCRIPTOR ) new BYTE [storageDeviceDescriptorSize] ;
    		storageDeviceDescriptor->Size = storageDeviceDescriptorSize ;
    
    		DeviceIoControl ( hDevice,
    							 IOCTL_STORAGE_QUERY_PROPERTY,
    							 &Query,
    							 sizeof ( STORAGE_PROPERTY_QUERY ),
    							 storageDeviceDescriptor,
    							 storageDeviceDescriptor->Size ,
    							 &dwOutBytes,
    							 ( LPOVERLAPPED ) NULL ) ;
    
    		if( storageDeviceDescriptor->BusType == BusTypeSd )
    		{
    			bReturnValue = TRUE ;
    		}
    		else
    		{
    			bReturnValue = FALSE ;
    		}
    		delete storageDeviceDescriptor ;
    	}
    	else
    	{
    		bReturnValue = FALSE ;
    	}
    	CloseHandle ( hDevice ) ;
    }
    


  • Lordesty schrieb:

    // 2.) STORAGE_DEVICE_DESCRIPTOR mit richtiger Größe anlegen und BusType prüfen:
    		PSTORAGE_DEVICE_DESCRIPTOR storageDeviceDescriptor = ( PSTORAGE_DEVICE_DESCRIPTOR ) new BYTE [storageDeviceDescriptorSize] ;
    

    Danke für den Codeschnippsel, ich probier das gleich mal aus.
    Frage: obige Zeile in C würde dann so aussehen

    PSTORAGE_DEVICE_DESCRIPTOR storageDeviceDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)malloc(sizeof(BYTE) * storageDeviceDescriptorSize);
    

    delete entspricht dann free soweit ich mich mit meinen beschränkten c++ Kenntnissen erinnern kann.



  • so weit ich das mit meinen beschränkten C-Kenntnissen sagen kann, sieht das richtig aus 😉


Log in to reply