private bool ResetIt(IntPtr hDevInfo, Native.SP_DEVINFO_DATA devInfoData) { int szOfPcp; IntPtr ptrToPcp; int szDevInfoData; IntPtr ptrToDevInfoData; Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS(); pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER)); pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE; pcp.StateChange = Native.DICS_PROPCHANGE; // for reset pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC; pcp.HwProfile = 0; szOfPcp = Marshal.SizeOf(pcp); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(pcp, ptrToPcp, true); szDevInfoData = Marshal.SizeOf(devInfoData); ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true); bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS))); bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); if (rslt1 && rstl2) { return(true); } return(false); }
//Name: GetAll //Inputs: none //Outputs: string array //Errors: This method may throw the following errors. // Failed to enumerate device tree! // Invalid handle! //Remarks: This is code I cobbled together from a number of newsgroup threads // as well as some C++ stuff I translated off of MSDN. Seems to work. // The idea is to come up with a list of devices, same as the device // manager does. Currently it uses the actual "system" names for the // hardware. It is also possible to use hardware IDs. See the docs // for SetupDiGetDeviceRegistryProperty in the MS SDK for more details. public string[] GetAll() { List <string> HWList = new List <string>(); try { 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)//changed from Int32 { throw new Exception("Invalid Handle"); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); DeviceInfoData.cbSize = Marshal.SizeOf(typeof(Native.SP_DEVINFO_DATA)); /*//added fix for x64 from DeviceInfoData.cbSize = 28; * if (IntPtr.Size == 4) * { * DeviceInfoData.cbSize = 28;// Marshal.SizeOf(DeviceInfoData); * } * 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 DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { //Declare vars while (!Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { break; //Skip } HWList.Add(DeviceName.ToString()); HWList.Sort(); } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return(HWList.ToArray()); }
public bool ResetDevice(string match) { bool success = false; try { 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)//changed from Int32 { return(false); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); DeviceInfoData.cbSize = Marshal.SizeOf(typeof(Native.SP_DEVINFO_DATA)); //is devices exist for class DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { //Declare vars if (!Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { continue; } if (DeviceName.ToString().ToLower().Contains(match)) { if (this.ResetIt(hDevInfo, DeviceInfoData)) { success = true; } } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { Exceptions.Write(new Exception("Failed to enumerate device tree!", ex)); return(false); } return(success); }
/// <summary> /// Inputs: pointer to hdev, SP_DEV_INFO, bool /// Errors: This method may throw the following exceptions. Unable to change device state! /// Remarks: Attempts to enable or disable a device driver. does not check the reboot flag /// Some devices require you reboot the OS for the change to take affect. /// If this describes your device, you will need to look at the SDK call: /// SetupDiGetDeviceInstallParams. You can call it directly after /// ChangeIt to see whether or not you need to reboot the OS for you change to go into effect. /// </summary> /// <param name="hDevInfo"></param> /// <param name="devInfoData"></param> /// <param name="bEnable"></param> /// <returns>bool</returns> private bool ChangeIt(IntPtr hDevInfo, Native.SP_DEVINFO_DATA devInfoData, bool bEnable) { try { //Marshalling vars int szOfPcp; IntPtr ptrToPcp; int szDevInfoData; IntPtr ptrToDevInfoData; Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS(); if (bEnable) { pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER)); pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE; pcp.StateChange = Native.DICS_ENABLE; pcp.Scope = Native.DICS_FLAG_GLOBAL; pcp.HwProfile = 0; //Marshal the params szOfPcp = Marshal.SizeOf(pcp); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(pcp, ptrToPcp, true); szDevInfoData = Marshal.SizeOf(devInfoData); ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); //Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);//fix ? if (Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)))) { Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); } pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER)); pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE; pcp.StateChange = Native.DICS_ENABLE; pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC; pcp.HwProfile = 0; } else { pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER)); pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE; pcp.StateChange = Native.DICS_DISABLE; pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC; pcp.HwProfile = 0; } //Marshal the params szOfPcp = Marshal.SizeOf(pcp); ptrToPcp = Marshal.AllocHGlobal(szOfPcp); Marshal.StructureToPtr(pcp, ptrToPcp, true); szDevInfoData = Marshal.SizeOf(devInfoData); ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData); Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true); bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS))); bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData); if ((!rslt1) || (!rstl2)) { Exceptions.Write(new Exception("Unable to change device state!")); return(false); } else { return(true); } } catch (Exception ex) { Exceptions.Write(ex); return(false); } }