//gcc -O2 -Wall -fPIC -fexec-charset=gbk -o disk disk.c -lSetupapi -lntdll
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <windows.h>
#include <iphlpapi.h>
#include <NtDDNdis.h>
#include <setupapi.h>
int get_disk_id(char pan) {
DWORD WINAPI RtlComputeCrc32(DWORD dwInitial, const BYTE * pData, INT iLen);
wchar_t symbol[260];
if (pan == 0) {
GetSystemDirectoryW(symbol, 260);
pan = symbol[0];
}
_swprintf(symbol, L"\\\\.\\%c:", pan);
HANDLE hDevice = CreateFileW(symbol, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (hDevice != INVALID_HANDLE_VALUE)
{
STORAGE_DEVICE_NUMBER sdn = { 0 };
DWORD dwBytesReturned = 0;
DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, &sdn, sizeof(sdn), &dwBytesReturned, 0);
CloseHandle(hDevice);
_swprintf(symbol, L"\\\\.\\PhysicalDrive%d", sdn.DeviceNumber);
hDevice = CreateFileW(symbol, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (hDevice != INVALID_HANDLE_VALUE) {
STORAGE_PROPERTY_QUERY query = { 0 };
STORAGE_DEVICE_DESCRIPTOR* sdd = malloc(sizeof(STORAGE_DEVICE_DESCRIPTOR) + 1024);
if (sdd) {
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset(sdd, 0, sizeof(STORAGE_DEVICE_DESCRIPTOR) + 1024);
dwBytesReturned = 0;
DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), sdd, sizeof(STORAGE_DEVICE_DESCRIPTOR) + 1024, &dwBytesReturned, 0);
CloseHandle(hDevice);
DWORD crc32 = RtlComputeCrc32(0, sdd->RawDeviceProperties, sdd->Size);
free(sdd);
return crc32;
}
}
}
return 0;
}
type2
int getSerialNumber() {
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;
TCHAR volumeName[MAX_PATH] = { 0 };
TCHAR fileSystemName[MAX_PATH] = { 0 };
// 指定要查询的驱动器, 例如 "C:\\"
// 注意: 必须是双反斜杠, 因为单个反斜杠是转义字符
const TCHAR* drive = TEXT("C:\\");
if (GetVolumeInformation(
drive, // lpRootPathName
volumeName, // lpVolumeNameBuffer
MAX_PATH, // nVolumeNameSize
&serialNumber, // lpVolumeSerialNumber
&maxComponentLen, // lpMaximumComponentLength
&fileSystemFlags, // lpFileSystemFlags
fileSystemName, // lpFileSystemNameBuffer
MAX_PATH // nFileSystemNameSize
)) {
return serialNumber;
}
}