Example #1
0
        private bool TryReEnableDevice(string deviceInstanceId)
        {
            try
            {
                bool success;

                Guid hidGuid = new Guid();
                NativeMethods.HidD_GetHidGuid(ref hidGuid);
                IntPtr deviceInfoSet = NativeMethods.SetupDiGetClassDevs(ref hidGuid, deviceInstanceId, 0,
                                                                         NativeMethods.DIGCF_PRESENT | NativeMethods.DIGCF_DEVICEINTERFACE);
                NativeMethods.SP_DEVINFO_DATA deviceInfoData = new NativeMethods.SP_DEVINFO_DATA();
                deviceInfoData.cbSize = Marshal.SizeOf(deviceInfoData);
                success = NativeMethods.SetupDiEnumDeviceInfo(deviceInfoSet, 0, ref deviceInfoData);
                success = NativeMethods.SetupDiEnumDeviceInfo(deviceInfoSet, 1,
                                                              ref deviceInfoData); // Checks that we have a unique device

                NativeMethods.SP_PROPCHANGE_PARAMS propChangeParams = new NativeMethods.SP_PROPCHANGE_PARAMS();
                propChangeParams.classInstallHeader.cbSize          = Marshal.SizeOf(propChangeParams.classInstallHeader);
                propChangeParams.classInstallHeader.installFunction = NativeMethods.DIF_PROPERTYCHANGE;
                propChangeParams.stateChange = NativeMethods.DICS_DISABLE;
                propChangeParams.scope       = NativeMethods.DICS_FLAG_GLOBAL;
                propChangeParams.hwProfile   = 0;
                success = NativeMethods.SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInfoData,
                                                                     ref propChangeParams, Marshal.SizeOf(propChangeParams));
                if (!success)
                {
                    return(false);
                }

                success = NativeMethods.SetupDiCallClassInstaller(NativeMethods.DIF_PROPERTYCHANGE, deviceInfoSet,
                                                                  ref deviceInfoData);
                if (!success)
                {
                    return(false);
                }

                propChangeParams.stateChange = NativeMethods.DICS_ENABLE;
                success = NativeMethods.SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInfoData,
                                                                     ref propChangeParams, Marshal.SizeOf(propChangeParams));
                if (!success)
                {
                    return(false);
                }

                success = NativeMethods.SetupDiCallClassInstaller(NativeMethods.DIF_PROPERTYCHANGE, deviceInfoSet,
                                                                  ref deviceInfoData);
                if (!success)
                {
                    return(false);
                }

                NativeMethods.SetupDiDestroyDeviceInfoList(deviceInfoSet);

                return(true);
            }
            catch
            {
                return(false);
            }
        }