Có cách nào dễ dàng để lấy số sê-ri của tất cả các đĩa cứng trong PC bằng API Win32 không?Làm thế nào để lấy số sê-ri từ đĩa cứng?
Trả lời
GetVolumeInformation là bạn của bạn.
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. –
Bạn chính xác. –
ID khối lượng 101% không đáng tin cậy vì nó có thể dễ dàng thay đổi! – Ampere
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
Đâ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) –
@PriyeshKumar Cảm ơn lời khuyên, tôi chỉ mới để stackoverflow. – johnbrovi
- 1. Làm cách nào để sử dụng C# để nhận số sêri đĩa cứng?
- 2. Làm cách nào để lấy số sêri điện thoại (IMEI)
- 3. Lệnh để lấy thông số đĩa cứng và bộ xử lý từ xa
- 4. Làm thế nào để có được số bo mạch chủ hoặc số sêri trong Delphi?
- 5. Làm cách nào để nhận được số ổ đĩa cứng của ổ USB trên OS X?
- 6. Lấy Số sê-ri của Ổ đĩa cứng Được cung cấp bởi nhà sản xuất thông qua PHP
- 7. Sắp xếp số lượng lớn các số nguyên từ đĩa cứng
- 8. Cách tải hình ảnh từ mshtml.htmlimg vào đĩa cứng
- 9. Bằng mã, làm thế nào tôi có thể gửi một ổ đĩa cứng để ngủ
- 10. Làm thế nào để ngăn chặn chương trình Windows khỏi ổ đĩa cứng quay xuống?
- 11. Làm thế nào để sao chép hình ảnh vào thẻ sd giả lập Android từ đĩa cứng?
- 12. Cách tạo số sêri trong truy vấn?
- 13. Chống phân mảnh đĩa cứng ảo (.vhd)?
- 14. Lấy số sê-ri từ thiết bị
- 15. Làm cách nào để lấy số nguyên của không gian đĩa trống trong tệp Batch?
- 16. Làm cách nào để lưu tệp vào đĩa cứng trong một chuỗi riêng biệt?
- 17. Tăng ổ cắm asio: cách nhanh nhất để đọc tệp từ ổ đĩa cứng?
- 18. Làm thế nào để loại bỏ một đĩa cứng mà không để lộ mã nguồn của tôi?
- 19. Lấy kích thước cụm của một ổ đĩa cứng (thông qua mã)
- 20. Xóa dung lượng trống trên ổ đĩa cứng bằng C#
- 21. Làm thế nào để bạn phát hiện các ký tự ổ đĩa cứng chính như ổ C:?
- 22. Làm thế nào để xác định số lượng tệp trên một ổ đĩa bằng Python?
- 23. Đọc các Ổ đĩa cứng trong C++ trên Linux
- 24. Làm thế nào để lấy chìa khóa từ một TDictionary?
- 25. Làm thế nào để lấy giá trị từ dojo.data.ItemFileReadStore
- 26. Làm thế nào tôi có thể lấy thông tin hệ thống/phần cứng thông qua Java?
- 27. Làm thế nào để đọc đĩa CD dưới dạng tệp?
- 28. Làm thế nào để lấy lại nội dung từ Wiktionary?
- 29. Làm thế nào để lấy 'KeyValue' từ Telerik RadGrid?
- 30. Làm thế nào để lấy các tham số từ tệp ứng dụng Zend.ini trong phiên?
Với Win API, NO. Bạn cần sử dụng thư viện cấp thấp (ASM) chuyên dụng. – Ampere