disable the device if the user selects "Do not show this dialog anymore". However, this doesn't work at the moment because disabling devices isn't implemented. Once it works, umpnpmgr shouldn't display the device installation wizard for disabled devices anymore.
Modified: trunk/reactos/lib/newdev/newdev.c
Modified: trunk/reactos/lib/newdev/newdev.h

Modified: trunk/reactos/lib/newdev/newdev.c
--- trunk/reactos/lib/newdev/newdev.c	2005-12-05 21:04:44 UTC (rev 19918)
+++ trunk/reactos/lib/newdev/newdev.c	2005-12-05 21:36:54 UTC (rev 19919)
@@ -22,6 +22,118 @@
 HINSTANCE hDllInstance;
 HANDLE hThread;
 
+BOOL
+CanDisableDevice(IN DEVINST DevInst,
+                 IN HMACHINE hMachine,
+                 OUT BOOL *CanDisable)
+{
+    CONFIGRET cr;
+    ULONG Status, ProblemNumber;
+    BOOL Ret = FALSE;
+
+    cr = CM_Get_DevNode_Status_Ex(&Status,
+                                  &ProblemNumber,
+                                  DevInst,
+                                  0,
+                                  hMachine);
+    if (cr == CR_SUCCESS)
+    {
+        *CanDisable = ((Status & DN_DISABLEABLE) != 0);
+        Ret = TRUE;
+    }
+
+    return Ret;
+}
+
+
+BOOL
+IsDeviceEnabled(IN DEVINST DevInst,
+                IN HMACHINE hMachine,
+                OUT BOOL *IsEnabled)
+{
+    CONFIGRET cr;
+    ULONG Status, ProblemNumber;
+    BOOL Ret = FALSE;
+
+    cr = CM_Get_DevNode_Status_Ex(&Status,
+                                  &ProblemNumber,
+                                  DevInst,
+                                  0,
+                                  hMachine);
+    if (cr == CR_SUCCESS)
+    {
+        *IsEnabled = ((Status & DN_STARTED) != 0);
+        Ret = TRUE;
+    }
+
+    return Ret;
+}
+
+
+BOOL
+EnableDevice(IN HDEVINFO DeviceInfoSet,
+             IN PSP_DEVINFO_DATA DevInfoData  OPTIONAL,
+             IN BOOL bEnable,
+             IN DWORD HardwareProfile  OPTIONAL,
+             OUT BOOL *bNeedReboot  OPTIONAL)
+{
+    SP_PROPCHANGE_PARAMS pcp;
+    SP_DEVINSTALL_PARAMS dp;
+    DWORD LastErr;
+    BOOL Ret = FALSE;
+
+    pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
+    pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
+    pcp.HwProfile = HardwareProfile;
+
+    if (bEnable)
+    {
+        /* try to enable the device on the global profile */
+        pcp.StateChange = DICS_ENABLE;
+        pcp.Scope = DICS_FLAG_GLOBAL;
+
+        /* ignore errors */
+        LastErr = GetLastError();
+        if (SetupDiSetClassInstallParams(DeviceInfoSet,
+                                         DevInfoData,
+                                         &pcp.ClassInstallHeader,
+                                         sizeof(SP_PROPCHANGE_PARAMS)))
+        {
+            SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
+                                      DeviceInfoSet,
+                                      DevInfoData);
+        }
+        SetLastError(LastErr);
+    }
+
+    /* try config-specific */
+    pcp.StateChange = (bEnable ? DICS_ENABLE : DICS_DISABLE);
+    pcp.Scope = DICS_FLAG_CONFIGSPECIFIC;
+
+    if (SetupDiSetClassInstallParams(DeviceInfoSet,
+                                     DevInfoData,
+                                     &pcp.ClassInstallHeader,
+                                     sizeof(SP_PROPCHANGE_PARAMS)) &&
+        SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
+                                  DeviceInfoSet,
+                                  DevInfoData))
+    {
+        dp.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+        if (SetupDiGetDeviceInstallParams(DeviceInfoSet,
+                                          DevInfoData,
+                                          &dp))
+        {
+            if (bNeedReboot != NULL)
+            {
+                *bNeedReboot = ((dp.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) != 0);
+            }
+
+            Ret = TRUE;
+        }
+    }
+    return Ret;
+}
+
 /*
 * @unimplemented
 */
@@ -390,6 +502,7 @@
     size_t nType;
     DWORD dwDrives;
     PDEVINSTDATA DevInstData;
+    DWORD config_flags;
     UINT i = 1;
 
     DevInstData = (PDEVINSTDATA)lpParam;
@@ -419,6 +532,23 @@
         i <<= 1;
     }
 
+    /* update device configuration */
+    if(SetupDiGetDeviceRegistryProperty(DevInstData->hDevInfo,
+        &DevInstData->devInfoData,
+        SPDRP_CONFIGFLAGS,
+        NULL,
+        (BYTE *)&config_flags,
+        sizeof(config_flags),
+        NULL))
+    {
+        config_flags |= CONFIGFLAG_FAILEDINSTALL;
+        SetupDiSetDeviceRegistryProperty(
+            DevInstData->hDevInfo,
+            &DevInstData->devInfoData,
+            SPDRP_CONFIGFLAGS,
+            NULL, 0 );
+    }
+
     PostMessage(DevInstData->hDialog, WM_SEARCH_FINISHED, 0, 0);
     return 0;
 }
@@ -515,6 +645,7 @@
     case WM_INITDIALOG:
         {
             HWND hwndControl;
+            BOOL DisableableDevice = FALSE;
 
             DevInstData = (PDEVINSTDATA)((LPPROPSHEETPAGE)lParam)->lParam;
             SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)DevInstData);
@@ -529,14 +660,21 @@
                 WM_SETFONT,
                 (WPARAM)DevInstData->hTitleFont,
                 (LPARAM)TRUE);
+
+            /* disable the "do not show this dialog anymore" checkbox
+               if the device cannot be disabled */
+            CanDisableDevice(DevInstData->devInfoData.DevInst,
+                             NULL,
+                             &DisableableDevice);
+            EnableWindow(GetDlgItem(hwndDlg,
+                                    IDC_DONOTSHOWDLG),
+                         DisableableDevice);
         }
         break;
 
     case WM_NOTIFY:
         {
             LPNMHDR lpnm = (LPNMHDR)lParam;
-            DWORD config_flags;
-            BOOL ret;
 
             switch (lpnm->code)
             {
@@ -551,28 +689,29 @@
                 break;
 
             case PSN_WIZFINISH:
-                /* Handle a Finish button click, if necessary */
-                if (SendDlgItemMessage(hwndDlg, IDC_DONOTSHOWDLG, BM_GETCHECK, (WPARAM) 0, (LPARAM) 0) == BST_CHECKED)
+            {
+                BOOL DisableableDevice = FALSE;
+                BOOL IsEnabled = FALSE;
+
+                if (CanDisableDevice(DevInstData->devInfoData.DevInst,
+                                     NULL,
+                                     &DisableableDevice) &&
+                    DisableableDevice &&
+                    IsDeviceEnabled(DevInstData->devInfoData.DevInst,
+                                    NULL,
+                                    &IsEnabled) &&
+                    IsEnabled &&
+                    SendDlgItemMessage(hwndDlg, IDC_DONOTSHOWDLG, BM_GETCHECK, (WPARAM) 0, (LPARAM) 0) == BST_CHECKED)
                 {
-
-                    if(SetupDiGetDeviceRegistryProperty(DevInstData->hDevInfo,
-                        &DevInstData->devInfoData,
-                        SPDRP_CONFIGFLAGS,
-                        NULL,
-                        (BYTE *)&config_flags,
-                        sizeof(config_flags),
-                        NULL))
-                    {
-                        config_flags |= CONFIGFLAG_FAILEDINSTALL;
-                        ret = SetupDiSetDeviceRegistryProperty(
-                            DevInstData->hDevInfo,
-                            &DevInstData->devInfoData,
-                            SPDRP_CONFIGFLAGS,
-                            NULL, 0 );
-                    }
-
+                    /* disable the device */
+                    EnableDevice(DevInstData->hDevInfo,
+                                 &DevInstData->devInfoData,
+                                 FALSE,
+                                 0,
+                                 NULL);
                 }
                 break;
+            }
 
             default:
                 break;

Modified: trunk/reactos/lib/newdev/newdev.h
--- trunk/reactos/lib/newdev/newdev.h	2005-12-05 21:04:44 UTC (rev 19918)
+++ trunk/reactos/lib/newdev/newdev.h	2005-12-05 21:36:54 UTC (rev 19919)
@@ -2,6 +2,7 @@
 #include <commctrl.h>
 #include <regstr.h>
 #include <setupapi.h>
+#include <cfgmgr32.h>
 #include <tchar.h>
 
 #include <stdio.h>