Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式检测故障或丢失的驱动程序_C#_Windows_Drivers_Setupapi - Fatal编程技术网

C# 以编程方式检测故障或丢失的驱动程序

C# 以编程方式检测故障或丢失的驱动程序,c#,windows,drivers,setupapi,C#,Windows,Drivers,Setupapi,我的任务是找到一种方法来检测有故障或丢失的驱动程序,这样我的程序就可以安装一个更好的,可以与我的系统一起工作的驱动程序。我一直在尝试的事情包括使用setupapi.dll从注册表获取值,并尝试查找一些标志,让我知道驱动程序有问题。在上,我发现“其他设备”的类GUID是4d36e97e-e325-11ce-bfc1-08002be10318。但是,如果我尝试枚举这些设备,我将一无所获,即使我在设备管理器下看到该类别中的设备。是否有其他Windows API可以为我提供某种方法来识别此类设备或一般的

我的任务是找到一种方法来检测有故障或丢失的驱动程序,这样我的程序就可以安装一个更好的,可以与我的系统一起工作的驱动程序。我一直在尝试的事情包括使用
setupapi.dll
从注册表获取值,并尝试查找一些标志,让我知道驱动程序有问题。在上,我发现“其他设备”的类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\u INSTALL\u STATE
,但我尚未收到此调用的实际响应。

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

无法将ClassGuid参数设置为GUID\U DEVCLASS\U UNKNOWN以检测安装类未知的设备。相反,您必须遵循此示例

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


相反,使用
DIGCF\u ALLCLASSES
选项枚举所有设备,并查找每个设备的设备类。根据示例代码,对于您感兴趣的设备,查找设备类将失败,并出现
ERROR\u NOT\u FOUND


(根据您试图实现的具体目标,可能还有其他更有效的方法,例如,您可以尝试查找每个设备的
DEVPKEY\u Device\u ProblemCode
。我并不完全熟悉所有的可能性。)

为了澄清,对
SetupDiEnumDeviceInfo
的调用在第一次调用时(当
i
为零时)返回
FALSE
,错误代码
error\u NO\u MORE\u ITEMS
?您是否尝试过使用已知的GUID(例如,
GUID\u DEVCLASS\u MOUSE
),以确保代码按预期工作?您可以使用
DIGCF\u ALLCLASSES
并为GUID传递
NULL
来枚举所有设备。如果可以通过这种方式找到设备,则可以查找GUID以查看它是什么。另一个想法是:可能是
DIGCF\u PRESENT
把你搞砸了;我不确定在这种情况下,没有驱动程序的设备是否被视为“存在”。@HarryJohnston我认为您关于
DIGCF\u present
不适用于缺少的驱动程序的说法可能是正确的,但如果我尝试使用
DIGCF\u ALLCLASSES
它似乎不会返回有效的设备句柄。至于你的第一个问题,对
SetupDiEnumDeviceInfo
的调用返回true,并且与我传入的GUID配合很好,除了当我尝试枚举“其他设备”的信息时,或者“未知”类什么都没有出现。
DIGCF\u ALLCLASSES
似乎对我来说工作很好,请看@HarryJohnston Ok,我已经开始工作了,但是它会返回我在机器上安装的所有驱动程序。我正在寻找“未知”类别的设备,这些设备可能没有安装驱动程序。