c# - SetupDiEnumDriverInfo 始终返回错误 259(没有更多可用数据)

标签 c# c++ windows winapi driver

我正在尝试利用 win32 API 访问有关与 C# 中的设备关联的驱动程序的信息。

我已成功启用/禁用设备(因此我正在检索的句柄看起来不错),但是在尝试调用SetupDiEnumDriverInfo 时我没有运气。

这是我正在使用的代码:

private List<String> ListCompatibleDrivers(IntPtr hDevInfo, SP_DEVINFO_DATA devInfoData)
{
   List<String> result = new List<String>();
   try
   {
      SP_DRVINFO_DATA drvInfo = new SP_DRVINFO_DATA();

      for (int i = 0; SetupDiEnumDriverInfo(hDevInfo, devInfoData, SPDIT_CLASSDRIVER, i, drvInfo); i++)
      {
         result.Add(drvInfo.Description);
      }

      if (result.Count < 1)
      {
         result.Add(Marshal.GetLastWin32Error().ToString());
      }

      return result;
   }
   catch
   {
      throw;
   }
}

可以假设参数没问题(正如我所说,设置 API 中的其他方法可以成功使用它们)。

这些是可能已损坏的结构和 DllImport:

[StructLayout(LayoutKind.Sequential)]
public class SP_DRVINFO_DATA 
{
   public Int32     cbSize;
   public Int32     driverType;
   public UIntPtr    reserved;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
   public String    description;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
   public String    mfgName;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
   public String    providerName;
   public FILETIME   driverDate;
   public Int64  driverVersion;
};

[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiEnumDriverInfo(IntPtr lpInfoSet, SP_DEVINFO_DATA deviceInfoData, UInt32 driverType, Int32 memberIndex, SP_DRVINFO_DATA driverInfoData);

API 调用立即返回 false,Marshal.GetLastWin32Error().ToString() 返回 259,即 ERROR_NO_MORE_ITEMS

我只是不明白,我的希望很高,我只是犯了一些我看不到的愚蠢错误,因为我最近除了msdn几乎没有读过任何东西,而且它变得非常累......

非常感谢任何帮助,非常感谢!

最佳答案

首先,我可以告诉你,你与函数签名不匹配,而函数签名应该是:

[DllImport("setupapi.dll", SetLastError = true, charset=Charset.Unicode)]
[return:MarshalAs(UnmanagedType.Bool)]
private static extern bool SetupDiEnumDriverInfo(
       [In] IntPtr lpInfoSet,
       [In, Optional] SP_DEVINFO_DATA deviceInfoData,
       [In] UInt32 driverType,
       [In] Int32 memberIndex,
       [Out] out SP_DRVINFO_DATA driverInfoData);

该 out 很重要,因为它指定需要从 PInvoke 中提取数据。

关于c# - SetupDiEnumDriverInfo 始终返回错误 259(没有更多可用数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17344648/

相关文章:

windows - 关于Winsock Kernel Buffer和Nagle算法的疑问

windows - 代码页 850 有效,65001 失败!没有对 "call foo.cmd"的响应。内部命令工作正常

c# - 使用 gRPC 进行基于自定义 channel 的身份验证

c# - WPF:是否有资源更改触发的事件

c++ - 是否可以检查给定的 exception_ptr 实例是否拥有某种类型的异常?

c++ - 使用带有继承的 Qt5 新连接语法

c - Mac OS X 中的多线程

c# - 将一个数组拆分为另一个数组

c# - 如何为 MVVM 样板代码扩展 Prism

c# - 使用 DllImport 时在 C# 中包装 C++ 引用参数