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); }
public static string GetStringPropertyForDevice(IntPtr info, Native.SP_DEVINFO_DATA devdata, DisableHardware.DEVPROPKEY key) { uint proptype, outsize; IntPtr buffer = IntPtr.Zero; try { uint buflen = 512; buffer = Marshal.AllocHGlobal((int)buflen); Native.SetupDiGetDevicePropertyW( info, ref devdata, ref key, out proptype, buffer, buflen, out outsize, 0); byte[] lbuffer = new byte[outsize]; Marshal.Copy(buffer, lbuffer, 0, (int)outsize); return(Encoding.Unicode.GetString(lbuffer)); } finally { if (buffer != IntPtr.Zero) { Marshal.FreeHGlobal(buffer); } } }
bool _ResetDevice(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.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } 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 DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { int iter = 0; //Declare vars while (iter < 5 && !Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { //Skip System.Threading.Thread.Sleep(100); iter++; } HWList.Add(DeviceName.ToString()); } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return(HWList.ToArray()); }
//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); }
//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(string[] match, bool bEnable) { try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { return(false); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); DeviceInfoData.cbSize = 28; //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)) { //Skip } bool bMatch = true; foreach (string search in match) { if (!DeviceName.ToString().ToLower().Contains(search.ToLower())) { bMatch = false; break; } } if (bMatch) { ChangeIt(hDevInfo, DeviceInfoData, bEnable); } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); return(false); } return(true); }
//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 List <DEVICE_INFO> GetAll() { List <DEVICE_INFO> HWList = new List <DEVICE_INFO>(); try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } 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; }//if else if (IntPtr.Size == 8) { DeviceInfoData.cbSize = 32; }//if //is devices exist for class DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder DeviceName = new StringBuilder(""); StringBuilder DeviceFriendlyName = new StringBuilder(""); StringBuilder DeviceHardwareId = new StringBuilder(""); DeviceName.Capacity = DeviceFriendlyName.Capacity = DeviceHardwareId.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { DeviceName.Length = DeviceFriendlyName.Length = DeviceHardwareId.Length = 0; if (!Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { continue; } Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_FRIENDLYNAME, 0, DeviceFriendlyName, Native.MAX_DEV_LEN, IntPtr.Zero); Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_HARDWAREID, 0, DeviceHardwareId, Native.MAX_DEV_LEN, IntPtr.Zero); HWList.Add(new DEVICE_INFO { name = DeviceName.ToString(), friendlyName = DeviceFriendlyName.ToString(), hardwareId = DeviceHardwareId.ToString() }); } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return(HWList); }
//Name: ChangeIt //Inputs: pointer to hdev, SP_DEV_INFO, bool //Outputs: bool //Errors: This method may throw the following exceptions. // Unable to change device state! //Remarks: Attempts to enable or disable a device driver. // IMPORTANT NOTE!!! This code currently 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. 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); 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)) { throw new Exception("Unable to change device state!"); } else { return(true); } } catch (Exception) { return(false); } }
public HWinfoModel[] GetAll() { List <HWinfoModel> HWList = new List <HWinfoModel>(); try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); DeviceInfoData.cbSize = 28; //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++) { Debug.WriteLine(i + "- " + DeviceInfoData.classGuid); //Declare vars int skip = 0; while (!Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { // Debug.WriteLine("Skip"); skip++; if (skip > 1024) { break; } } if (skip < 1024) { if (DeviceInfoData.classGuid == Guid.Parse("{a45c254e-df1c-4efd-8020-67d146a850e0}")) { Debug.WriteLine("ooooh!"); } string devicepath = ""; var DEVPKEY_Device_HardwareIds = new DisableHardware.DEVPROPKEY(); DEVPKEY_Device_HardwareIds.fmtid = new Guid((uint)0x540b947e, (ushort)0x8b40, (ushort)0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2); DEVPKEY_Device_HardwareIds.pid = 4; try { devicepath = GetStringPropertyForDevice(hDevInfo, DeviceInfoData, DEVPKEY_Device_HardwareIds); if (devicepath != "") { Debug.WriteLine(devicepath); } } catch { } HWList.Add(new HWinfoModel { Name = DeviceName.ToString(), Pointer = hDevInfo, ClassGuid = DeviceInfoData.classGuid }); } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return(HWList.ToArray()); }
//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(string[] match, bool bEnable) { try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { return false; } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); 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 DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { int iter = 0; //Declare vars while (iter < 5 && !Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { //Skip System.Threading.Thread.Sleep(100); iter++; } bool bMatch = true; foreach (string search in match) { if (!DeviceName.ToString().ToLower().Contains(search.ToLower())) { bMatch = false; break; } } if (bMatch) { ChangeIt(hDevInfo, DeviceInfoData, bEnable); } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return true; }
public bool CheckDevice(string deviceName) { bool result = false; try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } 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 DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { //Declare vars int iter = 0; while (iter < 5 && !Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { System.Threading.Thread.Sleep(100); iter++; } if (DeviceName.ToString().ToLower().Contains(deviceName)) { result = true; break; } } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return result; }
//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 = Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } Native.SP_DEVINFO_DATA 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 DeviceName = new StringBuilder(""); DeviceName.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { int iter = 0; //Declare vars while (iter < 5 && !Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { //Skip System.Threading.Thread.Sleep(100); iter++; } HWList.Add(DeviceName.ToString()); } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!",ex); } return HWList.ToArray(); }