В моем поиске я также нашел эту страницу , очень полезную для получения IOCTRL_HAL_GET_DEVICEID:
Также подробно описана структура DEVICE_ID, которая необходима для использования вызова:
#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _DEVICE_ID {
DWORD dwSize;
DWORD dwPresetIDOffset;
DWORD dwPresetIDBytes;
DWORD dwPlatformIDOffset;
DWORD dwPlatformIDBytes;
} DEVICE_ID, *PDEVICE_ID;
Что не обязательно очевидно, так это то, что данные, содержащиеся в данных смещениях, являются просто значениями типа int и, вероятно, лучше всего их рассматривать как шестнадцатеричные коды.