2008-12-01 8 views

Répondre

3

GetVolumeInformation est votre ami.

+5

GetVolumeInformation() ne vous donnera que le numéro de série du volume. Volume du disque! = Disque dur. La série de volumes est généralement un horodatage 32 bits à partir du moment où le disque a été formaté. –

+0

Vous avez raison. –

+1

L'ID de volume est 101% non fiable car il peut être facilement changé! – Ampere

1

GetVolumeInformation vous donnera des informations uniquement sur la partition ou le volume , pas tout disque dur.

Vous devez utiliser la fonction DeviceIoControl pour obtenir des informations.

Voici le code possible:

#include <atlstr.h> 
#include <Windows.h> 
#include <winioctl.h> 

BOOL getSerial(CString diskSerial) { 
    BOOL bResult = FALSE; 

    STORAGE_PROPERTY_QUERY storagePropertyQuery; 
    STORAGE_DESCRIPTOR_HEADER storageDescHeader = { 0 }; 
    STORAGE_DEVICE_DESCRIPTOR *pDeviceDesc; 

    DWORD dwBytes = 0; 
    DWORD dwOutBufferSize = 0; 
    DWORD dwSerialNumberOffset = 0; 

    BYTE *pOutBuffer = nullptr; 

    ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY)); 
    storagePropertyQuery.PropertyId = StorageDeviceProperty; 
    storagePropertyQuery.QueryType = PropertyStandardQuery; 

    HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", 0, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, 
        NULL, OPEN_EXISTING, 0, NULL); 

    if (hDevice == INVALID_HANDLE_VALUE) { 
    std::cout << "Can't get access to HDD.\nTerminating." << std::endl; 
    exit(EXIT_FAILURE); 
    } 

    bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, 
         &storagePropertyQuery, sizeof(storagePropertyQuery), 
         &storageDescHeader, sizeof(storageDescHeader), 
         &dwBytes, NULL); 

    dwOutBufferSize = storageDescHeader.Size; 

    try { 
    pOutBuffer = new BYTE[dwOutBufferSize]; 
    ZeroMemory(pOutBuffer, sizeof(pOutBuffer)); 
    } catch (std::bad_alloc exp) { 
    CloseHandle(hDevice); 
    std::cout << exp.what() << std::endl; 
    return FALSE; 
    } 

    bResult = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, 
         &storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY), 
         pOutBuffer, dwOutBufferSize, &dwBytes, NULL); 

    pDeviceDesc = (STORAGE_DEVICE_DESCRIPTOR *)pOutBuffer; 
    dwSerialNumberOffset = pDeviceDesc->SerialNumberOffset; 
    diskSerial = CString(pOutBuffer + dwSerialNumberOffset); 

    std::cout << "Serial Number: " << diskSerial << std::endl; 

    delete[] pOutBuffer; 
    CloseHandle(hDevice); 

    return TRUE; 
} 

Si vous avez plus d'1 disques durs installés, u devrait changer "\\\\.\\PhysicalDrive0" à "\\\\.\\PhysicalDrive1" etc.

+0

Cela peut être une réponse à la question. Ce sera mieux si vous mettez un exemple (pour le futur lecteur, au cas où le lien se casse) –

+0

@PriyeshKumar Merci pour le conseil, je suis juste nouveau à stackoverflow. – johnbrovi

Questions connexes