- support remote device property sheets
- display the device status
Modified: trunk/reactos/lib/devmgr/En.rc
Modified: trunk/reactos/lib/devmgr/advprop.c
Modified: trunk/reactos/lib/devmgr/devmgr.xml
Modified: trunk/reactos/lib/devmgr/hwpage.c
Modified: trunk/reactos/lib/devmgr/misc.c
Modified: trunk/reactos/lib/devmgr/precomp.h
Modified: trunk/reactos/lib/devmgr/resource.h

Modified: trunk/reactos/lib/devmgr/En.rc
--- trunk/reactos/lib/devmgr/En.rc	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/En.rc	2005-11-30 16:33:05 UTC (rev 19777)
@@ -11,8 +11,62 @@
     IDS_STATUS "Device Status: %1"
     IDS_UNKNOWN "Unknown"
     IDS_LOCATIONSTR "Location %1!u! (%2)"
+    IDS_DEVCODE " (Code %1!u!)"
 END
 
+STRINGTABLE
+BEGIN
+    IDS_DEV_NO_PROBLEM "This device is working properly."
+    IDS_DEV_NOT_CONFIGURED "CM_PROB_NOT_CONFIGURED"
+    IDS_DEV_OUT_OF_MEMORY "CM_PROB_DEVLOADER_FAILED"
+    IDS_DEV_ENTRY_IS_WRONG_TYPE "CM_PROB_ENTRY_IS_WRONG_TYPE"
+    IDS_DEV_LACKED_ARBITRATOR "CM_PROB_LACKED_ARBITRATOR"
+    IDS_DEV_BOOT_CONFIG_CONFLICT "CM_PROB_BOOT_CONFIG_CONFLICT"
+    IDS_DEV_FAILED_FILTER "CM_PROB_FAILED_FILTER"
+    IDS_DEV_DEVLOADER_NOT_FOUND "CM_PROB_DEVLOADER_NOT_FOUND"
+    IDS_DEV_INVALID_DATA "CM_PROB_INVALID_DATA"
+    IDS_DEV_FAILED_START "CM_PROB_FAILED_START"
+    IDS_DEV_LIAR "CM_PROB_LIAR"
+    IDS_DEV_NORMAL_CONFLICT "CM_PROB_NORMAL_CONFLICT"
+    IDS_DEV_NOT_VERIFIED "CM_PROB_NOT_VERIFIED"
+    IDS_DEV_NEED_RESTART "CM_PROB_NEED_RESTART"
+    IDS_DEV_REENUMERATION "CM_PROB_REENUMERATION"
+    IDS_DEV_PARTIAL_LOG_CONF "CM_PROB_PARTIAL_LOG_CONF"
+    IDS_DEV_UNKNOWN_RESOURCE "CM_PROB_UNKNOWN_RESOURCE"
+    IDS_DEV_REINSTALL "CM_PROB_REINSTALL"
+    IDS_DEV_REGISTRY "CM_PROB_REGISTRY"
+    IDS_DEV_WILL_BE_REMOVED "CM_PROB_WILL_BE_REMOVED"
+    IDS_DEV_DISABLED "CM_PROB_DISABLED"
+    IDS_DEV_DEVLOADER_NOT_READY "CM_PROB_DEVLOADER_NOT_READY"
+    IDS_DEV_DEVICE_NOT_THERE "CM_PROB_DEVICE_NOT_THERE"
+    IDS_DEV_MOVED "CM_PROB_MOVED"
+    IDS_DEV_TOO_EARLY "CM_PROB_TOO_EARLY"
+    IDS_DEV_NO_VALID_LOG_CONF "CM_PROB_NO_VALID_LOG_CONF"
+    IDS_DEV_FAILED_INSTALL "CM_PROB_FAILED_INSTALL"
+    IDS_DEV_HARDWARE_DISABLED "CM_PROB_HARDWARE_DISABLED"
+    IDS_DEV_CANT_SHARE_IRQ "CM_PROB_CANT_SHARE_IRQ"
+    IDS_DEV_FAILED_ADD "CM_PROB_FAILED_ADD"
+    IDS_DEV_DISABLED_SERVICE "CM_PROB_DISABLED_SERVICE"
+    IDS_DEV_TRANSLATION_FAILED "CM_PROB_TRANSLATION_FAILED"
+    IDS_DEV_NO_SOFTCONFIG "CM_PROB_NO_SOFTCONFIG"
+    IDS_DEV_BIOS_TABLE "CM_PROB_BIOS_TABLE"
+    IDS_DEV_IRQ_TRANSLATION_FAILED "CM_PROB_IRQ_TRANSLATION_FAILED"
+    IDS_DEV_FAILED_DRIVER_ENTRY "CM_PROB_FAILED_DRIVER_ENTRY"
+    IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD"
+    IDS_DEV_DRIVER_FAILED_LOAD "CM_PROB_DRIVER_FAILED_LOAD"
+    IDS_DEV_DRIVER_SERVICE_KEY_INVALID "CM_PROB_DRIVER_SERVICE_KEY_INVALID"
+    IDS_DEV_LEGACY_SERVICE_NO_DEVICES "CM_PROB_LEGACY_SERVICE_NO_DEVICES"
+    IDS_DEV_DUPLICATE_DEVICE "CM_PROB_DUPLICATE_DEVICE"
+    IDS_DEV_FAILED_POST_START "CM_PROB_FAILED_POST_START"
+    IDS_DEV_HALTED "CM_PROB_HALTED"
+    IDS_DEV_PHANTOM "CM_PROB_PHANTOM"
+    IDS_DEV_SYSTEM_SHUTDOWN "CM_PROB_SYSTEM_SHUTDOWN"
+    IDS_DEV_HELD_FOR_EJECT "CM_PROB_HELD_FOR_EJECT"
+    IDS_DEV_DRIVER_BLOCKED "CM_PROB_DRIVER_BLOCKED"
+    IDS_DEV_REGISTRY_TOO_LARGE "CM_PROB_REGISTRY_TOO_LARGE"
+    IDS_DEV_SETPROPERTIES_FAILED "CM_PROB_SETPROPERTIES_FAILED"
+END
+
 IDD_HARDWARE DIALOG DISCARDABLE  0, 0, 300, 400
 STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"

Modified: trunk/reactos/lib/devmgr/advprop.c
--- trunk/reactos/lib/devmgr/advprop.c	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/advprop.c	2005-11-30 16:33:05 UTC (rev 19777)
@@ -39,6 +39,7 @@
     HDEVINFO DeviceInfoSet;
     PSP_DEVINFO_DATA DeviceInfoData;
     HINSTANCE hComCtl32;
+    HANDLE hMachine;
     WCHAR szDevName[255];
     WCHAR szTemp[255];
 } DEVADVPROP_INFO, *PDEVADVPROP_INFO;
@@ -52,6 +53,7 @@
                       IN LPARAM lParam)
 {
     PDEVADVPROP_INFO dap;
+    INT_PTR Ret = FALSE;
 
     dap = (PDEVADVPROP_INFO)GetWindowLongPtr(hwndDlg,
                                              DWL_USER);
@@ -120,8 +122,8 @@
                     }
 
                     /* set the device status edit control text */
-                    if (GetDeviceStatusString(dap->DeviceInfoSet,
-                                              dap->DeviceInfoData,
+                    if (GetDeviceStatusString(dap->DeviceInfoData->DevInst,
+                                              dap->hMachine,
                                               dap->szTemp,
                                               sizeof(dap->szTemp) / sizeof(dap->szTemp[0])))
                     {
@@ -130,6 +132,7 @@
                                        dap->szTemp);
                     }
                 }
+                Ret = TRUE;
                 break;
             }
 
@@ -152,7 +155,7 @@
         }
     }
 
-    return FALSE;
+    return Ret;
 }
 
 
@@ -160,9 +163,9 @@
 DisplayDeviceAdvancedProperties(IN HWND hWndParent,
                                 IN HDEVINFO DeviceInfoSet,
                                 IN PSP_DEVINFO_DATA DeviceInfoData,
-                                IN HINSTANCE hComCtl32)
+                                IN HINSTANCE hComCtl32,
+                                IN LPCWSTR lpMachineName)
 {
-    DWORD RegDataType;
     PROPSHEETHEADER psh = {0};
     PROPSHEETPAGE pspGeneral = {0};
     DWORD nPropSheets = 0;
@@ -171,6 +174,8 @@
     PCREATEPROPERTYSHEETPAGEW pCreatePropertySheetPageW;
     PDESTROYPROPERTYSHEETPAGE pDestroyPropertySheetPage;
     PDEVADVPROP_INFO DevAdvPropInfo;
+    DWORD PropertySheetType;
+    HANDLE hMachine = NULL;
     UINT nPages = 0;
     union
     {
@@ -201,6 +206,16 @@
         return -1;
     }
 
+    if (lpMachineName != NULL)
+    {
+        CONFIGRET cr = CM_Connect_Machine(lpMachineName,
+                                          &hMachine);
+        if (cr != CR_SUCCESS)
+        {
+            return -1;
+        }
+    }
+
     /* create the internal structure associated with the "General",
        "Driver", ... pages */
     DevAdvPropInfo = HeapAlloc(GetProcessHeap(),
@@ -208,45 +223,37 @@
                                sizeof(DEVADVPROP_INFO));
     if (DevAdvPropInfo == NULL)
     {
-        return -1;
+        goto Cleanup;
     }
 
     DevAdvPropInfo->DeviceInfoSet = DeviceInfoSet;
     DevAdvPropInfo->DeviceInfoData = DeviceInfoData;
     DevAdvPropInfo->hComCtl32 = hComCtl32;
+    DevAdvPropInfo->hMachine = hMachine;
     DevAdvPropInfo->szDevName[0] = L'\0';
 
     /* get the device name */
-    if ((SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          &RegDataType,
-                                          (PBYTE)DevAdvPropInfo->szDevName,
-                                          sizeof(DevAdvPropInfo->szDevName),
-                                          NULL) ||
-         SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_DEVICEDESC,
-                                          &RegDataType,
-                                          (PBYTE)DevAdvPropInfo->szDevName,
-                                          sizeof(DevAdvPropInfo->szDevName),
-                                          NULL)) &&
-        RegDataType == REG_SZ)
+    if (GetDeviceDescriptionString(DeviceInfoSet,
+                                   DeviceInfoData,
+                                   DevAdvPropInfo->szDevName,
+                                   sizeof(DevAdvPropInfo->szDevName) / sizeof(DevAdvPropInfo->szDevName[0])))
     {
-        /* FIXME - check string for NULL termination! */
-
         psh.dwSize = sizeof(PROPSHEETHEADER);
         psh.dwFlags =  PSH_PROPTITLE;
         psh.hwndParent = hWndParent;
         psh.pszCaption = DevAdvPropInfo->szDevName;
 
+        PropertySheetType = lpMachineName != NULL ?
+                                DIGCDP_FLAG_REMOTE_ADVANCED :
+                                DIGCDP_FLAG_ADVANCED;
+
         /* find out how many property sheets we need */
         if (SetupDiGetClassDevPropertySheets(DeviceInfoSet,
                                              DeviceInfoData,
                                              &psh,
                                              0,
                                              &nPropSheets,
-                                             DIGCDP_FLAG_ADVANCED) &&
+                                             PropertySheetType) &&
             nPropSheets != 0)
         {
             DPRINT1("SetupDiGetClassDevPropertySheets unexpectedly returned TRUE!\n");
@@ -291,7 +298,7 @@
                                                   &psh,
                                                   nPropSheets,
                                                   NULL,
-                                                  DIGCDP_FLAG_ADVANCED))
+                                                  PropertySheetType))
             {
                 goto Cleanup;
             }
@@ -343,6 +350,11 @@
              0,
              DevAdvPropInfo);
 
+    if (hMachine != NULL)
+    {
+        CM_Disconnect_Machine(hMachine);
+    }
+
     return Ret;
 }
 
@@ -380,16 +392,23 @@
     HINSTANCE hComCtl32;
     INT_PTR Ret = -1;
 
-    /* FIXME - handle remote device properties */
-
-    UNREFERENCED_PARAMETER(lpMachineName);
-
     /* dynamically load comctl32 */
     hComCtl32 = LoadAndInitComctl32();
     if (hComCtl32 != NULL)
     {
-        hDevInfo = SetupDiCreateDeviceInfoList(NULL,
-                                               hWndParent);
+        if (lpMachineName != NULL)
+        {
+            hDevInfo = SetupDiCreateDeviceInfoListEx(NULL,
+                                                     hWndParent,
+                                                     lpMachineName,
+                                                     NULL);
+        }
+        else
+        {
+            hDevInfo = SetupDiCreateDeviceInfoList(NULL,
+                                                   hWndParent);
+        }
+
         if (hDevInfo != INVALID_HANDLE_VALUE)
         {
             DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
@@ -402,7 +421,8 @@
                 Ret = DisplayDeviceAdvancedProperties(hWndParent,
                                                       hDevInfo,
                                                       &DevInfoData,
-                                                      hComCtl32);
+                                                      hComCtl32,
+                                                      lpMachineName);
             }
 
             SetupDiDestroyDeviceInfoList(hDevInfo);
@@ -469,12 +489,18 @@
                                     lpDeviceIDW);
 
 Cleanup:
-    HeapFree(GetProcessHeap(),
-             0,
-             lpMachineNameW);
-    HeapFree(GetProcessHeap(),
-             0,
-             lpDeviceIDW);
+    if (lpMachineNameW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpMachineNameW);
+    }
+    if (lpDeviceIDW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpDeviceIDW);
+    }
 
     return Ret;
 }

Modified: trunk/reactos/lib/devmgr/devmgr.xml
--- trunk/reactos/lib/devmgr/devmgr.xml	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/devmgr.xml	2005-11-30 16:33:05 UTC (rev 19777)
@@ -8,6 +8,7 @@
 	<define name="_WIN32_IE">0x600</define>
 	<define name="_WIN32_WINNT">0x501</define>
 	<define name="WINVER">0x501</define>
+	<define name="_SETUPAPI_VER">0x501</define>
 	<library>kernel32</library>
 	<library>ntdll</library>
 	<library>setupapi</library>

Modified: trunk/reactos/lib/devmgr/hwpage.c
--- trunk/reactos/lib/devmgr/hwpage.c	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/hwpage.c	2005-11-30 16:33:05 UTC (rev 19777)
@@ -136,7 +136,8 @@
         Ret = DisplayDeviceAdvancedProperties(hpd->hWnd,
                                               HwDevInfo->ClassDevInfo->hDevInfo,
                                               &HwDevInfo->DevInfoData,
-                                              hpd->hComCtl32) != -1;
+                                              hpd->hComCtl32,
+                                              NULL) != -1;
     }
 
     return Ret;
@@ -192,8 +193,8 @@
             LocalFree((HLOCAL)szFormatted);
         }
 
-        if (GetDeviceStatusString(HwDevInfo->ClassDevInfo->hDevInfo,
-                                  &HwDevInfo->DevInfoData,
+        if (GetDeviceStatusString(HwDevInfo->DevInfoData.DevInst,
+                                  NULL,
                                   szBuffer,
                                   sizeof(szBuffer) / sizeof(szBuffer[0])) &&
             LoadAndFormatString(hDllInstance,
@@ -357,29 +358,15 @@
 
             while (HwDevInfo != LastHwDevInfo)
             {
-                DWORD RegDataType;
                 INT iItem;
                 LVITEM li;
 
                 /* get the device name */
-                if ((SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
-                                                      &HwDevInfo->DevInfoData,
-                                                      SPDRP_FRIENDLYNAME,
-                                                      &RegDataType,
-                                                      (PBYTE)szBuffer,
-                                                      sizeof(szBuffer),
-                                                      NULL) ||
-                     SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
-                                                      &HwDevInfo->DevInfoData,
-                                                      SPDRP_DEVICEDESC,
-                                                      &RegDataType,
-                                                      (PBYTE)szBuffer,
-                                                      sizeof(szBuffer),
-                                                      NULL)) &&
-                    RegDataType == REG_SZ)
+                if (GetDeviceDescriptionString(ClassDevInfo->hDevInfo,
+                                               &HwDevInfo->DevInfoData,
+                                               szBuffer,
+                                               sizeof(szBuffer) / sizeof(szBuffer[0])))
                 {
-                    /* FIXME - check string for NULL termination! */
-
                     li.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT | LVIF_IMAGE;
                     li.iItem = ItemCount;
                     li.iSubItem = 0;
@@ -405,7 +392,7 @@
                             li.iSubItem = 1;
 
                             ListView_SetItem(hpd->hWndDevList,
-                                             &li);                  
+                                             &li);
                         }
                     }
                 }
@@ -674,6 +661,7 @@
                 IN LPARAM lParam)
 {
     PHARDWARE_PAGE_DATA hpd;
+    INT_PTR Ret = FALSE;
 
     hpd = (PHARDWARE_PAGE_DATA)GetWindowLongPtr(hwndDlg,
                                                 DWL_USER);
@@ -820,6 +808,7 @@
                     EnableTroubleShoot(hpd,
                                        GetWindowTextLength(hwndDlg) != 0);
                 }
+                Ret = TRUE;
                 break;
             }
 
@@ -854,7 +843,7 @@
         }
     }
 
-    return FALSE;
+    return Ret;
 }
 
 

Modified: trunk/reactos/lib/devmgr/misc.c
--- trunk/reactos/lib/devmgr/misc.c	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/misc.c	2005-11-30 16:33:05 UTC (rev 19777)
@@ -94,6 +94,41 @@
 }
 
 
+static INT
+AllocAndLoadStringsCat(OUT LPWSTR *lpTarget,
+                       IN HINSTANCE hInst,
+                       IN UINT uID1,
+                       IN UINT uID2)
+{
+    INT ln;
+
+    ln = LengthOfStrResource(hInst,
+                             uID1);
+    ln += LengthOfStrResource(hInst,
+                              uID2);
+    if (ln++ > 0)
+    {
+        (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED,
+                                         ln * sizeof(WCHAR));
+        if ((*lpTarget) != NULL)
+        {
+            INT Ret, Ret2 = 0;
+            if (!(Ret = LoadStringW(hInst, uID1, *lpTarget, ln)))
+            {
+                LocalFree((HLOCAL)(*lpTarget));
+            }
+            else if (!(Ret2 = LoadStringW(hInst, uID2, *lpTarget + Ret, ln - Ret)))
+            {
+                LocalFree((HLOCAL)(*lpTarget));
+                Ret = 0;
+            }
+            return Ret + Ret2;
+        }
+    }
+    return 0;
+}
+
+
 DWORD
 LoadAndFormatString(IN HINSTANCE hInstance,
                     IN UINT uID,
@@ -127,6 +162,41 @@
 }
 
 
+DWORD
+LoadAndFormatStringsCat(IN HINSTANCE hInstance,
+                        IN UINT uID1,
+                        IN UINT uID2,
+                        OUT LPWSTR *lpTarget,
+                        ...)
+{
+    DWORD Ret = 0;
+    LPWSTR lpFormat;
+    va_list lArgs;
+
+    if (AllocAndLoadStringsCat(&lpFormat,
+                               hInstance,
+                               uID1,
+                               uID2) > 0)
+    {
+        va_start(lArgs, lpTarget);
+        /* let's use FormatMessage to format it because it has the ability to allocate
+           memory automatically */
+        Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
+                             lpFormat,
+                             0,
+                             0,
+                             (LPWSTR)lpTarget,
+                             0,
+                             &lArgs);
+        va_end(lArgs);
+
+        LocalFree((HLOCAL)lpFormat);
+    }
+
+    return Ret;
+}
+
+
 LPARAM
 ListViewGetSelectedItemData(IN HWND hwnd)
 {
@@ -293,16 +363,130 @@
 }
 
 
+static const UINT ProblemStringId[] =
+{
+    IDS_DEV_NO_PROBLEM,
+    IDS_DEV_NOT_CONFIGURED,
+    IDS_DEV_OUT_OF_MEMORY,
+    IDS_DEV_ENTRY_IS_WRONG_TYPE,
+    IDS_DEV_LACKED_ARBITRATOR,
+    IDS_DEV_BOOT_CONFIG_CONFLICT,
+    IDS_DEV_FAILED_FILTER,
+    IDS_DEV_DEVLOADER_NOT_FOUND,
+    IDS_DEV_INVALID_DATA,
+    IDS_DEV_FAILED_START,
+    IDS_DEV_LIAR,
+    IDS_DEV_NORMAL_CONFLICT,
+    IDS_DEV_NOT_VERIFIED,
+    IDS_DEV_NEED_RESTART,
+    IDS_DEV_REENUMERATION,
+    IDS_DEV_PARTIAL_LOG_CONF,
+    IDS_DEV_UNKNOWN_RESOURCE,
+    IDS_DEV_REINSTALL,
+    IDS_DEV_REGISTRY,
+    IDS_UNKNOWN, /* CM_PROB_VXDLDR, not used on NT */
+    IDS_DEV_WILL_BE_REMOVED,
+    IDS_DEV_DISABLED,
+    IDS_DEV_DEVLOADER_NOT_READY,
+    IDS_DEV_DEVICE_NOT_THERE,
+    IDS_DEV_MOVED,
+    IDS_DEV_TOO_EARLY,
+    IDS_DEV_NO_VALID_LOG_CONF,
+    IDS_DEV_FAILED_INSTALL,
+    IDS_DEV_HARDWARE_DISABLED,
+    IDS_DEV_CANT_SHARE_IRQ,
+    IDS_DEV_FAILED_ADD,
+    IDS_DEV_DISABLED_SERVICE,
+    IDS_DEV_TRANSLATION_FAILED,
+    IDS_DEV_NO_SOFTCONFIG,
+    IDS_DEV_BIOS_TABLE,
+    IDS_DEV_IRQ_TRANSLATION_FAILED,
+    IDS_DEV_FAILED_DRIVER_ENTRY,
+    IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD,
+    IDS_DEV_DRIVER_FAILED_LOAD,
+    IDS_DEV_DRIVER_SERVICE_KEY_INVALID,
+    IDS_DEV_LEGACY_SERVICE_NO_DEVICES,
+    IDS_DEV_DUPLICATE_DEVICE,
+    IDS_DEV_FAILED_POST_START,
+    IDS_DEV_HALTED,
+    IDS_DEV_PHANTOM,
+    IDS_DEV_SYSTEM_SHUTDOWN,
+    IDS_DEV_HELD_FOR_EJECT,
+    IDS_DEV_DRIVER_BLOCKED,
+    IDS_DEV_REGISTRY_TOO_LARGE,
+    IDS_DEV_SETPROPERTIES_FAILED,
+};
+
+
 BOOL
-GetDeviceStatusString(IN HDEVINFO DeviceInfoSet,
-                      IN PSP_DEVINFO_DATA DeviceInfoData,
+GetDeviceStatusString(IN DEVINST DevInst,
+                      IN HANDLE hMachine,
                       OUT LPWSTR szBuffer,
                       IN DWORD BufferSize)
 {
-    return LoadString(hDllInstance,
-                      IDS_UNKNOWN,
-                       szBuffer,
-                       BufferSize) != 0;
+    CONFIGRET cr;
+    ULONG Status, ProblemNumber;
+    BOOL Ret = FALSE;
+
+    if (hMachine != NULL)
+    {
+        cr = CM_Get_DevNode_Status_Ex(&Status,
+                                      &ProblemNumber,
+                                      DevInst,
+                                      0,
+                                      hMachine);
+    }
+    else
+    {
+        cr = CM_Get_DevNode_Status(&Status,
+                                   &ProblemNumber,
+                                   DevInst,
+                                   0);
+    }
+
+    if (cr == CR_SUCCESS)
+    {
+        UINT MessageId;
+
+        if (ProblemNumber < sizeof(ProblemStringId) / sizeof(ProblemStringId[0]))
+            MessageId = ProblemStringId[ProblemNumber];
+        else
+            MessageId = IDS_UNKNOWN;
+
+        szBuffer[0] = L'\0';
+        if (ProblemNumber == 0)
+        {
+            if (LoadString(hDllInstance,
+                           MessageId,
+                           szBuffer,
+                           BufferSize))
+            {
+                Ret = TRUE;
+            }
+        }
+        else
+        {
+            LPWSTR szProblem;
+
+            if (LoadAndFormatStringsCat(hDllInstance,
+                                        MessageId,
+                                        IDS_DEVCODE,
+                                        &szProblem,
+                                        ProblemNumber))
+            {
+                wcsncpy(szBuffer,
+                        szProblem,
+                        BufferSize - 1);
+                szBuffer[BufferSize - 1] = L'\0';
+
+                LocalFree((HLOCAL)szProblem);
+
+                Ret = TRUE;
+            }
+        }
+    }
+
+    return Ret;
 }
 
 
@@ -337,6 +521,50 @@
 }
 
 
+BOOL
+GetDeviceDescriptionString(IN HDEVINFO DeviceInfoSet,
+                           IN PSP_DEVINFO_DATA DeviceInfoData,
+                           OUT LPWSTR szBuffer,
+                           IN DWORD BufferSize)
+{
+    DWORD RegDataType;
+    BOOL Ret = FALSE;
+
+    if ((SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          SPDRP_FRIENDLYNAME,
+                                          &RegDataType,
+                                          (PBYTE)szBuffer,
+                                          BufferSize * sizeof(WCHAR),
+                                          NULL) ||
+         SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          SPDRP_DEVICEDESC,
+                                          &RegDataType,
+                                          (PBYTE)szBuffer,
+                                          BufferSize * sizeof(WCHAR),
+                                          NULL)) &&
+        RegDataType == REG_SZ)
+    {
+        /* FIXME - check string for NULL termination! */
+        Ret = TRUE;
+    }
+    else
+    {
+        szBuffer[0] = L'\0';
+        if (LoadString(hDllInstance,
+                       IDS_UNKNOWN,
+                       szBuffer,
+                       BufferSize))
+        {
+            Ret = TRUE;
+        }
+    }
+
+    return Ret;
+}
+
+
 HINSTANCE
 LoadAndInitComctl32(VOID)
 {

Modified: trunk/reactos/lib/devmgr/precomp.h
--- trunk/reactos/lib/devmgr/precomp.h	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/precomp.h	2005-11-30 16:33:05 UTC (rev 19777)
@@ -186,7 +186,8 @@
 DisplayDeviceAdvancedProperties(IN HWND hWndParent,
                                 IN HDEVINFO DeviceInfoSet,
                                 IN PSP_DEVINFO_DATA DeviceInfoData,
-                                IN HINSTANCE hComCtl32);
+                                IN HINSTANCE hComCtl32,
+                                IN LPCWSTR lpMachineName);
 
 /* MISC.C */
 
@@ -196,6 +197,13 @@
                     OUT LPWSTR *lpTarget,
                     ...);
 
+DWORD
+LoadAndFormatStringsCat(IN HINSTANCE hInstance,
+                        IN UINT uID1,
+                        IN UINT uID2,
+                        OUT LPWSTR *lpTarget,
+                        ...);
+
 LPARAM
 ListViewGetSelectedItemData(IN HWND hwnd);
 
@@ -218,8 +226,8 @@
                         IN DWORD BufferSize);
 
 BOOL
-GetDeviceStatusString(IN HDEVINFO DeviceInfoSet,
-                      IN PSP_DEVINFO_DATA DeviceInfoData,
+GetDeviceStatusString(IN DEVINST DevInst,
+                      IN HANDLE hMachine,
                       OUT LPWSTR szBuffer,
                       IN DWORD BufferSize);
 
@@ -228,6 +236,12 @@
                     OUT LPWSTR szBuffer,
                     IN DWORD BufferSize);
 
+BOOL
+GetDeviceDescriptionString(IN HDEVINFO DeviceInfoSet,
+                           IN PSP_DEVINFO_DATA DeviceInfoData,
+                           OUT LPWSTR szBuffer,
+                           IN DWORD BufferSize);
+
 #endif /* __DEVMGR_H */
 
 /* EOF */

Modified: trunk/reactos/lib/devmgr/resource.h
--- trunk/reactos/lib/devmgr/resource.h	2005-11-30 14:02:55 UTC (rev 19776)
+++ trunk/reactos/lib/devmgr/resource.h	2005-11-30 16:33:05 UTC (rev 19777)
@@ -31,7 +31,59 @@
 #define IDS_STATUS		0x104
 #define IDS_UNKNOWN		0x105
 #define IDS_LOCATIONSTR		0x106
+#define IDS_DEVCODE		0x107
 
+#define IDS_DEV_NO_PROBLEM			0x200
+#define IDS_DEV_NOT_CONFIGURED			0x201
+#define IDS_DEV_DEVLOADER_FAILED		0x202
+#define IDS_DEV_OUT_OF_MEMORY			0x203
+#define IDS_DEV_ENTRY_IS_WRONG_TYPE		0x204
+#define IDS_DEV_LACKED_ARBITRATOR		0x205
+#define IDS_DEV_BOOT_CONFIG_CONFLICT		0x206
+#define IDS_DEV_FAILED_FILTER			0x207
+#define IDS_DEV_DEVLOADER_NOT_FOUND		0x208
+#define IDS_DEV_INVALID_DATA			0x209
+#define IDS_DEV_FAILED_START			0x20A
+#define IDS_DEV_LIAR				0x20B
+#define IDS_DEV_NORMAL_CONFLICT			0x20C
+#define IDS_DEV_NOT_VERIFIED			0x20D
+#define IDS_DEV_NEED_RESTART			0x20E
+#define IDS_DEV_REENUMERATION			0x20F
+#define IDS_DEV_PARTIAL_LOG_CONF		0x210
+#define IDS_DEV_UNKNOWN_RESOURCE		0x211
+#define IDS_DEV_REINSTALL			0x212
+#define IDS_DEV_REGISTRY			0x213
+#define IDS_DEV_WILL_BE_REMOVED			0x214
+#define IDS_DEV_DISABLED			0x215
+#define IDS_DEV_DEVLOADER_NOT_READY		0x216
+#define IDS_DEV_DEVICE_NOT_THERE		0x217
+#define IDS_DEV_MOVED				0x218
+#define IDS_DEV_TOO_EARLY			0x219
+#define IDS_DEV_NO_VALID_LOG_CONF		0x21A
+#define IDS_DEV_FAILED_INSTALL			0x21B
+#define IDS_DEV_HARDWARE_DISABLED		0x21C
+#define IDS_DEV_CANT_SHARE_IRQ			0x21D
+#define IDS_DEV_FAILED_ADD			0x21E
+#define IDS_DEV_DISABLED_SERVICE		0x21F
+#define IDS_DEV_TRANSLATION_FAILED		0x220
+#define IDS_DEV_NO_SOFTCONFIG			0x221
+#define IDS_DEV_BIOS_TABLE			0x222
+#define IDS_DEV_IRQ_TRANSLATION_FAILED		0x223
+#define IDS_DEV_FAILED_DRIVER_ENTRY		0x224
+#define IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD	0x225
+#define IDS_DEV_DRIVER_FAILED_LOAD		0x226
+#define IDS_DEV_DRIVER_SERVICE_KEY_INVALID	0x227
+#define IDS_DEV_LEGACY_SERVICE_NO_DEVICES	0x228
+#define IDS_DEV_DUPLICATE_DEVICE		0x229
+#define IDS_DEV_FAILED_POST_START		0x22A
+#define IDS_DEV_HALTED				0x22B
+#define IDS_DEV_PHANTOM				0x22C
+#define IDS_DEV_SYSTEM_SHUTDOWN			0x22D
+#define IDS_DEV_HELD_FOR_EJECT			0x22E
+#define IDS_DEV_DRIVER_BLOCKED			0x22F
+#define IDS_DEV_REGISTRY_TOO_LARGE		0x230
+#define IDS_DEV_SETPROPERTIES_FAILED		0x231
+
 #endif /* __DEVMGR_RESOURCE_H */
 
 /* EOF */