Win32 API kullanarak bir bilgisayardaki tüm sabit disklerin seri numarasını almanın kolay bir yolu var mı?Sabit disklerden seri numarası nasıl alınır?
cevap
GetVolumeInformation sizin arkadaşınız.
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. –
Haklısınız. –
Cilt ID'si% 101 güvenilmezdir, çünkü kolayca değiştirilebilir! – Ampere
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.
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
Bu soruya bir cevap olabilir. Eğer bir örnek koyarsanız (gelecekteki okuyucu için, linkin kırılması durumunda) daha iyi olacaktır. –
@PriyeshKumar Tavsiye için teşekkürler, sadece stackoverflow için yeni. – johnbrovi
, NO. Özel bir düşük seviye (ASM) kitaplığı kullanmanız gerekir. – Ampere