2008-12-01 14 views
7

क्या Win32 API का उपयोग कर किसी पीसी में सभी हार्ड डिस्क का क्रम संख्या प्राप्त करने का कोई आसान तरीका है?हार्ड डिस्क से सीरियल नंबर कैसे प्राप्त करें?

+0

, सं। आपको एक समर्पित निम्न स्तर (एएसएम) पुस्तकालय का उपयोग करने की आवश्यकता है। – Ampere

उत्तर

3

GetVolumeInformation आपका मित्र है।

+5

GetVolumeInformation() आपको केवल वॉल्यूम का सीरियल नंबर देगा। डिस्क वॉल्यूम! = हार्ड डिस्क। वॉल्यूम धारावाहिक आमतौर पर डिस्क स्वरूपित होने पर 32-बिट टाइमस्टैम्प होता है। –

+0

आप सही हैं। –

+1

वॉल्यूम आईडी 101% अविश्वसनीय है क्योंकि इसे आसानी से बदला जा सकता है! – Ampere

1

GetVolumeInformation आप ही के बारे में विभाजन या मात्रा जानकारी दे देंगे, न कि पूरी HDD के बारे में।

आपको जानकारी प्राप्त करने के लिए DeviceIoControl फ़ंक्शन का उपयोग करना चाहिए।

यहाँ संभव कोड:

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

आप और अधिक तो 1 हार्ड ड्राइव स्थापित है, तो यू बदलना चाहिए "\\\\.\\PhysicalDrive0""\\\\.\\PhysicalDrive1" करने आदि

विन API की मदद से
+0

यह प्रश्न का उत्तर हो सकता है। यह बेहतर होगा यदि आप कुछ उदाहरण डालते हैं (भविष्य के पाठक के लिए, यदि लिंक टूटा हुआ हो) –

+0

@PriyeshKumar सलाह के लिए धन्यवाद, मैं सिर्फ स्टैक ओवरफ्लो के लिए नया हूं। – johnbrovi

संबंधित मुद्दे