[devmgr]
[reactos.git] / reactos / dll / win32 / devmgr / advprop.c
index b7af67e..dfc8d35 100644 (file)
  * UPDATE HISTORY:
  *      04-04-2004  Created
  */
-#include <precomp.h>
+#include "precomp.h"
 
 #define NDEBUG
 #include <debug.h>
 
-/* setupapi */
-DWORD WINAPI pSetupGuidFromString(PCWSTR pString, LPGUID lpGUID);
-
 typedef INT_PTR (WINAPI *PPROPERTYSHEETW)(LPCPROPSHEETHEADERW);
 typedef HPROPSHEETPAGE (WINAPI *PCREATEPROPERTYSHEETPAGEW)(LPCPROPSHEETPAGEW);
 typedef BOOL (WINAPI *PDESTROYPROPERTYSHEETPAGE)(HPROPSHEETPAGE);
@@ -66,6 +63,7 @@ typedef struct _DEVADVPROP_INFO
         UINT Flags;
         struct
         {
+            UINT Extended : 1;
             UINT FreeDevPropSheets : 1;
             UINT CanDisable : 1;
             UINT DeviceStarted : 1;
@@ -560,6 +558,56 @@ AdvProcDriverDlgProc(IN HWND hwndDlg,
                                        (ULONG_PTR)dap);
                         break;
                     }
+                    case IDC_UPDATEDRIVER:
+                    {
+                        if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
+                        {
+                            BOOL NeedReboot;
+                            if (DiShowUpdateDevice(hwndDlg, dap->CurrentDeviceInfoSet, &dap->CurrentDeviceInfoData, 0, &NeedReboot))
+                            {
+                                if (NeedReboot)
+                                {                              
+                                    //FIXME: load text from resource file
+                                    if(MessageBoxW(hwndDlg, L"Reboot now?", L"Reboot required", MB_YESNO | MB_ICONQUESTION) == IDYES)
+                                    {
+                                        HANDLE hToken;
+                                        TOKEN_PRIVILEGES Privileges;
+
+                                        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
+                                        {
+                                            DPRINT("OpenProcessToken failed\n");
+                                            break;
+                                        }
+
+                                        /* Get the LUID for the Shutdown privilege */
+                                        if (!LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, &Privileges.Privileges[0].Luid))
+                                        {
+                                            DPRINT("LookupPrivilegeValue failed\n");
+                                            break;
+                                        }
+
+                                        /* Assign the Shutdown privilege to our process */
+                                        Privileges.PrivilegeCount = 1;
+                                        Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+                                        if (!AdjustTokenPrivileges(hToken, FALSE, &Privileges, 0, NULL, NULL))
+                                        {
+                                            DPRINT("AdjustTokenPrivileges failed\n");
+                                            break;
+                                        }
+
+                                        /* Finally shut down the system */
+                                        if(!ExitWindowsEx(EWX_POWEROFF, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED))
+                                        {
+                                            DPRINT("ExitWindowsEx failed\n");
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        break;
+                    }
                 }
                 break;
             }
@@ -720,6 +768,7 @@ DisplayDevicePropertyText(IN PDEVADVPROP_INFO dap,
     PSP_DEVINFO_DATA DeviceInfoData;
     DWORD dwType;
     DWORD dwSize;
+    DWORD dwValue;
     LPBYTE lpBuffer;
     LPWSTR lpStr;
     INT len;
@@ -791,58 +840,60 @@ DisplayDevicePropertyText(IN PDEVADVPROP_INFO dap,
         }
         else if (dwType == REG_DWORD)
         {
+            dwValue = *(DWORD *) lpBuffer;
+
             switch (dwProperty)
             {
                 case SPDRP_CAPABILITIES:
                     index = 0;
-                    if (*lpBuffer & CM_DEVCAP_LOCKSUPPORTED)
+                    if (dwValue & CM_DEVCAP_LOCKSUPPORTED)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_LOCKSUPPORTED");
-                    if (*lpBuffer & CM_DEVCAP_EJECTSUPPORTED)
+                    if (dwValue & CM_DEVCAP_EJECTSUPPORTED)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_EJECTSUPPORTED");
-                    if (*lpBuffer & CM_DEVCAP_REMOVABLE)
+                    if (dwValue & CM_DEVCAP_REMOVABLE)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_REMOVABLE");
-                    if (*lpBuffer & CM_DEVCAP_DOCKDEVICE)
+                    if (dwValue & CM_DEVCAP_DOCKDEVICE)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_DOCKDEVICE");
-                    if (*lpBuffer & CM_DEVCAP_UNIQUEID)
+                    if (dwValue & CM_DEVCAP_UNIQUEID)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_UNIQUEID");
-                    if (*lpBuffer & CM_DEVCAP_SILENTINSTALL)
+                    if (dwValue & CM_DEVCAP_SILENTINSTALL)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_SILENTINSTALL");
-                    if (*lpBuffer & CM_DEVCAP_RAWDEVICEOK)
+                    if (dwValue & CM_DEVCAP_RAWDEVICEOK)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_RAWDEVICEOK");
-                    if (*lpBuffer & CM_DEVCAP_SURPRISEREMOVALOK)
+                    if (dwValue & CM_DEVCAP_SURPRISEREMOVALOK)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_SURPRISEREMOVALOK");
-                    if (*lpBuffer & CM_DEVCAP_HARDWAREDISABLED)
+                    if (dwValue & CM_DEVCAP_HARDWAREDISABLED)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_HARDWAREDISABLED");
-                    if (*lpBuffer & CM_DEVCAP_NONDYNAMIC)
+                    if (dwValue & CM_DEVCAP_NONDYNAMIC)
                         SetListViewText(hwndListView, index++, L"CM_DEVCAP_NONDYNAMIC");
                     break;
 
                 case SPDRP_CONFIGFLAGS:
                     index = 0;
-                    if (*lpBuffer & CONFIGFLAG_DISABLED)
+                    if (dwValue & CONFIGFLAG_DISABLED)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_DISABLED");
-                    if (*lpBuffer & CONFIGFLAG_REMOVED)
+                    if (dwValue & CONFIGFLAG_REMOVED)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_REMOVED");
-                    if (*lpBuffer & CONFIGFLAG_MANUAL_INSTALL)
+                    if (dwValue & CONFIGFLAG_MANUAL_INSTALL)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_MANUAL_INSTALL");
-                    if (*lpBuffer & CONFIGFLAG_IGNORE_BOOT_LC)
+                    if (dwValue & CONFIGFLAG_IGNORE_BOOT_LC)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_IGNORE_BOOT_LC");
-                    if (*lpBuffer & CONFIGFLAG_NET_BOOT)
+                    if (dwValue & CONFIGFLAG_NET_BOOT)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_NET_BOOT");
-                    if (*lpBuffer & CONFIGFLAG_REINSTALL)
+                    if (dwValue & CONFIGFLAG_REINSTALL)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_REINSTALL");
-                    if (*lpBuffer & CONFIGFLAG_FAILEDINSTALL)
+                    if (dwValue & CONFIGFLAG_FAILEDINSTALL)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_FAILEDINSTALL");
-                    if (*lpBuffer & CONFIGFLAG_CANTSTOPACHILD)
+                    if (dwValue & CONFIGFLAG_CANTSTOPACHILD)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_CANTSTOPACHILD");
-                    if (*lpBuffer & CONFIGFLAG_OKREMOVEROM)
+                    if (dwValue & CONFIGFLAG_OKREMOVEROM)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_OKREMOVEROM");
-                    if (*lpBuffer & CONFIGFLAG_NOREMOVEEXIT)
+                    if (dwValue & CONFIGFLAG_NOREMOVEEXIT)
                         SetListViewText(hwndListView, index++, L"CONFIGFLAG_NOREMOVEEXIT");
                     break;
 
                 default:
-                    swprintf(dap->szTemp, L"0x%08x", *lpBuffer);
+                    swprintf(dap->szTemp, L"0x%08lx", dwValue);
                     SetListViewText(hwndListView, 0, dap->szTemp);
                     break;
             }
@@ -954,7 +1005,6 @@ static VOID
 DisplayDevNodeEnumerator(IN PDEVADVPROP_INFO dap,
                          IN HWND hwndListView)
 {
-    HDEVINFO DeviceInfoSet;
     PSP_DEVINFO_DATA DeviceInfoData;
 
     DWORD dwType = 0;
@@ -963,12 +1013,10 @@ DisplayDevNodeEnumerator(IN PDEVADVPROP_INFO dap,
 
     if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
     {
-        DeviceInfoSet = dap->CurrentDeviceInfoSet;
         DeviceInfoData = &dap->CurrentDeviceInfoData;
     }
     else
     {
-        DeviceInfoSet = dap->DeviceInfoSet;
         DeviceInfoData = &dap->DeviceInfoData;
     }
 
@@ -2019,7 +2067,8 @@ GetParentNode:
         dap->nDevPropSheets++;
 
     /* include the details page */
-    dap->nDevPropSheets++;
+    if (dap->Extended)
+        dap->nDevPropSheets++;
 
     /* add the device property sheets */
     if (dap->nDevPropSheets != 0)
@@ -2093,8 +2142,9 @@ GetParentNode:
                 }
             }
 
-            if (1)
+            if (dap->Extended)
             {
+                /* Add the details page */
                 PROPSHEETPAGE pspDetails = {0};
                 pspDetails.dwSize = sizeof(PROPSHEETPAGE);
                 pspDetails.dwFlags = PSP_DEFAULT;
@@ -2117,9 +2167,9 @@ GetParentNode:
                         dap->DevPropSheets[iPage] = NULL;
                     }
                 }
-            }
 
-            /* FIXME: Add the resources page */
+                /* FIXME: Add the resources page */
+            }
 
             /* FIXME: Add the power page */
         }
@@ -2445,6 +2495,7 @@ DisplayDeviceAdvancedProperties(IN HWND hWndParent,
 
     DevAdvPropInfo->IsAdmin = IsUserAdmin();
     DevAdvPropInfo->DoDefaultDevAction = ((dwFlags & DPF_DEVICE_STATUS_ACTION) != 0);
+    DevAdvPropInfo->Extended = ((dwFlags & DPF_EXTENDED) != 0);
 
     psh.dwSize = sizeof(PROPSHEETHEADER);
     psh.dwFlags = PSH_PROPTITLE | PSH_NOAPPLYNOW;