// enable/disable...
        private static void EnableDevice(SafeDeviceInfoSetHandle handle, DeviceInfoData diData, bool enable)
        {
            PropertyChangeParameters @params = new PropertyChangeParameters();

            // The size is just the size of the header, but we've flattened the structure.
            // The header comprises the first two fields, both integer.
            @params.Size       = 8;
            @params.DiFunction = DiFunction.PropertyChange;
            @params.Scope      = Scopes.Global;
            if (enable)
            {
                @params.StateChange = StateChangeAction.Enable;
            }
            else
            {
                @params.StateChange = StateChangeAction.Disable;
            }

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

            if (result == false)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            result = NativeMethods.SetupDiCallClassInstaller(DiFunction.PropertyChange, handle, ref diData);
            if (result == false)
            {
                int err = Marshal.GetLastWin32Error();
                if (err == (int)SetupApiError.NotDisableable)
                {
                    throw new ArgumentException("Device can't be disabled (programmatically or in Device Manager).");
                }
                else if (err <= (int)SetupApiError.NoAssociatedClass && err >= (int)SetupApiError.OnlyValidateViaAuthenticode)
                {
                    throw new Win32Exception("SetupAPI error: " + ((SetupApiError)err).ToString());
                }
                else
                {
                    throw new Win32Exception(err);
                }
            }
        }
        private static List <string> GetInstanceIdsFromClassGuid(Guid classGuid)
        {
            SafeDeviceInfoSetHandle diSetHandle = null;
            List <string>           resultList  = new List <string>();

            try
            {
                // Get the handle to a device information set for all devices matching classGuid that are present on the
                // system.
                diSetHandle = NativeMethods.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero, SetupDiGetClassDevsFlags.Present);
                // Get the device information data for each matching device.
                DeviceInfoData[] diData = GetDeviceInfoData(diSetHandle);

                const int ERROR_INSUFFICIENT_BUFFER = 122;
                for (int index = 0; index <= diData.Length - 1; index++)
                {
                    StringBuilder sb           = new StringBuilder(1);
                    int           requiredSize = 0;
                    bool          result       = NativeMethods.SetupDiGetDeviceInstanceId(diSetHandle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                    if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
                    {
                        sb.Capacity = requiredSize;
                        result      = NativeMethods.SetupDiGetDeviceInstanceId(diSetHandle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);

                        resultList.Add(sb.ToString());
                    }
                }
            }
            finally
            {
                if (diSetHandle != null)
                {
                    if (diSetHandle.IsClosed == false)
                    {
                        diSetHandle.Close();
                    }
                    diSetHandle.Dispose();
                }
            }
            return(resultList);
        }
 public static extern bool SetupDiEnumDeviceInfo(
     SafeDeviceInfoSetHandle deviceInfoSet,
     int memberIndex,
     ref DeviceInfoData deviceInfoData);
 public static extern bool SetupDiSetClassInstallParams(
     SafeDeviceInfoSetHandle deviceInfoSet,
     [In()] ref DeviceInfoData deviceInfoData,
     [In()] ref PropertyChangeParameters classInstallParams,
     int classInstallParamsSize);
 public static extern bool SetupDiCallClassInstaller(
     DiFunction installFunction,
     SafeDeviceInfoSetHandle deviceInfoSet,
     [In()] ref DeviceInfoData deviceInfoData);