A bit of work towards populating the properties dialog. (untested)
Modified: trunk/reactos/subsys/system/servman/En.rc
Modified: trunk/reactos/subsys/system/servman/propsheet.c
Modified: trunk/reactos/subsys/system/servman/query.c
Modified: trunk/reactos/subsys/system/servman/resource.h
Modified: trunk/reactos/subsys/system/servman/servman.c
Modified: trunk/reactos/subsys/system/servman/servman.h

Modified: trunk/reactos/subsys/system/servman/En.rc
--- trunk/reactos/subsys/system/servman/En.rc	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/En.rc	2006-01-17 20:12:18 UTC (rev 20940)
@@ -83,7 +83,7 @@
   CONTROL "",IDC_DISP_NAME,"Static",0x50001000,70,29,176,12
   CONTROL "",IDC_DESCRIPTION,"Static",0x50201000,70,46,176,22
   CONTROL "Path to executable:",IDC_STATIC,"Static",0x50000000,6,73,82,9
-  CONTROL "",IDC_STATIC,"Static",0x50001000,6,86,238,12
+  CONTROL "",IDC_EXEPATH,"Static",0x50001000,6,86,238,12
   CONTROL "Startup type:",IDC_STATIC,"Static",0x50000000,6,108,53,11
   CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11
   CONTROL "Service status:",IDC_STATIC,"Static",0x50000000,4,138,53,11
@@ -97,6 +97,20 @@
   CONTROL "",IDC_START_PARAM,"Static",0x50001000,70,199,176,11
 END
 
+IDD_DLG_DEPEND DIALOGEX 6,6,253,225
+CAPTION "Dependencies"
+FONT 8,"MS Sans Serif",0,0
+STYLE 0x10CF0000
+BEGIN
+  CONTROL "",IDC_DEPEND_TREE1,"SysTreeView32",0x50010007,8,70,236,68,0x00000200
+  CONTROL "",IDC_DEPEND_TREE2,"SysTreeView32",0x50010007,8,151,234,67,0x00000200
+  CONTROL "Some services depend on other services, system drivers and load order groups. If a system component is stopped or it is not running properly, dependant services can be affected.",IDC_STATIC,"Static",0x50000000,8,7,238,26
+  CONTROL "This service depends on the following components",IDC_STATIC,"Static",0x50000000,8,57,236,9
+  CONTROL "",IDC_DEPEND_SERVICE,"Static",0x50000000,8,38,236,13
+END
+
+
+
 IDB_BUTTONS BITMAP "res/toolbar.bmp"
 
 STRINGTABLE DISCARDABLE

Modified: trunk/reactos/subsys/system/servman/propsheet.c
--- trunk/reactos/subsys/system/servman/propsheet.c	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/propsheet.c	2006-01-17 20:12:18 UTC (rev 20940)
@@ -4,13 +4,77 @@
  * FILE:        subsys/system/servman/propsheet.c
  * PURPOSE:     Property dialog box message handler
  * COPYRIGHT:   Copyright 2005 Ged Murphy <gedmurphy@gmail.com>
- *               
+ *
  */
 
 #include "servman.h"
 
+extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;
 extern HINSTANCE hInstance;
+extern HWND hListView;
+extern INT SelectedItem;
 
+
+typedef struct _PROP_DLG_INFO
+{
+    LPTSTR lpServiceName;
+    LPTSTR lpDisplayName;
+    LPTSTR lpDescription;
+    LPTSTR lpPathToExe;
+    DWORD  dwStartupType;
+    DWORD  dwServiceStatus;
+    LPTSTR lpStartParams;
+} PROP_DLG_INFO, *PPROP_DLG_INFO;
+
+
+
+
+VOID GetDlgInfo(HWND hwndDlg)
+{
+    HKEY hKey;
+    ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
+    LVITEM item;
+    PROP_DLG_INFO DlgInfo;
+    LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
+    TCHAR buf[300];
+
+    item.mask = LVIF_PARAM;
+    item.iItem = SelectedItem;
+    SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);
+
+    /* copy pointer to selected service */
+    Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;
+
+    /* open the registry key for the service */
+    _sntprintf(buf, 300, Path, Service->lpServiceName);
+    RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                 buf,
+                 0,
+                 KEY_READ,
+                 &hKey);
+
+    /* set the service name */
+    DlgInfo.lpServiceName = Service->lpServiceName;
+    SendDlgItemMessageW(hwndDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpServiceName);
+
+    /* set the display name */
+    DlgInfo.lpDisplayName = Service->lpDisplayName;
+    SendDlgItemMessageW(hwndDlg, IDC_DISP_NAME, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpDisplayName);
+
+    /* set the description */
+    if (GetDescription(hKey, &DlgInfo.lpDescription))
+        SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpDescription);
+
+    /* set the executable path */
+    if (GetExecutablePath(&DlgInfo.lpPathToExe))
+        SendDlgItemMessageW(hwndDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);
+
+
+
+
+}
+
+
 #ifdef _MSC_VER
 #pragma warning(disable : 4100)
 #endif
@@ -25,6 +89,7 @@
     switch (uMsg)
     {
         case WM_INITDIALOG:
+            GetDlgInfo(hwndDlg);
 
             break;
 
@@ -60,6 +125,52 @@
 
 
 
+
+
+INT_PTR CALLBACK
+DependanciesPageProc(HWND hwndDlg,
+                UINT uMsg,
+		        WPARAM wParam,
+		        LPARAM lParam)
+{
+
+    switch (uMsg)
+    {
+        case WM_INITDIALOG:
+
+            break;
+
+        case WM_COMMAND:
+            switch(LOWORD(wParam))
+            {
+                case IDC_START:
+                    break;
+
+                case IDC_STOP:
+
+                    break;
+            }
+            break;
+
+        case WM_DESTROY:
+            break;
+
+        case WM_NOTIFY:
+            {
+                LPNMHDR lpnm = (LPNMHDR)lParam;
+
+                switch (lpnm->code)
+
+                default:
+                    break;
+            }
+            break;
+    }
+
+    return FALSE;
+}
+
+
 static VOID
 InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
 {
@@ -73,10 +184,10 @@
 
 
 LONG APIENTRY
-PropSheets(HWND hwnd)
+OpenPropSheet(HWND hwnd)
 {
   PROPSHEETHEADER psh;
-  PROPSHEETPAGE psp[1];
+  PROPSHEETPAGE psp[2];
   TCHAR Caption[256];
 
   LoadString(hInstance, IDS_PROP_SHEET, Caption, sizeof(Caption) / sizeof(TCHAR));
@@ -93,9 +204,10 @@
   psh.ppsp = psp;
 
   InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc);
-  //logon
-  //recovery
-  //dependancies
+  //InitPropSheetPage(&psp[1], IDD_DLG_GENERAL, LogonPageProc);
+  //InitPropSheetPage(&psp[2], IDD_DLG_GENERAL, RecoveryPageProc);
+  InitPropSheetPage(&psp[1], IDD_DLG_DEPEND, DependanciesPageProc);
 
+
   return (LONG)(PropertySheet(&psh) != -1);
 }

Modified: trunk/reactos/subsys/system/servman/query.c
--- trunk/reactos/subsys/system/servman/query.c	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/query.c	2006-01-17 20:12:18 UTC (rev 20940)
@@ -13,37 +13,67 @@
 extern HWND hListView;
 extern HWND hStatus;
 
-/* Stores the service array */
+/* Stores the complete services array */
 ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
 
 
-/* free service array */
+/* Free service array */
 VOID FreeMemory(VOID)
 {
     HeapFree(GetProcessHeap(), 0, pServiceStatus);
 }
 
-VOID GetData(VOID)
+/* Retrives the service description from the registry */
+BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)
 {
-    LVITEM item;
-    UINT sel;
-    TCHAR buf[200];
 
-    sel = ListView_GetHotItem(hListView);
+    LPTSTR Description = NULL;
+    DWORD dwValueSize = 0;
+    LONG ret = RegQueryValueEx(hKey,
+                               _T("Description"),
+                               NULL,
+                               NULL,
+                               NULL,
+                               &dwValueSize);
+    if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)
+    {
+        RegCloseKey(hKey);
+        return FALSE;
+    }
 
-    ZeroMemory(&item, sizeof(LV_ITEM));
+    if (ret != ERROR_FILE_NOT_FOUND)
+    {
+        Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);
+        if (Description == NULL)
+        {
+            RegCloseKey(hKey);
+            return FALSE;
+        }
 
-    item.mask = LVIF_TEXT;
-    item.iItem = sel;
-    item.iSubItem = 0;
-    item.pszText = buf;
-    item.cchTextMax = 200;
+        if(RegQueryValueEx(hKey,
+                           _T("Description"),
+                           NULL,
+                           NULL,
+                           (LPBYTE)Description,
+                           &dwValueSize))
+        {
+            HeapFree(GetProcessHeap(), 0, Description);
+            RegCloseKey(hKey);
+            return FALSE;
+        }
+    }
 
-    ListView_GetItem(hListView, &item);
+    /* copy pointer over */
+    *retDescription = Description;
 
+    return TRUE;
+}
 
-    //DisplayString(sel);
-    DisplayString(item.pszText);
+
+BOOL GetExecutablePath(LPTSTR *ExePath)
+{
+
+    return FALSE;
 }
 
 
@@ -79,12 +109,10 @@
         /* assign the image to the list view */
         ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);
 
-
         for (Index = 0; Index < NumServices; Index++)
         {
             HKEY hKey = NULL;
             LPTSTR Description = NULL;
-            LONG ret;
             LPTSTR LogOnAs = NULL;
             DWORD StartUp = 0;
             DWORD dwValueSize;
@@ -102,48 +130,25 @@
 
             /* set the display name */
 
-            ZeroMemory(&item, sizeof(LV_ITEM));
-            item.mask = LVIF_TEXT;
+            ZeroMemory(&item, sizeof(LVITEM));
+            item.mask = LVIF_TEXT | LVIF_PARAM;
             item.pszText = pServiceStatus[Index].lpDisplayName;
+
+            /* Set a pointer for each service so we can query it later.
+             * Not all services are added to the list, so we can't query
+             * the item number as they become out of sync with the array */
+            item.lParam = (LPARAM)&pServiceStatus[Index];
+
             item.iItem = ListView_GetItemCount(hListView);
             item.iItem = ListView_InsertItem(hListView, &item);
 
 
 
+
             /* set the description */
-            dwValueSize = 0;
-            ret = RegQueryValueEx(hKey,
-                                _T("Description"),
-                                NULL,
-                                NULL,
-                                NULL,
-                                &dwValueSize);
-            if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)
-            {
-                RegCloseKey(hKey);
-                continue;
-            }
 
-            if (ret != ERROR_FILE_NOT_FOUND)
+            if (GetDescription(hKey, &Description))
             {
-                Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);
-                if (Description == NULL)
-                {
-                    RegCloseKey(hKey);
-                    return FALSE;
-                }
-                if(RegQueryValueEx(hKey,
-                                   _T("Description"),
-                                   NULL,
-                                   NULL,
-                                   (LPBYTE)Description,
-                                   &dwValueSize))
-                {
-                    HeapFree(GetProcessHeap(), 0, Description);
-                    RegCloseKey(hKey);
-                    continue;
-                }
-
                 item.pszText = Description;
                 item.iSubItem = 1;
                 SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
@@ -152,7 +157,6 @@
             }
 
 
-
             /* set the status */
 
             if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
@@ -253,6 +257,9 @@
         SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);
     }
 
+    /* turn redraw flag on. It's turned off initially via the LBS_NOREDRAW flag */
+    SendMessage (hListView, WM_SETREDRAW, TRUE, 0) ;
+
     return TRUE;
 }
 

Modified: trunk/reactos/subsys/system/servman/resource.h
--- trunk/reactos/subsys/system/servman/resource.h	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/resource.h	2006-01-17 20:12:18 UTC (rev 20940)
@@ -26,12 +26,14 @@
 #define ID_VIEW_CUSTOMIZE   4021
 #define ID_ABOUT            4031
 
+/* List view columns */
 #define IDS_FIRSTCOLUMN     1
 #define IDS_SECONDCOLUMN    2
 #define IDS_THIRDCOLUMN     3
 #define IDS_FOURTHCOLUMN    4
 #define IDS_FITHCOLUMN      5
 
+/* tooltips */
 #define IDS_TOOLTIP_PROP    6000
 #define IDS_TOOLTIP_REFRESH 6001
 #define IDS_TOOLTIP_EXPORT  6002
@@ -52,6 +54,7 @@
 #define IDI_SM_ICON         50
 #define IDB_BUTTONS         51
 
+/* toolbar buttons */
 #define TBICON_PROP         0
 #define TBICON_REFRESH      1
 #define TBICON_EXPORT       2
@@ -63,11 +66,13 @@
 #define TBICON_HELP         8
 #define TBICON_EXIT         9
 
+/* properties dialog */
 #define IDS_PROP_SHEET      10000
 #define IDD_DLG_GENERAL     10001
 #define IDC_SERV_NAME       10041
 #define IDC_DISP_NAME       10051
 #define IDC_DESCRIPTION     10061
+#define IDC_EXEPATH         10062
 #define IDC_START_TYPE      10101
 #define IDC_SERV_STATUS     10121
 #define IDC_START           10131
@@ -75,3 +80,9 @@
 #define IDC_PAUSE           10151
 #define IDC_RESUME          10161
 #define IDC_START_PARAM     10191
+
+#define IDD_DLG_DEPEND      20001
+#define IDC_DEPEND_TREE1    20002
+#define IDC_DEPEND_TREE2    20003
+#define IDC_DEPEND_SERVICE  20004
+

Modified: trunk/reactos/subsys/system/servman/servman.c
--- trunk/reactos/subsys/system/servman/servman.c	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/servman.c	2006-01-17 20:12:18 UTC (rev 20940)
@@ -17,6 +17,7 @@
 HWND hStatus;
 HWND hTool;
 HMENU hShortcutMenu;
+INT SelectedItem;
 
 
 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -100,15 +101,16 @@
 
 /* ======================== Create List View ============================== */
 
-            hListView = CreateWindow(WC_LISTVIEW,
-                                     NULL,
-                                     WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
-                                     LVS_EDITLABELS | LVS_SORTASCENDING,
-                                     0, 0, 0, 0, /* sized via WM_SIZE */
-                                     hwnd,
-                                     (HMENU) IDC_SERVLIST,
-                                     hInstance,
-                                     NULL);
+            hListView = CreateWindowEx(0,
+                                       WC_LISTVIEW,
+                                       NULL,
+                                       WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
+                                       LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,
+                                       0, 0, 0, 0, /* sized via WM_SIZE */
+                                       hwnd,
+                                       (HMENU) IDC_SERVLIST,
+                                       hInstance,
+                                       NULL);
             if (hListView == NULL)
                 MessageBox(hwnd, _T("Could not create List View."), _T("Error"), MB_OK | MB_ICONERROR);
 
@@ -227,23 +229,29 @@
 
 	    case WM_NOTIFY:
         {
-            LPNMITEMACTIVATE item;
+            NMHDR* nm = (NMHDR*) lParam;
 
-
-            switch (((LPNMHDR) lParam)->code)
+            switch (nm->code)
             {
 	            case NM_DBLCLK:
-                    item = (LPNMITEMACTIVATE) lParam;
-                    PropSheets(hwnd);
+                    OpenPropSheet(hwnd);
 			    break;
 
+			    case LVN_ITEMCHANGED:
+			    {
+			        LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
+
+			        SelectedItem = pnmv->iItem;
+
+			    }
+			    break;
+
                 case TTN_GETDISPINFO:
                 {
                     LPTOOLTIPTEXT lpttt;
                     UINT idButton;
 
                     lpttt = (LPTOOLTIPTEXT) lParam;
-                    //lpttt->hinst = hInstance;
 
                     /* Specify the resource identifier of the descriptive
                      * text for the given button. */
@@ -300,16 +308,6 @@
         }
         break;
 
-	    case WM_CLOSE:
-            FreeMemory(); /* free the service array */
-            DestroyMenu(hShortcutMenu);
-		    DestroyWindow(hwnd);
-	    break;
-
-	    case WM_DESTROY:
-		    PostQuitMessage(0);
-	    break;
-
         case WM_CONTEXTMENU:
             {
                 int xPos, yPos;
@@ -323,10 +321,11 @@
         break;
 
 	    case WM_COMMAND:
+
 		    switch(LOWORD(wParam))
 		    {
                 case ID_PROP:
-                    PropSheets(hwnd);
+                    OpenPropSheet(hwnd);
                 break;
 
                 case ID_REFRESH:
@@ -376,6 +375,16 @@
 		    }
 	    break;
 
+	    case WM_CLOSE:
+            FreeMemory(); /* free the service array */
+            DestroyMenu(hShortcutMenu);
+		    DestroyWindow(hwnd);
+	    break;
+
+	    case WM_DESTROY:
+		    PostQuitMessage(0);
+	    break;
+
 	    default:
 		    return DefWindowProc(hwnd, msg, wParam, lParam);
     }

Modified: trunk/reactos/subsys/system/servman/servman.h
--- trunk/reactos/subsys/system/servman/servman.h	2006-01-17 17:29:23 UTC (rev 20939)
+++ trunk/reactos/subsys/system/servman/servman.h	2006-01-17 20:12:18 UTC (rev 20940)
@@ -16,15 +16,16 @@
 
 BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
 
-BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount);
+BOOL Start(LPCTSTR, LPCTSTR, INT);
 
 VOID GetError(DWORD);
 VOID FreeMemory(VOID);
 VOID DisplayString(PTCHAR);
 
-VOID GetData(VOID);
+BOOL GetDescription(HKEY, LPTSTR *);
+BOOL GetExecutablePath(LPTSTR *);
 
-LONG APIENTRY PropSheets(HWND hwnd);
+LONG APIENTRY OpenPropSheet(HWND);
 
 DWORD GetServiceList(VOID);