3

我的任务是找到一种方法来检测有故障或丢失的驱动程序,以便我的程序可以安装一个更好的适用于我的系统的程序。我一直在尝试的事情包括使用setupapi.dll从注册表中获取值并尝试找到一些标志,让我知道驱动程序存在问题。在MSDN上,我发现“其他设备”的类 GUID 是4d36e97e-e325-11ce-bfc1-08002be10318. 但是,如果我尝试枚举这些设备,我什么也得不到,即使我在设备管理器下看到该类别的设备。是否有其他 Windows API 可以让我通过某种方式识别此类设备或一般的驱动程序错误?我的代码如下所示:

static void Main(string[] args)
{
    Guid displayClass = new Guid("4d36e97e-e325-11ce-bfc1-08002be10318");
    SafeDevInfoHandle hDevInfo = NativeMethods.SetupDiGetClassDevs(ref displayClass,
                null, IntPtr.Zero, DIGetClassFlags.DIGCF_PRESENT);

    if (hDevInfo.IsInvalid)
        throw new Win32Exception();

    DevInfoData did = new DevInfoData();
    did.size = Marshal.SizeOf(did);

    for (uint i = 0; NativeMethods.SetupDiEnumDeviceInfo(hDevInfo, i, ref did); i++)
    {
        if (NativeMethods.SetupDiBuildDriverInfoList(hDevInfo, ref did, DriverType.SPDIT_COMPATDRIVER))
        {
            DriverInfoData drvData = new DriverInfoData();
            drvData.Size = Marshal.SizeOf(drvData);

            for (uint j = 0; NativeMethods.SetupDiEnumDriverInfo(hDevInfo, ref did, DriverType.SPDIT_COMPATDRIVER, j, ref drvData); j++)
            {
                Console.WriteLine(drvData.ToString());
            }
        }
        else
        {
            throw new Win32Exception();
        }
    }
}

我也尝试过使用SetupDiGetDeviceRegistryProperty来获取特定属性,但对于很多设备而言,并非所有属性都存在。我希望能够拨打这个电话并让它返回SPDRP_INSTALL_STATE,但我还没有收到这个电话的实际回复。

4

1 回答 1

2

SetupDiGetClassDevs的文档包含用于枚举“其他设备”的示例代码(示例 5),并包含以下注释:

您不能将 ClassGuid 参数设置为 GUID_DEVCLASS_UNKNOWN 来检测具有未知安装类的设备。相反,您必须遵循此示例。

在 DDK 中查找GUID_DEVCLASS_UNKNOWN,它与您发布的代码中的 GUID 相同。因此,您尝试使用的方法被记录为无效。

相反,使用该DIGCF_ALLCLASSES选项枚举所有设备,并为每个设备查找设备类。根据示例代码,对于您感兴趣的设备,查找设备类将失败,并显示ERROR_NOT_FOUND.

(根据您要实现的具体目标,可能还有其他方法会更好,例如,您可以尝试查找DEVPKEY_Device_ProblemCode每个设备。我并不真正熟悉所有可能性。)

于 2015-05-27T21:36:02.220 回答