bool GetNativeDevInfo(DEVICE_INFO deviceToChangeState, out IntPtr ptrDevInfo, out Native.SP_DEVINFO_DATA devData) { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt64() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Could retrieve handle for device"); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); //for 32-bit, IntPtr.Size = 4 //for 64-bit, IntPtr.Size = 8 if (IntPtr.Size == 4) { DeviceInfoData.cbSize = 28; } else if (IntPtr.Size == 8) { DeviceInfoData.cbSize = 32; } //is devices exist for class DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder DeviceHardwareId = new StringBuilder(""); StringBuilder DeviceFriendlyName = new StringBuilder(""); DeviceHardwareId.Capacity = DeviceFriendlyName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { //Declare vars Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_HARDWAREID, 0, DeviceHardwareId, Native.MAX_DEV_LEN, IntPtr.Zero); Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_FRIENDLYNAME, 0, DeviceFriendlyName, Native.MAX_DEV_LEN, IntPtr.Zero); Console.WriteLine(DeviceHardwareId + " -- " + DeviceFriendlyName); if (DeviceHardwareId.ToString().ToLower().Contains(deviceToChangeState.hardwareId.ToLower()) && DeviceFriendlyName.ToString().ToLower().Contains(deviceToChangeState.friendlyName.ToLower())) { Console.WriteLine("Found: " + DeviceFriendlyName); devData = DeviceInfoData; ptrDevInfo = hDevInfo; return (true); } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); devData = null; ptrDevInfo = IntPtr.Zero; return (false); }
//Name: SetDeviceState //Inputs: string[],bool //Outputs: bool //Errors: This method may throw the following exceptions. // Failed to enumerate device tree! //Remarks: This is nearly identical to the method above except it // tries to match the hardware description against the criteria // passed in. If a match is found, that device will the be // enabled or disabled based on bEnable. public bool SetDeviceState(DEVICE_INFO deviceToChangeState, bool bEnable) { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt64() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Could retrieve handle for device"); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); //for 32-bit, IntPtr.Size = 4 //for 64-bit, IntPtr.Size = 8 if (IntPtr.Size == 4) { DeviceInfoData.cbSize = 28; } else if (IntPtr.Size == 8) { DeviceInfoData.cbSize = 32; } //is devices exist for class DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder DeviceHardwareId = new StringBuilder(""); StringBuilder DeviceFriendlyName = new StringBuilder(""); DeviceHardwareId.Capacity = DeviceFriendlyName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { DeviceFriendlyName.Length = DeviceHardwareId.Length = 0; //Declare vars Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_HARDWAREID, 0, DeviceHardwareId, Native.MAX_DEV_LEN, IntPtr.Zero); Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_FRIENDLYNAME, 0, DeviceFriendlyName, Native.MAX_DEV_LEN, IntPtr.Zero); //Console.WriteLine(DeviceHardwareId + " -- " + DeviceFriendlyName); if (DeviceHardwareId.ToString().ToLower().Contains(deviceToChangeState.hardwareId.ToLower()) && DeviceFriendlyName.ToString().ToLower().Contains(deviceToChangeState.friendlyName.ToLower())) { Console.WriteLine("Found: " + DeviceFriendlyName); bool couldChangeState = ChangeIt(hDevInfo, DeviceInfoData, bEnable); if (!couldChangeState) { throw new Exception("Unable to change " + DeviceFriendlyName + " device state, make sure you have administrator privileges"); } break; } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); return(true); }
public bool ResetDevice(DEVICE_INFO dev) { Native.SP_DEVINFO_DATA devInfo; IntPtr devPtr; if (GetNativeDevInfo(dev, out devPtr, out devInfo)) { bool bOk = _ResetDevice(devPtr, devInfo); Native.SetupDiDestroyDeviceInfoList(devPtr); return (bOk); } return (false); }