/// <summary>
        /// Returns a sorted list of all computer's devices
        /// </summary>
        /// <returns></returns>
        public string[] GetDevicesList()
        {
            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();
                DeviceInfoData.cbSize = Marshal.SizeOf(DeviceInfoData);                 // JDA 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;

                if (!Native.SetupDiEnumDeviceInfo(hDevInfo, 0, DeviceInfoData))
                {
                    throw new Exception("No device found, are you kidding? " + Native.GetLastError());
                }

                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
                    }
                    HWList.Add(DeviceName.ToString());
                }
                HWList.Sort();
                Native.SetupDiDestroyDeviceInfoList(hDevInfo);
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to enumerate device tree!", ex);
            }
            return(HWList.ToArray());
        }
        private bool RestartDevice(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)));

            if (!rslt1)
            {
                throw new Exception("SetupDiSetClassInstallParams failed " + Native.GetLastError());
            }

            bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);

            if (!rstl2)
            {
                throw new Exception("SetupDiCallClassInstaller failed" + Native.GetLastError());
            }

            if (rslt1 && rstl2)
            {
                return(true);
            }


            return(false);
        }