2008-12-01 16 views

Trả lời

3

GetVolumeInformation là bạn của bạn.

+5

GetVolumeInformation() sẽ chỉ cung cấp cho bạn số sêri của ổ đĩa. Dung lượng đĩa! = Đĩa cứng. Khối lượng nối tiếp thường chỉ là một dấu thời gian 32 bit từ khi đĩa được định dạng. –

+0

Bạn chính xác. –

+1

ID khối lượng 101% không đáng tin cậy vì nó có thể dễ dàng thay đổi! – Ampere

1

GetVolumeInformation sẽ cung cấp cho bạn thông tin duy nhất về phân vùng hoặc khối lượng, không phải về toàn bộ HDD.

Bạn nên sử dụng chức năng DeviceIoControl để nhận thông tin.

Đây có thể mã:

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

Nếu bạn có nhiều thì 1 ổ cứng cài đặt, u nên thay đổi "\\\\.\\PhysicalDrive0" để "\\\\.\\PhysicalDrive1", vv

+0

Đây có thể là câu trả lời cho câu hỏi. Nó sẽ tốt hơn nếu bạn đặt một số ví dụ (cho người đọc trong tương lai, trong trường hợp liên kết bị hỏng) –

+0

@PriyeshKumar Cảm ơn lời khuyên, tôi chỉ mới để stackoverflow. – johnbrovi

Các vấn đề liên quan