// enable/disable...
        private static void EnableDevice(SafeDeviceInfoSetHandle handle, DeviceInfoData diData, bool enable)
        {
            // The size is just the size of the header, but we've flattened the structure.
            // The header comprises the first two fields, both integer.
            var @params = new PropertyChangeParameters
            {
                Size        = 8,
                DiFunction  = DiFunction.PropertyChange,
                Scope       = Scopes.Global,
                StateChange = enable ? StateChangeAction.Enable : StateChangeAction.Disable
            };

            var result =
                NativeMethods.SetupDiSetClassInstallParams(handle, ref diData, ref @params, Marshal.SizeOf(@params));

            if (!result)
            {
                throw new Win32Exception();
            }
            result = NativeMethods.SetupDiCallClassInstaller(DiFunction.PropertyChange, handle, ref diData);
            if (result)
            {
                return;
            }
            var err = Marshal.GetLastWin32Error();

            if (err == (int)SetupApiError.NotDisableable)
            {
                throw new ArgumentException("Device can't be disabled (programmatically or in Device Manager).");
            }
            if (err >= (int)SetupApiError.NoAssociatedClass &&
                err <= (int)SetupApiError.OnlyValidateViaAuthenticode)
            {
                throw new Win32Exception("SetupAPI error: " + ((SetupApiError)err).ToString());
            }
            throw new Win32Exception();
        }
 public static extern bool SetupDiSetClassInstallParams(SafeDeviceInfoSetHandle deviceInfoSet,
                                                        [In] ref DeviceInfoData deviceInfoData, [In] ref PropertyChangeParameters classInstallParams,
                                                        int classInstallParamsSize);