我正在开发一个需要启用/禁用特定USB存储设备的项目。
我的应用获取所有存储USB DeviceID,并且根据保存的设置,然后需要允许设备。我使用了this上一个问题的代码来启用/禁用,并将其调用为:
DisableHardware.DisableDevice(n => n.ToUpperInvariant().Contains(VidPid), true);
string VidPid = "VID_8564&PID_1000";
。
我已经完成了代码,它完全正常工作(据我所知),直到SetupDIChangeState
调用,然后返回-536870389(E000020B为十六进制)作为错误代码(来自Marshall.GetLastWin32Error()
)。
显然这指的是1)设备不存在(据我所知,这不是这里的情况,因为这个类中的所有其他调用工作正常,我从
获得'VidPid'private static List<WMUBClasses.USBDeviceInfo> GetUSBDevices()
{
try
{
List<WMUBClasses.USBDeviceInfo> tList = new List<WMUBClasses.USBDeviceInfo>();
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_USBHub"))
{
collection = searcher.Get();
}
foreach (var device in collection)
{
if (!device.GetPropertyValue("Description").ToString().Contains("Storage"))
{
continue;
}
tList.Add(new WMUBClasses.USBDeviceInfo(
(string)device.GetPropertyValue("DeviceID"),
(string)device.GetPropertyValue("PNPDeviceID"),
(string)device.GetPropertyValue("Description")
));
}
return tList;
}
catch (Exception ex)
{
return null;
}
}
或2)一个不正确的构建平台,但我尝试了所有不同的组合(任何CPU,混合平台,x86和x64),它们都返回相同的结果。
我还看了this这是解决我问题的另一种方法(通过创建和使用内核模式过滤器驱动程序),它似乎就像用一个破坏球杀死一只苍蝇。说实话,我不知道如何使用它(对于没有进行任何驱动程序开发的人来说,它看起来非常令人生畏,特别是在阅读了一些可用的文档之后。)
我应该(A)继续使用SetupDi API调用来实现我的目标,如果是这样,任何人都可以看到代码有什么问题或我如何使用它?如果不是(A),我是否应该使用过滤器驱动程序方法,如果是,则使用任何指针?
如标题中所述,我想禁用特定的USB存储设备,据我所知,这排除了使用注册表禁用所有USB存储设备。所以,如果上述情况都没有,那么我是否应该有任何其他指示呢?