我的任务是找到一种方法来检测错误或丢失的驱动程序,以便我的程序可以安装一个更适合我的系统的程序。我一直在尝试的事情包括使用setupapi.dll
从注册表中获取值并尝试找到一些标志,让我知道驱动程序存在问题。在https://www.google.co.in/?gfe_rd=cr&ei=EwJeVbHWLcX08wfgwoCoBA&gws_rd=ssl&custom=abc上,我发现“其他设备”的类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
但是我还没有得到这个电话的实际回复。
答案 0 :(得分:2)
documentation for SetupDiGetClassDevs包含用于枚举"其他设备"的示例代码(示例5)。并包含以下注释:
您无法将ClassGuid参数设置为GUID_DEVCLASS_UNKNOWN以检测具有未知安装类的设备。相反,您必须遵循此示例。
在DDK中查找GUID_DEVCLASS_UNKNOWN
,它与您发布的代码中的GUID相同。因此,您尝试使用的方法记录不起作用。
相反,使用DIGCF_ALLCLASSES
选项枚举所有设备,并查找每个设备的设备类。根据示例代码,对于您感兴趣的设备,查找设备类将失败并显示ERROR_NOT_FOUND
。
(根据您正在尝试实现的目标,可能还有其他方法可以更好地运行,例如,您可以尝试为每个设备查找DEVPKEY_Device_ProblemCode
。我并不是真的熟悉所有可能性。)