我正在寻找一种编程方式来获取驱动程序的版本号。我想要设备管理器在设备的驱动程序属性中显示的相同数字。
背景:我有一个与一些自定义硬件对话的应用程序。自定义硬件的设备驱动程序在特定版本号之前已存在已知错误。我希望应用程序检查驱动程序版本并警告用户是否需要更新。该应用程序在 Windows XP 和 7 上运行,并用 C++ 编写。
我之前使用的方法是直接从 system32/drivers 读取 .sys 文件并直接搜索“FileVersion”。出于多种原因,这很糟糕。特别是它似乎需要 Windows 7 上的管理员权限。
我知道类 GUID 和硬件 ID(即“USB\VID_1234&PID_5678”)。
应用程序当前使用SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces 和SetupDiGetDeviceInterfaceDetail 来获取“DevicePath”。然后,它使用该路径调用 CreateFile 来与驱动程序对话。
看起来我需要从某个地方获取 SP_DRVINFO_DATA 结构。我尝试了 setupapi.h 中的各种函数,例如 SetupDiGetDeviceInterfaceDetail。这是我尝试过但失败的一些代码:
int main(void)
{
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_USBSPI, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
SP_INTERFACE_DEVICE_DATA InterfaceDeviceData;
InterfaceDeviceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
// Cycle through all devices.
for (int i = 0; i < 32; i++)
{
if (!SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, (LPGUID)&GUID_DEVINTERFACE_USBSPI, i, &InterfaceDeviceData))
break;
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
DWORD RequiredSize;
SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, &InterfaceDeviceData, NULL, 0, &RequiredSize, …Run Code Online (Sandbox Code Playgroud)