serie serialnumber serial obtener numero number leer informacion hard duro diskdrive disco como changer buscar c++ winapi hard-drive hdd

c++ - serialnumber - wmic disco duro



¿Cómo obtener el número de serie de los discos duros? (2)

¿Existe una manera fácil de obtener el número de serie de todos los discos duros con la API de Win32?


GetVolumeInformation es tu amigo.


GetVolumeInformation le dará información solo sobre la partición o el volumen , no sobre todo el disco duro.

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

Aquí código posible:

#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 más de 1 disco duro instalado, debe cambiar "////.//PhysicalDrive0" por "////.//PhysicalDrive1" etc.