Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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);
        }
Example #4
0
        //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);
 }
Example #7
0
        //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);
            }
        }
Example #9
0
        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());
        }
Example #10
0
        //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;
        }
Example #11
0
        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;
        }
Example #12
0
        //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();
        }