6

プログラムでドライバーのバージョン番号を取得しようとしています。を使用して構造体SetupDiEnumDriverInfoを取得し、 .SP_DRVINFO_DATADriverVersion field

次のコードは機能しますが、同じドライバーに対して 2 つの異なるバージョンを返します。私のデバイスはカスタム USB デバイスで、単一の .sys ファイルがあります。私のマシンに接続されているデバイスは 1 つだけです。DIGCF_PRESENT現在接続されているデバイスのドライバーのみを照会するように指定します。

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;
}

私のマシンでは、これは次のように出力されます。

Driver version is 00000000 000015d3
Driver version is 00020004 00000000

友人のマシンでは、次のように出力されます。

Driver version is 00020004 00000000
Driver version is 00020004 00000000

2 行目は、デバイス マネージャーによって報告された数と一致します。

免責事項: 以前に同様の質問をしました。これは、SetupDiEnumDriverInfo が複数のドライバー バージョンを返す理由に関する新しい質問です。

4

2 に答える 2

8

コードが記述されると、考えられるすべてのドライバーが出力されます。インストールされているドライバーのみをフィルタリングするには、次の操作を試してください。

SP_DEVINSTALL_PARAMS InstallParams;
if ( !SetupDiGetDeviceInstallParams( devInfoSet, &devInfo, &InstallParams ) )
{
   //Error
}
else
{
   InstallParams.FlagsEx |= DI_FLAGSEX_INSTALLEDDRIVER;
   if ( !SetupDiSetDeviceInstallParams( devInfoSet, &devInfo, &InstallParams) )
   {
      //Errror
   }
}

私はhttp://doxygen.reactos.org/df/db2/dll_2win32_2devmgr_2misc_8c_a1cd0b33c1785392a37689433dc99e482.htmlでこれを見つけました

于 2013-12-20T21:57:57.953 に答える