- Start to put together a services.msc equivalent.
authorGed Murphy <gedmurphy@reactos.org>
Thu, 5 Jan 2006 18:04:46 +0000 (18:04 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Thu, 5 Jan 2006 18:04:46 +0000 (18:04 +0000)
- mmc.exe is probably a long way off, thus mmc snap-ins will be too. This will suffice until then. Most of the code should be transferable.

svn path=/trunk/; revision=20586

reactos/subsys/system/servman/en.rc [new file with mode: 0644]
reactos/subsys/system/servman/res/applet.ico [new file with mode: 0644]
reactos/subsys/system/servman/resource.h [new file with mode: 0644]
reactos/subsys/system/servman/servman.c [new file with mode: 0644]
reactos/subsys/system/servman/servman.rc [new file with mode: 0644]
reactos/subsys/system/servman/servman.xml [new file with mode: 0644]

diff --git a/reactos/subsys/system/servman/en.rc b/reactos/subsys/system/servman/en.rc
new file mode 100644 (file)
index 0000000..e6184f2
--- /dev/null
@@ -0,0 +1,62 @@
+\r
+IDR_MAINMENU MENU\r
+BEGIN\r
+  POPUP "&File"\r
+  BEGIN\r
+    MENUITEM "E&xit",ID_FILE_EXIT\r
+  END\r
+  POPUP "Action"\r
+  BEGIN\r
+    MENUITEM "Start",ID_START\r
+    MENUITEM "Stop",ID_STOP\r
+    MENUITEM "Pause",ID_PAUSE\r
+    MENUITEM "Resume",ID_RESUME\r
+    MENUITEM "Restart",ID_RESTART\r
+    MENUITEM SEPARATOR\r
+    MENUITEM "Refresh",ID_REFRESH\r
+    MENUITEM SEPARATOR\r
+    MENUITEM "Properties",ID_PROP\r
+  END\r
+  POPUP "View"\r
+  BEGIN\r
+    MENUITEM "Customize",ID_VIEW_CUSTOMIZE\r
+  END\r
+  POPUP "Help"\r
+  BEGIN\r
+    MENUITEM "About",ID_HELP_ABOUT\r
+  END\r
+END\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+  IDS_FIRSTCOLUMN "Name"\r
+  IDS_SECONDCOLUMN "Description"\r
+  IDS_THIRDCOLUMN "Status"\r
+  IDS_FOURTHCOLUMN "Startup Type"\r
+  IDS_FITHCOLUMN "Log On As"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+  IDS_SERVICES_STATUS_RUNNING "Started"\r
+  IDS_SERVICES_STATUS_STOPPED "Stopped"\r
+  IDS_SERVICES_YES "Yes"\r
+  IDS_SERVICES_UNKNOWN "Unknown"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+  IDS_SERVICES_NUM_SERVICES "Num Services: %d"\r
+  IDB_START "res/start.bmp"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+    IDS_TOOLTIP_PROP    "Properties"\r
+    IDS_TOOLTIP_REFRESH "Refresh"\r
+    IDS_TOOLTIP_EXPORT  "Export list"\r
+    IDS_TOOLTIP_START   "Start service"\r
+    IDS_TOOLTIP_STOP    "Stop service"\r
+    IDS_TOOLTIP_PAUSE   "Pause service"\r
+    IDS_TOOLTIP_RESTART "Restart service"\r
+END\r
diff --git a/reactos/subsys/system/servman/res/applet.ico b/reactos/subsys/system/servman/res/applet.ico
new file mode 100644 (file)
index 0000000..3eae16d
Binary files /dev/null and b/reactos/subsys/system/servman/res/applet.ico differ
diff --git a/reactos/subsys/system/servman/resource.h b/reactos/subsys/system/servman/resource.h
new file mode 100644 (file)
index 0000000..049ca05
--- /dev/null
@@ -0,0 +1,44 @@
+#define IDC_STATIC -1\r
+\r
+#define IDC_SERVLIST        1000\r
+#define IDC_TOOLBAR         1001\r
+#define IDC_STATUSBAR      1002\r
+\r
+#define ID_PROP             4010\r
+#define ID_REFRESH          4011\r
+#define ID_EXPORT           4012\r
+\r
+#define ID_START            2000\r
+#define ID_STOP             2001\r
+#define ID_PAUSE            2002\r
+#define ID_RESUME           2003\r
+#define ID_RESTART          2004\r
+\r
+#define IDR_MAINMENU        102\r
+#define ID_FILE_EXIT        4001\r
+#define ID_VIEW_CUSTOMIZE   4021\r
+#define ID_HELP_ABOUT       4031\r
+\r
+#define IDS_FIRSTCOLUMN     1\r
+#define IDS_SECONDCOLUMN    2\r
+#define IDS_THIRDCOLUMN     3\r
+#define IDS_FOURTHCOLUMN    4\r
+#define IDS_FITHCOLUMN      5\r
+\r
+#define IDS_TOOLTIP_PROP    6000\r
+#define IDS_TOOLTIP_REFRESH 6001\r
+#define IDS_TOOLTIP_EXPORT  6002\r
+#define IDS_TOOLTIP_START   6003\r
+#define IDS_TOOLTIP_STOP    6004\r
+#define IDS_TOOLTIP_PAUSE   6005\r
+#define IDS_TOOLTIP_RESTART 6006\r
+\r
+\r
+#define IDS_SERVICES_STATUS_RUNNING 5000\r
+#define IDS_SERVICES_STATUS_STOPPED 5001\r
+#define IDS_SERVICES_YES 5002\r
+#define IDS_SERVICES_UNKNOWN 5003\r
+#define IDS_SERVICES_NUM_SERVICES 5004\r
+\r
+#define IDB_START 50\r
+#define IDI_SM_ICON 51\r
diff --git a/reactos/subsys/system/servman/servman.c b/reactos/subsys/system/servman/servman.c
new file mode 100644 (file)
index 0000000..393154d
--- /dev/null
@@ -0,0 +1,620 @@
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <tchar.h>\r
+#include <commctrl.h>\r
+#include "resource.h"\r
+\r
+const TCHAR ClassName[] = _T("ServiceManager");\r
+\r
+HINSTANCE hInstance;\r
+HWND hListView;\r
+HWND hStatus;\r
+\r
+\r
+void\r
+GetServices ( void )\r
+{\r
+    LV_ITEM item;\r
+    WORD wCodePage;\r
+    WORD wLangID;\r
+    SC_HANDLE ScHandle;\r
+    SC_HANDLE hService;\r
+    DWORD BytesNeeded = 0;\r
+    DWORD ResumeHandle = 0;\r
+    DWORD NumServices = 0;\r
+    DWORD dwHandle, dwLen;\r
+    size_t Index;\r
+    UINT BufLen;\r
+    TCHAR szStatus[128];\r
+    TCHAR* lpData;\r
+    TCHAR* lpBuffer;\r
+    TCHAR szStrFileInfo[80];\r
+    TCHAR FileName[MAX_PATH];\r
+    TCHAR szNumServices[32];\r
+    LPVOID pvData;\r
+\r
+    LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;\r
+    LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;\r
+    ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;\r
+\r
+    ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);\r
+    if (ScHandle != INVALID_HANDLE_VALUE)\r
+    {\r
+        if (EnumServicesStatusEx(ScHandle,\r
+                                 SC_ENUM_PROCESS_INFO,\r
+                                 SERVICE_WIN32,\r
+                                 SERVICE_STATE_ALL,\r
+                                 (LPBYTE)pServiceStatus,\r
+                                 0, &BytesNeeded,\r
+                                 &NumServices,\r
+                                 &ResumeHandle,\r
+                                 0) == 0)\r
+        {\r
+            /* Call function again if required size was returned */\r
+            if (GetLastError() == ERROR_MORE_DATA)\r
+            {\r
+                /* reserve memory for service info array */\r
+                pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+                if (pServiceStatus == NULL)\r
+                               return;\r
+\r
+                /* fill array with service info */\r
+                if (EnumServicesStatusEx(ScHandle,\r
+                                         SC_ENUM_PROCESS_INFO,\r
+                                         SERVICE_WIN32,\r
+                                         SERVICE_STATE_ALL,\r
+                                         (LPBYTE)pServiceStatus,\r
+                                         BytesNeeded,\r
+                                         &BytesNeeded,\r
+                                         &NumServices,\r
+                                         &ResumeHandle,\r
+                                         0) == 0)\r
+                {\r
+                    HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
+                    return;\r
+                }\r
+            }\r
+            else /* exit on failure */\r
+            {\r
+                return;\r
+            }\r
+        }\r
+\r
+        if (NumServices)\r
+        {\r
+            HICON hiconItem;     // icon for list-view items\r
+            HIMAGELIST hSmall;   // image list for other views\r
+            TCHAR buf[40];\r
+\r
+            /* Create the icon image lists */\r
+            hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),\r
+                GetSystemMetrics(SM_CYSMICON), ILC_MASK, 1, 1);\r
+\r
+            /* Add an icon to each image list */\r
+            hiconItem = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));\r
+            ImageList_AddIcon(hSmall, hiconItem);\r
+            DestroyIcon(hiconItem);\r
+\r
+            ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);\r
+\r
+            /* set the number of services in the status bar */\r
+            LoadString(hInstance, IDS_SERVICES_NUM_SERVICES, szNumServices, 32);\r
+            _stprintf(buf, szNumServices, NumServices);\r
+            SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);\r
+\r
+            for (Index = 0; Index < NumServices; Index++)\r
+            {\r
+                memset(&item, 0, sizeof(LV_ITEM));\r
+                item.mask = LVIF_TEXT;\r
+                //item.iImage = 0;\r
+                item.pszText = pServiceStatus[Index].lpDisplayName;\r
+                item.iItem = ListView_GetItemCount(hListView);\r
+                item.lParam = 0;\r
+                item.iItem = ListView_InsertItem(hListView, &item);\r
+\r
+                BytesNeeded = 0;\r
+                hService = OpenService(ScHandle,\r
+                                       pServiceStatus[Index].lpServiceName,\r
+                                       SC_MANAGER_CONNECT);\r
+                if (hService != INVALID_HANDLE_VALUE)\r
+                {\r
+                    /* check if service is required by the system*/\r
+                    if (!QueryServiceConfig2(hService,\r
+                                             SERVICE_CONFIG_FAILURE_ACTIONS,\r
+                                             (LPBYTE)pServiceFailureActions,\r
+                                             0,\r
+                                             &BytesNeeded))\r
+                    {\r
+                        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
+                        {\r
+                            pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS)\r
+                                HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+                            if (pServiceFailureActions == NULL)\r
+                                           return;\r
+\r
+                            if (!QueryServiceConfig2(hService,\r
+                                                     SERVICE_CONFIG_FAILURE_ACTIONS,\r
+                                                     (LPBYTE)pServiceFailureActions,\r
+                                                     BytesNeeded,\r
+                                                     &BytesNeeded))\r
+                            {\r
+                                HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
+                                return;\r
+                            }\r
+                        }\r
+                        else /* exit on failure */\r
+                        {\r
+                            return;\r
+                        }\r
+                    }\r
+                    if (pServiceFailureActions->cActions)\r
+                    {\r
+                        if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)\r
+                        {\r
+                            LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128);\r
+                            item.pszText = szStatus;\r
+                            item.iSubItem = 1;\r
+                            SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+                        }\r
+                    }\r
+\r
+                                       if (pServiceFailureActions != NULL)\r
+                                       {\r
+                                               HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
+                                               pServiceFailureActions = NULL;\r
+                                       }\r
+\r
+                    /* get vendor of service binary */\r
+                    BytesNeeded = 0;\r
+                    if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))\r
+                    {\r
+                        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
+                        {\r
+                            pServiceConfig = (LPQUERY_SERVICE_CONFIG)\r
+                                HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+                            if (pServiceConfig == NULL)\r
+                                           return;\r
+\r
+                            if (!QueryServiceConfig(hService,\r
+                                                    pServiceConfig,\r
+                                                    BytesNeeded,\r
+                                                    &BytesNeeded))\r
+                            {\r
+                                HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
+                                return;\r
+                            }\r
+                        }\r
+                        else /* exit on failure */\r
+                        {\r
+                            return;\r
+                        }\r
+                    }\r
+\r
+                    memset(&FileName, 0, MAX_PATH);\r
+                    if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))\r
+                    {\r
+                        _tcsncpy(FileName, pServiceConfig->lpBinaryPathName,\r
+                            _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );\r
+                    }\r
+                    else\r
+                    {\r
+                        _tcscpy(FileName, pServiceConfig->lpBinaryPathName);\r
+                    }\r
+\r
+                                       HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
+                                       pServiceConfig = NULL;\r
+\r
+                                       dwLen = GetFileVersionInfoSize(FileName, &dwHandle);\r
+                    if (dwLen)\r
+                    {\r
+                        lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);\r
+                        if (lpData == NULL)\r
+                                       return;\r
+\r
+                        if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {\r
+                                   HeapFree(GetProcessHeap(), 0, lpData);\r
+                                   return;\r
+                           }\r
+\r
+                        if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))\r
+                        {\r
+                            wCodePage = LOWORD(*(DWORD*) pvData);\r
+                            wLangID = HIWORD(*(DWORD*) pvData);\r
+                            wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);\r
+                        }\r
+\r
+                        if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {\r
+                            item.pszText = lpBuffer;\r
+                            item.iSubItem = 2;\r
+                            SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+                        }\r
+                                               HeapFree(GetProcessHeap(), 0, lpData);\r
+                    }\r
+                    else\r
+                    {\r
+                        LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);\r
+                        item.pszText = szStatus;\r
+                        item.iSubItem = 2;\r
+                        SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+                    }\r
+                    CloseServiceHandle(hService);\r
+                }\r
+\r
+                if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)\r
+                {\r
+                    LoadString(hInstance, IDS_SERVICES_STATUS_RUNNING, szStatus, 128);\r
+                    item.pszText = szStatus;\r
+                    item.iSubItem = 2;\r
+                    SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+                }\r
+                else\r
+                {\r
+                    item.pszText = '\0';\r
+                    item.iSubItem = 2;\r
+                    SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+                }\r
+\r
+            }\r
+        }\r
+\r
+        HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
+        CloseServiceHandle(ScHandle);\r
+    }\r
+\r
+\r
+}\r
+\r
+\r
+\r
+LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch(msg)\r
+       {\r
+               case WM_CREATE:\r
+               {\r
+                       //HFONT hfDefault;\r
+\r
+                       HWND hTool;\r
+                       TBBUTTON tbb[7];\r
+                       TBADDBITMAP tbab;\r
+\r
+                       int statwidths[] = {110, -1};\r
+\r
+                       TCHAR szTemp[256];\r
+\r
+                       /* Create List View */\r
+            LVCOLUMN lvc = { 0 };\r
+            //LVITEM   lv  = { 0 };\r
+\r
+            //GetClientRect(hwnd, &rc);\r
+            hListView = CreateWindow(WC_LISTVIEW,\r
+                                     NULL,\r
+                                     WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS,\r
+                                     0, 0, 0, 0, /* sized via WM_SIZE */\r
+                                     hwnd,\r
+                                     (HMENU) IDC_SERVLIST,\r
+                                     hInstance,\r
+                                     NULL);\r
+\r
+            ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT |\r
+                    /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP);\r
+\r
+            lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH  | LVCF_FMT;\r
+            lvc.fmt  = LVCFMT_LEFT;\r
+\r
+            /* Add columns to the list-view (first column contains check box). */\r
+            lvc.iSubItem = 0;\r
+            lvc.cx       = 160;\r
+            LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp, 256);\r
+            lvc.pszText  = szTemp;\r
+            ListView_InsertColumn(hListView, 0, &lvc);\r
+\r
+            lvc.iSubItem = 1;\r
+            lvc.cx       = 150;\r
+            LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256);\r
+            lvc.pszText  = szTemp;\r
+            ListView_InsertColumn(hListView, 1, &lvc);\r
+\r
+            lvc.iSubItem = 2;\r
+            lvc.cx       = 80;\r
+            LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256);\r
+            lvc.pszText  = szTemp;\r
+            ListView_InsertColumn(hListView, 2, &lvc);\r
+\r
+            lvc.iSubItem = 3;\r
+            lvc.cx       = 80;\r
+            LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp, 256);\r
+            lvc.pszText  = szTemp;\r
+            ListView_InsertColumn(hListView, 3, &lvc);\r
+\r
+            lvc.iSubItem = 4;\r
+            lvc.cx       = 100;\r
+            LoadString(hInstance, IDS_FITHCOLUMN, szTemp, 256);\r
+            lvc.pszText  = szTemp;\r
+            ListView_InsertColumn(hListView, 4, &lvc);\r
+\r
+                       // Create Toolbar\r
+                       hTool = CreateWindowEx(0,\r
+                                   TOOLBARCLASSNAME,\r
+                                   NULL,\r
+                                   WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,\r
+                                   0, 0, 0, 0,\r
+                                   hwnd,\r
+                                   (HMENU)IDC_TOOLBAR,\r
+                                   hInstance,\r
+                                   NULL);\r
+                       if(hTool == NULL)\r
+                               MessageBox(hwnd, _T("Could not create tool bar."), _T("Error"), MB_OK | MB_ICONERROR);\r
+\r
+                       // Send the TB_BUTTONSTRUCTSIZE message, which is required for\r
+                       // backward compatibility.\r
+                       SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);\r
+\r
+                       tbab.hInst = HINST_COMMCTRL;\r
+                       tbab.nID = IDB_STD_SMALL_COLOR;\r
+                       SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);\r
+\r
+            ZeroMemory(tbb, sizeof(tbb));\r
+            tbb[0].iBitmap = STD_PROPERTIES;\r
+            tbb[0].fsState = TBSTATE_ENABLED;\r
+            tbb[0].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[0].idCommand = ID_PROP;\r
+            tbb[1].iBitmap = STD_FILENEW;\r
+            tbb[1].fsState = TBSTATE_ENABLED;\r
+            tbb[1].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[1].idCommand = ID_REFRESH;\r
+            tbb[2].iBitmap = STD_FILENEW;\r
+            tbb[2].fsState = TBSTATE_ENABLED;\r
+            tbb[2].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[2].idCommand = ID_EXPORT;\r
+            /* seperator */\r
+            tbb[3].iBitmap = STD_FILENEW;\r
+            tbb[3].fsState = TBSTATE_ENABLED;\r
+            tbb[3].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[3].idCommand = ID_START;\r
+            tbb[4].iBitmap = STD_FILENEW;\r
+            tbb[4].fsState = TBSTATE_ENABLED;\r
+            tbb[4].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[4].idCommand = ID_STOP;\r
+            tbb[5].iBitmap = STD_FILENEW;\r
+            tbb[5].fsState = TBSTATE_ENABLED;\r
+            tbb[5].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[5].idCommand = ID_PAUSE;\r
+            tbb[6].iBitmap = STD_FILENEW;\r
+            tbb[6].fsState = TBSTATE_ENABLED;\r
+            tbb[6].fsStyle = TBSTYLE_BUTTON;\r
+            tbb[6].idCommand = ID_RESTART;\r
+            SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);\r
+\r
+                       /* Create Status bar */\r
+                       hStatus = CreateWindowEx(0,\r
+                                     STATUSCLASSNAME,\r
+                                     NULL,\r
+                                     WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,\r
+                                     0, 0, 0, 0,\r
+                                     hwnd,\r
+                                     (HMENU)IDC_STATUSBAR,\r
+                                     hInstance,\r
+                                     NULL);\r
+            if(hStatus == NULL)\r
+                               MessageBox(hwnd, _T("Could not create status bar."), _T("Error"), MB_OK | MB_ICONERROR);\r
+\r
+                       SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);\r
+\r
+                       /* populate the list view with all services */\r
+                       GetServices();\r
+               }\r
+               break;\r
+               case WM_SIZE:\r
+               {\r
+                       HWND hTool;\r
+                       RECT rcTool;\r
+                       int iToolHeight;\r
+\r
+                       HWND hStatus;\r
+                       RECT rcStatus;\r
+                       int iStatusHeight;\r
+\r
+                       HWND hListView;\r
+                       int lvHeight;\r
+                       RECT rcClient;\r
+\r
+                       /* Size toolbar and get height */\r
+                       hTool = GetDlgItem(hwnd, IDC_TOOLBAR);\r
+                       SendMessage(hTool, TB_AUTOSIZE, 0, 0);\r
+\r
+                       GetWindowRect(hTool, &rcTool);\r
+                       iToolHeight = rcTool.bottom - rcTool.top;\r
+\r
+                       /* Size status bar and get height */\r
+                       hStatus = GetDlgItem(hwnd, IDC_STATUSBAR);\r
+                       SendMessage(hStatus, WM_SIZE, 0, 0);\r
+\r
+                       GetWindowRect(hStatus, &rcStatus);\r
+                       iStatusHeight = rcStatus.bottom - rcStatus.top;\r
+\r
+                       /* Calculate remaining height and size list view */\r
+                       GetClientRect(hwnd, &rcClient);\r
+\r
+                       lvHeight = rcClient.bottom - iToolHeight - iStatusHeight;\r
+\r
+                       hListView = GetDlgItem(hwnd, IDC_SERVLIST);\r
+                       SetWindowPos(hListView, NULL, 0, iToolHeight, rcClient.right, lvHeight, SWP_NOZORDER);\r
+               }\r
+               break;\r
+\r
+               case WM_NOTIFY:\r
+            switch (((LPNMHDR) lParam)->code)\r
+            {\r
+                case TTN_GETDISPINFO:\r
+                {\r
+                    LPTOOLTIPTEXT lpttt;\r
+                    UINT idButton;\r
+\r
+                    lpttt = (LPTOOLTIPTEXT) lParam;\r
+                    lpttt->hinst = hInstance;\r
+\r
+                    // Specify the resource identifier of the descriptive\r
+                    // text for the given button.\r
+                    idButton = lpttt->hdr.idFrom;\r
+                    switch (idButton)\r
+                    {\r
+                        case ID_PROP:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PROP);\r
+                        break;\r
+\r
+                        case ID_REFRESH:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH);\r
+                        break;\r
+\r
+                        case ID_EXPORT:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXPORT);\r
+                        break;\r
+\r
+                        case ID_START:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_START);\r
+                        break;\r
+\r
+                        case ID_STOP:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_STOP);\r
+                        break;\r
+\r
+                        case ID_PAUSE:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PAUSE);\r
+                        break;\r
+\r
+                        case ID_RESTART:\r
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART);\r
+                        break;\r
+\r
+                    }\r
+                }\r
+                break;\r
+\r
+                // Process other notifications here.\r
+\r
+                default:\r
+                break;\r
+            }\r
+        break;\r
+\r
+               case WM_CLOSE:\r
+                       DestroyWindow(hwnd);\r
+               break;\r
+               case WM_DESTROY:\r
+                       PostQuitMessage(0);\r
+               break;\r
+               case WM_COMMAND:\r
+                       switch(LOWORD(wParam))\r
+                       {\r
+                               case ID_FILE_EXIT:\r
+                                       PostMessage(hwnd, WM_CLOSE, 0, 0);\r
+                               break;\r
+\r
+                               case ID_START:\r
+                               break;\r
+\r
+                case ID_STOP:\r
+                break;\r
+\r
+                case ID_PAUSE:\r
+                break;\r
+\r
+                case ID_RESUME:\r
+                break;\r
+\r
+                case ID_RESTART:\r
+                break;\r
+\r
+                case ID_REFRESH:\r
+                break;\r
+\r
+                case ID_PROP:\r
+                break;\r
+\r
+                case ID_VIEW_CUSTOMIZE:\r
+                break;\r
+\r
+                case ID_HELP_ABOUT:\r
+                break;\r
+\r
+                case ID_EXPORT:\r
+                break;\r
+\r
+                       }\r
+               break;\r
+               default:\r
+                       return DefWindowProc(hwnd, msg, wParam, lParam);\r
+       }\r
+       return 0;\r
+}\r
+\r
+\r
+\r
+int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,\r
+       LPSTR lpCmdLine, int nCmdShow)\r
+{\r
+       WNDCLASSEX wc;\r
+       HWND hwnd;\r
+       MSG Msg;\r
+       BOOL bRet;\r
+\r
+       hInstance = hThisInstance;\r
+\r
+       InitCommonControls();\r
+\r
+       wc.cbSize                = sizeof(WNDCLASSEX);\r
+       wc.style                 = 0;\r
+       wc.lpfnWndProc   = WndProc;\r
+       wc.cbClsExtra    = 0;\r
+       wc.cbWndExtra    = 0;\r
+       wc.hInstance     = hInstance;\r
+       wc.hIcon                 = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SM_ICON));\r
+       wc.hCursor               = LoadCursor(NULL, IDC_ARROW);\r
+       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);\r
+       wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINMENU);\r
+       wc.lpszClassName = ClassName;\r
+       wc.hIconSm               = (HICON)LoadImage(GetModuleHandle(NULL),\r
+                        MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+\r
+       if(!RegisterClassEx(&wc))\r
+       {\r
+               MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"),\r
+                       MB_ICONEXCLAMATION | MB_OK);\r
+               return 0;\r
+       }\r
+\r
+       hwnd = CreateWindowEx(\r
+               0,\r
+               ClassName,\r
+               _T("ReactOS Service Manager"),\r
+               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\r
+               CW_USEDEFAULT, CW_USEDEFAULT, 700, 500,\r
+               NULL, NULL, hInstance, NULL);\r
+\r
+       if(hwnd == NULL)\r
+       {\r
+               MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"),\r
+                       MB_ICONEXCLAMATION | MB_OK);\r
+               return 0;\r
+       }\r
+\r
+       ShowWindow(hwnd, nCmdShow);\r
+       UpdateWindow(hwnd);\r
+\r
+    while( (bRet = GetMessage( &Msg, NULL, 0, 0 )) != 0)\r
+    {\r
+        if (bRet == -1)\r
+        {\r
+            /* handle the error and possibly exit */\r
+        }\r
+        else\r
+        {\r
+            TranslateMessage(&Msg);\r
+            DispatchMessage(&Msg);\r
+        }\r
+    }\r
+       return Msg.wParam;\r
+}\r
+\r
+\r
diff --git a/reactos/subsys/system/servman/servman.rc b/reactos/subsys/system/servman/servman.rc
new file mode 100644 (file)
index 0000000..1a8e3c0
--- /dev/null
@@ -0,0 +1,16 @@
+#include <windows.h>\r
+#include <commctrl.h>\r
+#include "resource.h"\r
+\r
+\r
+#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS Service Manager\0"\r
+#define REACTOS_STR_INTERNAL_NAME      "services\0"\r
+#define REACTOS_STR_ORIGINAL_FILENAME  "services.exe\0"\r
+#include <reactos/version.rc>\r
+\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+\r
+IDI_SM_ICON ICON "res/applet.ico"\r
+\r
+#include "En.rc"\r
+\r
diff --git a/reactos/subsys/system/servman/servman.xml b/reactos/subsys/system/servman/servman.xml
new file mode 100644 (file)
index 0000000..2a4b1b1
--- /dev/null
@@ -0,0 +1,19 @@
+<module name="servman" type="win32gui" installbase="system32" installname="servman.exe">\r
+       <include base="msconfig">.</include>\r
+       <define name="UNICODE" />\r
+       <define name="_UNICODE" />\r
+       <define name="__REACTOS__" />\r
+       <define name="__USE_W32API" />\r
+       <define name="_WIN32_IE">0x600</define>\r
+       <define name="_WIN32_WINNT">0x501</define>\r
+       <library>kernel32</library>\r
+       <library>user32</library>\r
+       <library>advapi32</library>\r
+       <library>version</library>\r
+       <library>comctl32</library>\r
+       <library>shell32</library>\r
+       <compilationunit name="unit.c">\r
+               <file>servman.c</file>\r
+       </compilationunit>\r
+       <file>servman.rc</file>\r
+</module>\r