- Start to put together a services.msc equivalent.
- 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.
Added: trunk/reactos/subsys/system/servman/
Added: trunk/reactos/subsys/system/servman/en.rc
Added: trunk/reactos/subsys/system/servman/res/
Added: trunk/reactos/subsys/system/servman/res/applet.ico
Added: trunk/reactos/subsys/system/servman/resource.h
Added: trunk/reactos/subsys/system/servman/servman.c
Added: trunk/reactos/subsys/system/servman/servman.rc
Added: trunk/reactos/subsys/system/servman/servman.xml

Added: trunk/reactos/subsys/system/servman/en.rc
--- trunk/reactos/subsys/system/servman/en.rc	2006-01-05 17:52:39 UTC (rev 20585)
+++ trunk/reactos/subsys/system/servman/en.rc	2006-01-05 18:04:46 UTC (rev 20586)
@@ -0,0 +1,62 @@
+
+IDR_MAINMENU MENU
+BEGIN
+  POPUP "&File"
+  BEGIN
+    MENUITEM "E&xit",ID_FILE_EXIT
+  END
+  POPUP "Action"
+  BEGIN
+    MENUITEM "Start",ID_START
+    MENUITEM "Stop",ID_STOP
+    MENUITEM "Pause",ID_PAUSE
+    MENUITEM "Resume",ID_RESUME
+    MENUITEM "Restart",ID_RESTART
+    MENUITEM SEPARATOR
+    MENUITEM "Refresh",ID_REFRESH
+    MENUITEM SEPARATOR
+    MENUITEM "Properties",ID_PROP
+  END
+  POPUP "View"
+  BEGIN
+    MENUITEM "Customize",ID_VIEW_CUSTOMIZE
+  END
+  POPUP "Help"
+  BEGIN
+    MENUITEM "About",ID_HELP_ABOUT
+  END
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+  IDS_FIRSTCOLUMN "Name"
+  IDS_SECONDCOLUMN "Description"
+  IDS_THIRDCOLUMN "Status"
+  IDS_FOURTHCOLUMN "Startup Type"
+  IDS_FITHCOLUMN "Log On As"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+  IDS_SERVICES_STATUS_RUNNING "Started"
+  IDS_SERVICES_STATUS_STOPPED "Stopped"
+  IDS_SERVICES_YES "Yes"
+  IDS_SERVICES_UNKNOWN "Unknown"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+  IDS_SERVICES_NUM_SERVICES "Num Services: %d"
+  IDB_START "res/start.bmp"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    IDS_TOOLTIP_PROP    "Properties"
+    IDS_TOOLTIP_REFRESH "Refresh"
+    IDS_TOOLTIP_EXPORT  "Export list"
+    IDS_TOOLTIP_START   "Start service"
+    IDS_TOOLTIP_STOP    "Stop service"
+    IDS_TOOLTIP_PAUSE   "Pause service"
+    IDS_TOOLTIP_RESTART "Restart service"
+END

Added: trunk/reactos/subsys/system/servman/res/applet.ico
(Binary files differ)
Property changes on: trunk/reactos/subsys/system/servman/res/applet.ico
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/reactos/subsys/system/servman/resource.h
--- trunk/reactos/subsys/system/servman/resource.h	2006-01-05 17:52:39 UTC (rev 20585)
+++ trunk/reactos/subsys/system/servman/resource.h	2006-01-05 18:04:46 UTC (rev 20586)
@@ -0,0 +1,44 @@
+#define IDC_STATIC -1
+
+#define IDC_SERVLIST        1000
+#define IDC_TOOLBAR         1001
+#define IDC_STATUSBAR	    1002
+
+#define ID_PROP             4010
+#define ID_REFRESH          4011
+#define ID_EXPORT           4012
+
+#define ID_START            2000
+#define ID_STOP             2001
+#define ID_PAUSE            2002
+#define ID_RESUME           2003
+#define ID_RESTART          2004
+
+#define IDR_MAINMENU        102
+#define ID_FILE_EXIT        4001
+#define ID_VIEW_CUSTOMIZE   4021
+#define ID_HELP_ABOUT       4031
+
+#define IDS_FIRSTCOLUMN     1
+#define IDS_SECONDCOLUMN    2
+#define IDS_THIRDCOLUMN     3
+#define IDS_FOURTHCOLUMN    4
+#define IDS_FITHCOLUMN      5
+
+#define IDS_TOOLTIP_PROP    6000
+#define IDS_TOOLTIP_REFRESH 6001
+#define IDS_TOOLTIP_EXPORT  6002
+#define IDS_TOOLTIP_START   6003
+#define IDS_TOOLTIP_STOP    6004
+#define IDS_TOOLTIP_PAUSE   6005
+#define IDS_TOOLTIP_RESTART 6006
+
+
+#define IDS_SERVICES_STATUS_RUNNING 5000
+#define IDS_SERVICES_STATUS_STOPPED 5001
+#define IDS_SERVICES_YES 5002
+#define IDS_SERVICES_UNKNOWN 5003
+#define IDS_SERVICES_NUM_SERVICES 5004
+
+#define IDB_START 50
+#define IDI_SM_ICON 51

Added: trunk/reactos/subsys/system/servman/servman.c
--- trunk/reactos/subsys/system/servman/servman.c	2006-01-05 17:52:39 UTC (rev 20585)
+++ trunk/reactos/subsys/system/servman/servman.c	2006-01-05 18:04:46 UTC (rev 20586)
@@ -0,0 +1,620 @@
+#include <windows.h>
+#include <stdio.h>
+#include <tchar.h>
+#include <commctrl.h>
+#include "resource.h"
+
+const TCHAR ClassName[] = _T("ServiceManager");
+
+HINSTANCE hInstance;
+HWND hListView;
+HWND hStatus;
+
+
+void
+GetServices ( void )
+{
+    LV_ITEM item;
+    WORD wCodePage;
+    WORD wLangID;
+    SC_HANDLE ScHandle;
+    SC_HANDLE hService;
+    DWORD BytesNeeded = 0;
+    DWORD ResumeHandle = 0;
+    DWORD NumServices = 0;
+    DWORD dwHandle, dwLen;
+    size_t Index;
+    UINT BufLen;
+    TCHAR szStatus[128];
+    TCHAR* lpData;
+    TCHAR* lpBuffer;
+    TCHAR szStrFileInfo[80];
+    TCHAR FileName[MAX_PATH];
+    TCHAR szNumServices[32];
+    LPVOID pvData;
+
+    LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;
+    LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
+    ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
+
+    ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
+    if (ScHandle != INVALID_HANDLE_VALUE)
+    {
+        if (EnumServicesStatusEx(ScHandle,
+                                 SC_ENUM_PROCESS_INFO,
+                                 SERVICE_WIN32,
+                                 SERVICE_STATE_ALL,
+                                 (LPBYTE)pServiceStatus,
+                                 0, &BytesNeeded,
+                                 &NumServices,
+                                 &ResumeHandle,
+                                 0) == 0)
+        {
+            /* Call function again if required size was returned */
+            if (GetLastError() == ERROR_MORE_DATA)
+            {
+                /* reserve memory for service info array */
+                pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
+                if (pServiceStatus == NULL)
+			        return;
+
+                /* fill array with service info */
+                if (EnumServicesStatusEx(ScHandle,
+                                         SC_ENUM_PROCESS_INFO,
+                                         SERVICE_WIN32,
+                                         SERVICE_STATE_ALL,
+                                         (LPBYTE)pServiceStatus,
+                                         BytesNeeded,
+                                         &BytesNeeded,
+                                         &NumServices,
+                                         &ResumeHandle,
+                                         0) == 0)
+                {
+                    HeapFree(GetProcessHeap(), 0, pServiceStatus);
+                    return;
+                }
+            }
+            else /* exit on failure */
+            {
+                return;
+            }
+        }
+
+        if (NumServices)
+        {
+            HICON hiconItem;     // icon for list-view items
+            HIMAGELIST hSmall;   // image list for other views
+            TCHAR buf[40];
+
+            /* Create the icon image lists */
+            hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
+                GetSystemMetrics(SM_CYSMICON), ILC_MASK, 1, 1);
+
+            /* Add an icon to each image list */
+            hiconItem = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));
+            ImageList_AddIcon(hSmall, hiconItem);
+            DestroyIcon(hiconItem);
+
+            ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);
+
+            /* set the number of services in the status bar */
+            LoadString(hInstance, IDS_SERVICES_NUM_SERVICES, szNumServices, 32);
+            _stprintf(buf, szNumServices, NumServices);
+            SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);
+
+            for (Index = 0; Index < NumServices; Index++)
+            {
+                memset(&item, 0, sizeof(LV_ITEM));
+                item.mask = LVIF_TEXT;
+                //item.iImage = 0;
+                item.pszText = pServiceStatus[Index].lpDisplayName;
+                item.iItem = ListView_GetItemCount(hListView);
+                item.lParam = 0;
+                item.iItem = ListView_InsertItem(hListView, &item);
+
+                BytesNeeded = 0;
+                hService = OpenService(ScHandle,
+                                       pServiceStatus[Index].lpServiceName,
+                                       SC_MANAGER_CONNECT);
+                if (hService != INVALID_HANDLE_VALUE)
+                {
+                    /* check if service is required by the system*/
+                    if (!QueryServiceConfig2(hService,
+                                             SERVICE_CONFIG_FAILURE_ACTIONS,
+                                             (LPBYTE)pServiceFailureActions,
+                                             0,
+                                             &BytesNeeded))
+                    {
+                        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+                        {
+                            pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS)
+                                HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
+                            if (pServiceFailureActions == NULL)
+			                    return;
+
+                            if (!QueryServiceConfig2(hService,
+                                                     SERVICE_CONFIG_FAILURE_ACTIONS,
+                                                     (LPBYTE)pServiceFailureActions,
+                                                     BytesNeeded,
+                                                     &BytesNeeded))
+                            {
+                                HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
+                                return;
+                            }
+                        }
+                        else /* exit on failure */
+                        {
+                            return;
+                        }
+                    }
+                    if (pServiceFailureActions->cActions)
+                    {
+                        if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)
+                        {
+                            LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128);
+                            item.pszText = szStatus;
+                            item.iSubItem = 1;
+                            SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+                        }
+                    }
+
+					if (pServiceFailureActions != NULL)
+					{
+						HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
+						pServiceFailureActions = NULL;
+					}
+
+                    /* get vendor of service binary */
+                    BytesNeeded = 0;
+                    if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))
+                    {
+                        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+                        {
+                            pServiceConfig = (LPQUERY_SERVICE_CONFIG)
+                                HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
+                            if (pServiceConfig == NULL)
+			                    return;
+
+                            if (!QueryServiceConfig(hService,
+                                                    pServiceConfig,
+                                                    BytesNeeded,
+                                                    &BytesNeeded))
+                            {
+                                HeapFree(GetProcessHeap(), 0, pServiceConfig);
+                                return;
+                            }
+                        }
+                        else /* exit on failure */
+                        {
+                            return;
+                        }
+                    }
+
+                    memset(&FileName, 0, MAX_PATH);
+                    if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))
+                    {
+                        _tcsncpy(FileName, pServiceConfig->lpBinaryPathName,
+                            _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );
+                    }
+                    else
+                    {
+                        _tcscpy(FileName, pServiceConfig->lpBinaryPathName);
+                    }
+
+					HeapFree(GetProcessHeap(), 0, pServiceConfig);
+					pServiceConfig = NULL;
+
+					dwLen = GetFileVersionInfoSize(FileName, &dwHandle);
+                    if (dwLen)
+                    {
+                        lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);
+                        if (lpData == NULL)
+			                return;
+
+                        if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {
+		                    HeapFree(GetProcessHeap(), 0, lpData);
+		                    return;
+	                    }
+
+                        if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))
+                        {
+                            wCodePage = LOWORD(*(DWORD*) pvData);
+                            wLangID = HIWORD(*(DWORD*) pvData);
+                            wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);
+                        }
+
+                        if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {
+                            item.pszText = lpBuffer;
+                            item.iSubItem = 2;
+                            SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+                        }
+						HeapFree(GetProcessHeap(), 0, lpData);
+                    }
+                    else
+                    {
+                        LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);
+                        item.pszText = szStatus;
+                        item.iSubItem = 2;
+                        SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+                    }
+                    CloseServiceHandle(hService);
+                }
+
+                if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
+                {
+                    LoadString(hInstance, IDS_SERVICES_STATUS_RUNNING, szStatus, 128);
+                    item.pszText = szStatus;
+                    item.iSubItem = 2;
+                    SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+                }
+                else
+                {
+                    item.pszText = '\0';
+                    item.iSubItem = 2;
+                    SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+                }
+
+            }
+        }
+
+        HeapFree(GetProcessHeap(), 0, pServiceStatus);
+        CloseServiceHandle(ScHandle);
+    }
+
+
+}
+
+
+
+LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	switch(msg)
+	{
+		case WM_CREATE:
+		{
+			//HFONT hfDefault;
+
+			HWND hTool;
+			TBBUTTON tbb[7];
+			TBADDBITMAP tbab;
+
+			int statwidths[] = {110, -1};
+
+			TCHAR szTemp[256];
+
+			/* Create List View */
+            LVCOLUMN lvc = { 0 };
+            //LVITEM   lv  = { 0 };
+
+            //GetClientRect(hwnd, &rc);
+            hListView = CreateWindow(WC_LISTVIEW,
+                                     NULL,
+                                     WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS,
+                                     0, 0, 0, 0, /* sized via WM_SIZE */
+                                     hwnd,
+                                     (HMENU) IDC_SERVLIST,
+                                     hInstance,
+                                     NULL);
+
+            ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT |
+                    /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP);
+
+            lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH  | LVCF_FMT;
+            lvc.fmt  = LVCFMT_LEFT;
+
+            /* Add columns to the list-view (first column contains check box). */
+            lvc.iSubItem = 0;
+            lvc.cx       = 160;
+            LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp, 256);
+            lvc.pszText  = szTemp;
+            ListView_InsertColumn(hListView, 0, &lvc);
+
+            lvc.iSubItem = 1;
+            lvc.cx       = 150;
+            LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256);
+            lvc.pszText  = szTemp;
+            ListView_InsertColumn(hListView, 1, &lvc);
+
+            lvc.iSubItem = 2;
+            lvc.cx       = 80;
+            LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256);
+            lvc.pszText  = szTemp;
+            ListView_InsertColumn(hListView, 2, &lvc);
+
+            lvc.iSubItem = 3;
+            lvc.cx       = 80;
+            LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp, 256);
+            lvc.pszText  = szTemp;
+            ListView_InsertColumn(hListView, 3, &lvc);
+
+            lvc.iSubItem = 4;
+            lvc.cx       = 100;
+            LoadString(hInstance, IDS_FITHCOLUMN, szTemp, 256);
+            lvc.pszText  = szTemp;
+            ListView_InsertColumn(hListView, 4, &lvc);
+
+			// Create Toolbar
+			hTool = CreateWindowEx(0,
+                                   TOOLBARCLASSNAME,
+                                   NULL,
+                                   WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
+                                   0, 0, 0, 0,
+                                   hwnd,
+                                   (HMENU)IDC_TOOLBAR,
+                                   hInstance,
+                                   NULL);
+			if(hTool == NULL)
+				MessageBox(hwnd, _T("Could not create tool bar."), _T("Error"), MB_OK | MB_ICONERROR);
+
+			// Send the TB_BUTTONSTRUCTSIZE message, which is required for
+			// backward compatibility.
+			SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
+
+			tbab.hInst = HINST_COMMCTRL;
+			tbab.nID = IDB_STD_SMALL_COLOR;
+			SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);
+
+            ZeroMemory(tbb, sizeof(tbb));
+            tbb[0].iBitmap = STD_PROPERTIES;
+            tbb[0].fsState = TBSTATE_ENABLED;
+            tbb[0].fsStyle = TBSTYLE_BUTTON;
+            tbb[0].idCommand = ID_PROP;
+            tbb[1].iBitmap = STD_FILENEW;
+            tbb[1].fsState = TBSTATE_ENABLED;
+            tbb[1].fsStyle = TBSTYLE_BUTTON;
+            tbb[1].idCommand = ID_REFRESH;
+            tbb[2].iBitmap = STD_FILENEW;
+            tbb[2].fsState = TBSTATE_ENABLED;
+            tbb[2].fsStyle = TBSTYLE_BUTTON;
+            tbb[2].idCommand = ID_EXPORT;
+            /* seperator */
+            tbb[3].iBitmap = STD_FILENEW;
+            tbb[3].fsState = TBSTATE_ENABLED;
+            tbb[3].fsStyle = TBSTYLE_BUTTON;
+            tbb[3].idCommand = ID_START;
+            tbb[4].iBitmap = STD_FILENEW;
+            tbb[4].fsState = TBSTATE_ENABLED;
+            tbb[4].fsStyle = TBSTYLE_BUTTON;
+            tbb[4].idCommand = ID_STOP;
+            tbb[5].iBitmap = STD_FILENEW;
+            tbb[5].fsState = TBSTATE_ENABLED;
+            tbb[5].fsStyle = TBSTYLE_BUTTON;
+            tbb[5].idCommand = ID_PAUSE;
+            tbb[6].iBitmap = STD_FILENEW;
+            tbb[6].fsState = TBSTATE_ENABLED;
+            tbb[6].fsStyle = TBSTYLE_BUTTON;
+            tbb[6].idCommand = ID_RESTART;
+            SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
+
+			/* Create Status bar */
+			hStatus = CreateWindowEx(0,
+                                     STATUSCLASSNAME,
+                                     NULL,
+                                     WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,
+                                     0, 0, 0, 0,
+                                     hwnd,
+                                     (HMENU)IDC_STATUSBAR,
+                                     hInstance,
+                                     NULL);
+            if(hStatus == NULL)
+				MessageBox(hwnd, _T("Could not create status bar."), _T("Error"), MB_OK | MB_ICONERROR);
+
+			SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);
+
+			/* populate the list view with all services */
+			GetServices();
+		}
+		break;
+		case WM_SIZE:
+		{
+			HWND hTool;
+			RECT rcTool;
+			int iToolHeight;
+
+			HWND hStatus;
+			RECT rcStatus;
+			int iStatusHeight;
+
+			HWND hListView;
+			int lvHeight;
+			RECT rcClient;
+
+			/* Size toolbar and get height */
+			hTool = GetDlgItem(hwnd, IDC_TOOLBAR);
+			SendMessage(hTool, TB_AUTOSIZE, 0, 0);
+
+			GetWindowRect(hTool, &rcTool);
+			iToolHeight = rcTool.bottom - rcTool.top;
+
+			/* Size status bar and get height */
+			hStatus = GetDlgItem(hwnd, IDC_STATUSBAR);
+			SendMessage(hStatus, WM_SIZE, 0, 0);
+
+			GetWindowRect(hStatus, &rcStatus);
+			iStatusHeight = rcStatus.bottom - rcStatus.top;
+
+			/* Calculate remaining height and size list view */
+			GetClientRect(hwnd, &rcClient);
+
+			lvHeight = rcClient.bottom - iToolHeight - iStatusHeight;
+
+			hListView = GetDlgItem(hwnd, IDC_SERVLIST);
+			SetWindowPos(hListView, NULL, 0, iToolHeight, rcClient.right, lvHeight, SWP_NOZORDER);
+		}
+		break;
+
+		case WM_NOTIFY:
+            switch (((LPNMHDR) lParam)->code)
+            {
+                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.
+                    idButton = lpttt->hdr.idFrom;
+                    switch (idButton)
+                    {
+                        case ID_PROP:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PROP);
+                        break;
+
+                        case ID_REFRESH:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH);
+                        break;
+
+                        case ID_EXPORT:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXPORT);
+                        break;
+
+                        case ID_START:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_START);
+                        break;
+
+                        case ID_STOP:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_STOP);
+                        break;
+
+                        case ID_PAUSE:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PAUSE);
+                        break;
+
+                        case ID_RESTART:
+                            lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART);
+                        break;
+
+                    }
+                }
+                break;
+
+                // Process other notifications here.
+
+                default:
+                break;
+            }
+        break;
+
+		case WM_CLOSE:
+			DestroyWindow(hwnd);
+		break;
+		case WM_DESTROY:
+			PostQuitMessage(0);
+		break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam))
+			{
+				case ID_FILE_EXIT:
+					PostMessage(hwnd, WM_CLOSE, 0, 0);
+				break;
+
+				case ID_START:
+				break;
+
+                case ID_STOP:
+                break;
+
+                case ID_PAUSE:
+                break;
+
+                case ID_RESUME:
+                break;
+
+                case ID_RESTART:
+                break;
+
+                case ID_REFRESH:
+                break;
+
+                case ID_PROP:
+                break;
+
+                case ID_VIEW_CUSTOMIZE:
+                break;
+
+                case ID_HELP_ABOUT:
+                break;
+
+                case ID_EXPORT:
+                break;
+
+			}
+		break;
+		default:
+			return DefWindowProc(hwnd, msg, wParam, lParam);
+	}
+	return 0;
+}
+
+
+
+int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
+	LPSTR lpCmdLine, int nCmdShow)
+{
+	WNDCLASSEX wc;
+	HWND hwnd;
+	MSG Msg;
+	BOOL bRet;
+
+	hInstance = hThisInstance;
+
+	InitCommonControls();
+
+	wc.cbSize		 = sizeof(WNDCLASSEX);
+	wc.style		 = 0;
+	wc.lpfnWndProc	 = WndProc;
+	wc.cbClsExtra	 = 0;
+	wc.cbWndExtra	 = 0;
+	wc.hInstance	 = hInstance;
+	wc.hIcon		 = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SM_ICON));
+	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
+	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
+	wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINMENU);
+	wc.lpszClassName = ClassName;
+	wc.hIconSm		 = (HICON)LoadImage(GetModuleHandle(NULL),
+                        MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);
+
+	if(!RegisterClassEx(&wc))
+	{
+		MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"),
+			MB_ICONEXCLAMATION | MB_OK);
+		return 0;
+	}
+
+	hwnd = CreateWindowEx(
+		0,
+		ClassName,
+		_T("ReactOS Service Manager"),
+		WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
+		CW_USEDEFAULT, CW_USEDEFAULT, 700, 500,
+		NULL, NULL, hInstance, NULL);
+
+	if(hwnd == NULL)
+	{
+		MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"),
+			MB_ICONEXCLAMATION | MB_OK);
+		return 0;
+	}
+
+	ShowWindow(hwnd, nCmdShow);
+	UpdateWindow(hwnd);
+
+    while( (bRet = GetMessage( &Msg, NULL, 0, 0 )) != 0)
+    {
+        if (bRet == -1)
+        {
+            /* handle the error and possibly exit */
+        }
+        else
+        {
+            TranslateMessage(&Msg);
+            DispatchMessage(&Msg);
+        }
+    }
+	return Msg.wParam;
+}
+
+

Added: trunk/reactos/subsys/system/servman/servman.rc
--- trunk/reactos/subsys/system/servman/servman.rc	2006-01-05 17:52:39 UTC (rev 20585)
+++ trunk/reactos/subsys/system/servman/servman.rc	2006-01-05 18:04:46 UTC (rev 20586)
@@ -0,0 +1,16 @@
+#include <windows.h>
+#include <commctrl.h>
+#include "resource.h"
+
+
+#define REACTOS_STR_FILE_DESCRIPTION	"ReactOS Service Manager\0"
+#define REACTOS_STR_INTERNAL_NAME	"services\0"
+#define REACTOS_STR_ORIGINAL_FILENAME	"services.exe\0"
+#include <reactos/version.rc>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+IDI_SM_ICON ICON "res/applet.ico"
+
+#include "En.rc"
+

Added: trunk/reactos/subsys/system/servman/servman.xml
--- trunk/reactos/subsys/system/servman/servman.xml	2006-01-05 17:52:39 UTC (rev 20585)
+++ trunk/reactos/subsys/system/servman/servman.xml	2006-01-05 18:04:46 UTC (rev 20586)
@@ -0,0 +1,19 @@
+<module name="servman" type="win32gui" installbase="system32" installname="servman.exe">
+	<include base="msconfig">.</include>
+	<define name="UNICODE" />
+	<define name="_UNICODE" />
+	<define name="__REACTOS__" />
+	<define name="__USE_W32API" />
+	<define name="_WIN32_IE">0x600</define>
+	<define name="_WIN32_WINNT">0x501</define>
+	<library>kernel32</library>
+	<library>user32</library>
+	<library>advapi32</library>
+	<library>version</library>
+	<library>comctl32</library>
+	<library>shell32</library>
+	<compilationunit name="unit.c">
+		<file>servman.c</file>
+	</compilationunit>
+	<file>servman.rc</file>
+</module>