2008-12-01 15 views

Respuesta

3

GetVolumeInformation es tu amigo.

+5

GetVolumeInformation() solo le dará el número de serie del volumen. ¡Volumen del disco! = Disco duro. La serie del volumen generalmente es solo una marca de tiempo de 32 bits desde que se formateó el disco. –

+0

Tiene razón. –

+1

¡La identificación del volumen es un 101% poco confiable porque se puede cambiar tan fácilmente! – Ampere

1

GetVolumeInformation le dará información sólo acerca de la partición o volumen, no se trata de disco duro entero.

Debe utilizar la función DeviceIoControl para obtener información.

Aquí posible código:

#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 tiene instalados más de 1 unidades de disco duro, u debe cambiar "\\\\.\\PhysicalDrive0" a "\\\\.\\PhysicalDrive1" etc.

+0

Esta puede ser la respuesta a una pregunta. Será mejor si pones un ejemplo (para lectores futuros, en caso de que el enlace se rompa) –

+0

@PriyeshKumar Gracias por el consejo, soy nuevo en stackoverflow. – johnbrovi

Cuestiones relacionadas