附上参考代码
HANDLE
hPhysicalDriveIOCTL = 0;
char
cszDriveName [256];
sprintf_s(cszDriveName,256,
"\\\\.\\PhysicalDrive%d"
, iDrive);
hPhysicalDriveIOCTL = CreateFileA (cszDriveName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if
(hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage,
sizeof
(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,
"%d ReadPhysicalDriveInNTWithZeroRights ERROR CreateFileA(%s) returned INVALID_HANDLE_VALUE"
,__LINE__, cszDriveName);
}
else
{
STORAGE_PROPERTY_QUERY query;
DWORD
dwBytesReturned = 0;
char
cszBuffer [1000];
memset
((
void
*) & query, 0,
sizeof
(query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset
(cszBuffer, 0,
sizeof
(cszBuffer));
if
(DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof
(query),
& cszBuffer,
sizeof
(cszBuffer),
& dwBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & cszBuffer;
int
snoffset = descrip->SerialNumberOffset+1;
int
mnoffset = descrip->ProductIdOffset + 1;
char
* cszSerialNumber = (
char
*)descrip->RawDeviceProperties + snoffset - 0x25;
char
* cszModelNumber = (
char
*)descrip->RawDeviceProperties + mnoffset - 0x25;
}
else
{
DWORD
dwErr = GetLastError ();
SecureZeroMemory(m_cszErrorMessage,
sizeof
(m_cszErrorMessage));
sprintf_s (m_cszErrorMessage,
"DeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error = %d\n"
, dwErr);
}
CloseHandle (hPhysicalDriveIOCTL);