handle device updates in the advanced property pages and refresh the information
Modified: trunk/reactos/lib/devmgr/advprop.c
Modified: trunk/reactos/lib/devmgr/hwpage.c
Modified: trunk/reactos/lib/devmgr/precomp.h

Modified: trunk/reactos/lib/devmgr/advprop.c
--- trunk/reactos/lib/devmgr/advprop.c	2005-12-01 17:08:52 UTC (rev 19799)
+++ trunk/reactos/lib/devmgr/advprop.c	2005-12-01 17:23:26 UTC (rev 19800)
@@ -51,6 +51,8 @@
     BOOL DeviceEnabled;
     WCHAR szDevName[255];
     WCHAR szTemp[255];
+    WCHAR szDeviceID[1];
+    /* struct may be dynamically expanded here! */
 } DEVADVPROP_INFO, *PDEVADVPROP_INFO;
 
 
@@ -188,11 +190,25 @@
 
 static VOID
 UpdateDevInfo(IN HWND hwndDlg,
-              IN PDEVADVPROP_INFO dap)
+              IN PDEVADVPROP_INFO dap,
+              IN BOOL ReOpenDevice)
 {
     HICON hIcon;
     HWND hDevUsage;
 
+    if (ReOpenDevice)
+    {
+        /* note, we ignore the fact that SetupDiOpenDeviceInfo could fail here,
+           in case of failure we're still going to query information from it even
+           though those calls are going to fail. But they return readable strings
+           even in that case. */
+        SetupDiOpenDeviceInfo(dap->DeviceInfoSet,
+                              dap->szDeviceID,
+                              hwndDlg,
+                              0,
+                              dap->DeviceInfoData);
+    }
+
     /* get the device name */
     if (GetDeviceDescriptionString(dap->DeviceInfoSet,
                                    dap->DeviceInfoData,
@@ -367,7 +383,8 @@
                                      (DWORD_PTR)dap);
 
                     UpdateDevInfo(hwndDlg,
-                                  dap);
+                                  dap,
+                                  FALSE);
                 }
                 Ret = TRUE;
                 break;
@@ -377,7 +394,8 @@
             {
                 /* FIXME - don't call UpdateDevInfo in all events */
                 UpdateDevInfo(hwndDlg,
-                              dap);
+                              dap,
+                              TRUE);
                 break;
             }
 
@@ -406,6 +424,7 @@
 
 INT_PTR
 DisplayDeviceAdvancedProperties(IN HWND hWndParent,
+                                IN LPCWSTR lpDeviceID  OPTIONAL,
                                 IN HDEVINFO DeviceInfoSet,
                                 IN PSP_DEVINFO_DATA DeviceInfoData,
                                 IN HINSTANCE hComCtl32,
@@ -420,6 +439,7 @@
     PDEVADVPROP_INFO DevAdvPropInfo;
     DWORD PropertySheetType;
     HANDLE hMachine = NULL;
+    DWORD DevIdSize = 0;
     INT_PTR Ret = -1;
 
     /* we don't want to statically link against comctl32, so find the
@@ -440,6 +460,29 @@
         return -1;
     }
 
+    if (lpDeviceID == NULL)
+    {
+        /* find out how much size is needed for the device id */
+        if (SetupDiGetDeviceInstanceId(DeviceInfoSet,
+                                       DeviceInfoData,
+                                       NULL,
+                                       0,
+                                       &DevIdSize))
+        {
+            DPRINT1("SetupDiGetDeviceInterfaceDetail unexpectedly returned TRUE!\n");
+            return -1;
+        }
+
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+        {
+            return -1;
+        }
+    }
+    else
+    {
+        DevIdSize = (DWORD)wcslen(lpDeviceID) + 1;
+    }
+
     if (lpMachineName != NULL)
     {
         CONFIGRET cr = CM_Connect_Machine(lpMachineName,
@@ -454,12 +497,27 @@
        "Driver", ... pages */
     DevAdvPropInfo = HeapAlloc(GetProcessHeap(),
                                0,
-                               sizeof(DEVADVPROP_INFO));
+                               FIELD_OFFSET(DEVADVPROP_INFO,
+                                            szDeviceID) +
+                                   (DevIdSize * sizeof(WCHAR)));
     if (DevAdvPropInfo == NULL)
     {
         goto Cleanup;
     }
 
+    if (lpDeviceID == NULL)
+    {
+        /* read the device instance id */
+        if (!SetupDiGetDeviceInstanceId(DeviceInfoSet,
+                                        DeviceInfoData,
+                                        DevAdvPropInfo->szDeviceID,
+                                        DevIdSize,
+                                        NULL))
+        {
+            goto Cleanup;
+        }
+    }
+
     DevAdvPropInfo->DeviceInfoSet = DeviceInfoSet;
     DevAdvPropInfo->DeviceInfoData = DeviceInfoData;
     DevAdvPropInfo->hComCtl32 = hComCtl32;
@@ -630,6 +688,7 @@
                                       &DevInfoData))
             {
                 Ret = DisplayDeviceAdvancedProperties(hWndParent,
+                                                      lpDeviceID,
                                                       hDevInfo,
                                                       &DevInfoData,
                                                       hComCtl32,

Modified: trunk/reactos/lib/devmgr/hwpage.c
--- trunk/reactos/lib/devmgr/hwpage.c	2005-12-01 17:08:52 UTC (rev 19799)
+++ trunk/reactos/lib/devmgr/hwpage.c	2005-12-01 17:23:26 UTC (rev 19800)
@@ -135,6 +135,7 @@
     if (HwDevInfo != NULL)
     {
         Ret = DisplayDeviceAdvancedProperties(hpd->hWnd,
+                                              NULL,
                                               HwDevInfo->ClassDevInfo->hDevInfo,
                                               &HwDevInfo->DevInfoData,
                                               hpd->hComCtl32,

Modified: trunk/reactos/lib/devmgr/precomp.h
--- trunk/reactos/lib/devmgr/precomp.h	2005-12-01 17:08:52 UTC (rev 19799)
+++ trunk/reactos/lib/devmgr/precomp.h	2005-12-01 17:23:26 UTC (rev 19800)
@@ -184,6 +184,7 @@
 
 INT_PTR
 DisplayDeviceAdvancedProperties(IN HWND hWndParent,
+                                IN LPCWSTR lpDeviceID  OPTIONAL,
                                 IN HDEVINFO DeviceInfoSet,
                                 IN PSP_DEVINFO_DATA DeviceInfoData,
                                 IN HINSTANCE hComCtl32,