如何解决如果由于 ERROR_INVALID_PARAMETER 失败,如何使用 setupapi DiInstallDevice 以编程方式 (RNDIS) 强制通用 Microsoft 驱动程序?
当我将 USB RNdis 设备(Linux 小工具)插入 Windows PC 时,被视为“RNdis”设备,没有驱动程序。为了让它工作,我转到设备管理器,然后manually选择 Microsoft Generic Remote RNdis Driver。
我的最终目标是通过代码 (C#) 强制安装通用的 Microsoft 驱动程序,以避免用户手动安装。 我尝试了 devcon、pnputil 和其他方法,但没有任何效果。最后,我为 DiInstallDevice Windows SetupAPI 实现了 pinvoke。
[DllImport("setupapi.dll",CharSet = CharSet.Auto,SetLastError = true)]
static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid,[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,IntPtr hwndParent,uint Flags);
[DllImport("setupapi.dll",SetLastError = true)]
static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet,uint MemberIndex,ref SP_DEVINFO_DATA DeviceInfoData);
[DllImport("setupapi.dll",SetLastError = true)]
static extern bool SetupDiEnumDriverInfo(IntPtr DeviceInfoSet,ref SP_DEVINFO_DATA DeviceInfoData,int driverType,int MemberIndex,ref SP_DRVINFO_DATA drvinfo);
[DllImport("newdev.dll",SetLastError = true)]
public static extern bool DiInstallDevice(
IntPtr hwndParent,IntPtr deviceInfoSet,ref SP_DRVINFO_DATA DriverInfoData,DiFlags Flags,ref bool NeedReboot);
[DllImport("setupapi.dll",SetLastError = true)]
static extern bool SetupDiBuildDriverInfoList(
IntPtr deviceInfoSet,ref SP_DEVINFO_DATA deviceInfoData,int DriverType);
...
public static void ForceRNdisDriver(IntPtr hwndParent)
{
var nullguid = Guid.Empty;
IntPtr deviceInfoSet = SetupDiGetClassDevs(ref nullguid,null,IntPtr.Zero,(uint)(DiGetClassFlags.DIGCF_ALLCLASSES)); //all devices
if (deviceInfoSet.ToInt64() != -1 && deviceInfoSet.ToInt64() != 0)
{
uint BUFFER_SIZE = 32000;
byte[] ptrBuf = new byte[BUFFER_SIZE];
SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();
deviceInfoData.cbSize = (uint)Marshal.SizeOf(deviceInfoData);
SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA();
driverInfoData.cbSize = Marshal.SizeOf(driverInfoData);
bool Success = true;
uint i = 0;
while (Success)
{
// start the enumeration searching for hardware ID
Success = SetupDiEnumDeviceInfo(deviceInfoSet,i,ref deviceInfoData);
if (Success)
{
if (SetupDiGetDeviceRegistryProperty(deviceInfoSet,ref deviceInfoData,(uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_HARDWAREID,out uint RegType,ptrBuf,BUFFER_SIZE,out uint requiredSize))
{
string hwid = Encoding.Unicode.GetString(ptrBuf,(int)requiredSize - 2);
if (hwid.toupper().Contains("HARDWAREIDEXAMPLE"))
{
int SPDIT_NODRIVER = 0x00000000;
int SPDIT_CLASSDRIVER = 0x00000001;
int SPDIT_COMPATDRIVER = 0x00000002;
bool built = SetupDiBuildDriverInfoList(deviceInfoSet,SPDIT_CLASSDRIVER);
if (built)
{
int di = 0;
while (true)
{
bool enumed = SetupDiEnumDriverInfo(deviceInfoSet,SPDIT_CLASSDRIVER,di++,ref driverInfoData);
if (enumed)
{
if (driverInfoData.Description.toupper().Contains("Ndis"))
{
break;
}
}
else
break;
}
}
break;
}
}
}
i++;
}
bool reboot = true;
bool dii = DiInstallDevice(hwndParent,deviceInfoSet,ref driverInfoData,DiFlags.DIIDFLAG_INSTALLNULLDRIVER,ref reboot);
int le = GetLastError();//87: INVALID_ParaMETER
}
}
我可以检索 deviceInfoData 和 driverInfoData,其中包含有意义的数据。
对 DiInstallDevice 的最后一次调用总是失败,并显示最后一个错误 87:ERROR_INVALID_ParaMETER。 我错过了什么吗?有没有其他方法可以为无法识别的设备选择通用驱动程序?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。