问题
I'm trying to get the version number of a driver programmatically. The seems to be done by using SetupDiEnumDriverInfo
to get a SP_DRVINFO_DATA
struct and inspect the DriverVersion field
.
The following code works, but returns two different versions for the same driver. My device is a custom USB device, with a single .sys file. There is only one device connected to my machine. I specify DIGCF_PRESENT
to only query the drivers of currently attached devices.
int main(void)
{
// Get the "device info set" for our driver GUID
HDEVINFO devInfoSet = SetupDiGetClassDevs(
&GUID_DEVINTERFACE_USBSPI, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
// Cycle through all devices currently present
for (int i = 0; ; i++)
{
// Get the device info for this device
SP_DEVINFO_DATA devInfo;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiEnumDeviceInfo(devInfoSet, i, &devInfo))
break;
// Build a list of driver info items that we will retrieve below
if (!SetupDiBuildDriverInfoList(devInfoSet,
&devInfo, SPDIT_COMPATDRIVER))
return -1; // Exit on error
// Get all the info items for this driver
// (I don't understand why there is more than one)
for (int j = 0; ; j++)
{
SP_DRVINFO_DATA drvInfo;
drvInfo.cbSize = sizeof(SP_DRVINFO_DATA);
if (!SetupDiEnumDriverInfo(devInfoSet, &devInfo,
SPDIT_COMPATDRIVER, j, &drvInfo))
break;
printf("Driver version is %08x %08x\n",
(unsigned)(drvInfo.DriverVersion >> 32),
(unsigned)(drvInfo.DriverVersion & 0xffffffffULL));
}
}
SetupDiDestroyDeviceInfoList(devInfoSet);
return 0;
}
On my machine this prints:
Driver version is 00000000 000015d3
Driver version is 00020004 00000000
On a friend's machine, it prints:
Driver version is 00020004 00000000
Driver version is 00020004 00000000
The second line matches the number reported by device manager.
Disclaimer: I previously asked a similar question. This is a new question about why SetupDiEnumDriverInfo returns more than one driver version.
回答1:
As your code is written, all the possible drivers will be output. Try doing the following to filter on only the installed driver:
SP_DEVINSTALL_PARAMS InstallParams;
if ( !SetupDiGetDeviceInstallParams( devInfoSet, &devInfo, &InstallParams ) )
{
//Error
}
else
{
InstallParams.FlagsEx |= DI_FLAGSEX_INSTALLEDDRIVER;
if ( !SetupDiSetDeviceInstallParams( devInfoSet, &devInfo, &InstallParams) )
{
//Errror
}
}
I found this at http://doxygen.reactos.org/df/db2/dll_2win32_2devmgr_2misc_8c_a1cd0b33c1785392a37689433dc99e482.html
来源:https://stackoverflow.com/questions/16063402/why-does-setupdienumdriverinfo-give-two-version-numbers-for-my-driver