2008-12-01 24 views

cevap

3

GetVolumeInformation sizin arkadaşınız.

+5

GetVolumeInformation() size yalnızca birim hacminin seri numarasını verecektir. Disk hacmi! = Sabit disk. Birim seri, diskin biçimlendirildiği zamandan tipik olarak yalnızca 32 bitlik bir zaman damgasıdır. –

+0

Haklısınız. –

+1

Cilt ID'si% 101 güvenilmezdir, çünkü kolayca değiştirilebilir! – Ampere

1

GetVolumeInformation değil bütün HDD ile ilgili, sadece bölüm veya hacmi hakkında bilgi verecektir.

Bilgi almak için DeviceIoControl işlevini kullanmalısınız.

İşte

olası kod: Daha sonra 1 sabit diskler yüklüyse

#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; 
} 

u değişmelidir "\\\\.\\PhysicalDrive0""\\\\.\\PhysicalDrive1" vb Win API ile

+0

Bu soruya bir cevap olabilir. Eğer bir örnek koyarsanız (gelecekteki okuyucu için, linkin kırılması durumunda) daha iyi olacaktır. –

+0

@PriyeshKumar Tavsiye için teşekkürler, sadece stackoverflow için yeni. – johnbrovi

İlgili konular