Die Seriennummer einer Festplatte(C++)



  • Ich versuche gerade die Seriennummer meiner Festplatte rauszufinden. Ich habe aber das Problem mit der Methode:

    GetVolumeInformationW()-----für Unicode

    Wenn ich ihr als Path 0 gebe, liefert mir die Methode eine 1 zurück und zeigt die Seriennummer der Festplatte. Wenn ich aber "C:","C:\" ...eingebe, liefert sie mir eine 0...nix gefunden.

    Was ist das Problem?

    uint32_t UsbStick :: getSerialNumberOfHardDrive(){
    
    	uint32_t serialNo=0;
    	//LPWSTR volumeNameBuffer = 0;
    	WCHAR volumeNameSize[256];
    	uint32_t volumeSerialNumber;
    	//DWORD maximumComponentLength = 0;
    	//LPDWORD fileSystemFlags = 0;
    	LPWSTR systemNameBuffer;
    	WCHAR fileSystemNameSize[256];
    	uint8_t isOk = 0;
    
    	DWORD sysFlag = 0;
    	DWORD serialNumb;
    	uint32_t serialNumber;
    
    	// Retrieves a bitmask representing the currently disk drives.
    	DWORD uDriveMask = GetLogicalDrives();
    
    	// Drives
    	LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:",
    		L"G:", L"H:" , L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" ,
    		L"P:" , L"Q:" , L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };
    
    	// Calculate the number of drives, LPWSTR is a 32-bit pointer to a string of
    	// 16-bit Unicode characters.	
    	uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
    
    	for(uint8_t i=0 ; i < nDrives ; i++ )
    	{
    		// The return value of the function specifies the type of drive.
    		UINT type = GetDriveType( drive[i] );
    
    		if( ( uDriveMask & 1 ) && ( DRIVE_FIXED_TYPE == type ) )
    		{		
    			isOk = GetVolumeInformationW(0, 0, 256, &serialNumber, 0, 0,0, 256);
    			if(isOk!=0){
    			//printf("drive = %s, ", dr);			
    			printf("Serial = %x\n", serialNumber);		
    
    			}
    
    		}
    		//shift the bitmask binary right	
    		uDriveMask >>= 1;
    	} 
    
    	char drives[256];	
    	GetLogicalDriveStringsW(256, (LPWSTR)drives);
    	const char *ptr = drives;
    	while( *ptr != '\0' && *ptr != '\\' ) {
    		unsigned int driveType = GetDriveTypeW((LPWSTR)ptr);
    		if( driveType == DRIVE_FIXED )
    		{
    
    			isOk=GetVolumeInformationW((LPWSTR)ptr, 0, 256, &serialNumber, 0, 0,0, 256);
    			printf("drive = %s, ", ptr);
    			//printf("volumneName = %s, ", volumeName);
    			//printf("fileSystem = %s", fileSystem);
    			printf("Serial = %X\n", serialNumber);
    		}
    		ptr = strchr(ptr, '\0');
    		ptr += 1;
    	}
    	return serialNo;
    }
    


  • char drives[256];    
        GetLogicalDriveStringsW(256, (LPWSTR)drives); 
        const char *ptr = drives; 
        while( *ptr != '\0' && *ptr != '\\' ) { 
            unsigned int driveType = GetDriveTypeW((LPWSTR)ptr); 
            if( driveType == DRIVE_FIXED ) 
            { 
    
                isOk=GetVolumeInformationW((LPWSTR)ptr, 0, 256, &serialNumber, 0, 0,0, 256); 
                printf("drive = %s, ", ptr); 
                //printf("volumneName = %s, ", volumeName); 
                //printf("fileSystem = %s", fileSystem); 
                printf("Serial = %X\n", serialNumber); 
            } 
            ptr = strchr(ptr, '\0'); 
            ptr += 1; 
        }
    

    liefert alles richtig, nun ich soll keine chars benutzen.



  • Du machst deinen Doktor an dieser Funktion, hmmm?



  • nein, cih will nur wissen wieso die Funktion:

    GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")



  • Weil "C:" kein LPCWSTR sondern ein LPCSTR ist. L"C:" wäre die Wide-Variante davon.

    Aus einem LPWSTR einzelne Chars rauszuholen und die Compilerwarnungen durch Casts zu unterdrücken ist übrigens nicht die feine englische Art. Ein LPWSTR ist nämlich ein String aus wchar_t.



  • koschka schrieb:

    nein, cih will nur wissen wieso die Funktion:

    GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")

    Weil das

    (LPWSTR)"C:")

    ein grobes Problem ist!
    Du castest ein const char* (der von einem char[] stammt) in ein const wchar_t*. Leider geht die Konversion zwischen char* und wchar_t* nicht so einfach.

    Eine Möglichkeit ist die Literale gerade mit wchar_t zu definieren. Das geht so:
    L"C:"

    Noch die bessere Möglichkeit ist die Literale abhängig von deiner Projekt Einstellung entweder mit char* oder wchar_t* anzugeben. Das geht so: _T("C:")

    Eine andere Möglichkeit wäre eine echte Konversion vorzunehem, mit folgenden Funktionen:
    http://msdn.microsoft.com/en-us/library/bb202786.aspx
    http://msdn.microsoft.com/en-us/library/aa450989.aspx



  • Konversion

    Denglisch kann ich auch. 🙂



  • und wennn mein drive[i] vom Type LPWSTR ist, wie kann ich dafür die Methode:

    getVolumeInformationW() anwenden?

    Ich schreibe nicht direkt "C:\", die ist bei mir in drive[i] gespeichert.



  • isOk = GetVolumeInformationW(drive[i], 0, 256, &serialNumber, 0, 0,0, 256);



  • drive[i] ist ein wchar_t, ein einzelnes Zeichen.

    &drive[i] oder (drive + i) ist die Adresse dieses (und der darauffolgenden) Zeichens und ein LPWSTR.



  • Also wie ich verstehe es sollte gehen:

    GetVolumeInformation(drive[i],0,256,&serialNumber,0,0,0,256);

    erste Parameter soll LPWSTR sein und er ist es auch. Ich verstehe nicht wieso habe ich eine 0 als Rückgabe?



  • ich habe das Problem jetzt gelöst. Dieser Path soll solche Struktur haben "C:\\" und ich hatte "C:".Das war mein Problem.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply