-\r
IDR_MAINMENU MENU\r
BEGIN\r
POPUP "&File"\r
BEGIN\r
- MENUITEM "E&xit", ID_EXIT\r
+ MENUITEM "E&xit",ID_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 "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 "Refresh",ID_REFRESH\r
MENUITEM SEPARATOR\r
- MENUITEM "Properties", ID_PROP\r
+ MENUITEM "Properties",ID_PROP\r
END\r
POPUP "View"\r
BEGIN\r
- MENUITEM "Customize", ID_VIEW_CUSTOMIZE\r
+ MENUITEM "Customize",ID_VIEW_CUSTOMIZE\r
END\r
POPUP "Help"\r
BEGIN\r
- MENUITEM "About", ID_ABOUT\r
+ MENUITEM "About",ID_ABOUT\r
END\r
END\r
-\r
-\r
IDR_POPUP MENU\r
BEGIN\r
POPUP "popup"\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 "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
POPUP "All tasks"\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 "Refresh", ID_REFRESH\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 "Refresh",ID_REFRESH\r
END\r
MENUITEM SEPARATOR\r
- MENUITEM "Refresh", ID_REFRESH\r
+ MENUITEM "Refresh",ID_REFRESH\r
MENUITEM SEPARATOR\r
- MENUITEM "Properties", ID_PROP\r
+ MENUITEM "Properties",ID_PROP\r
MENUITEM SEPARATOR\r
- MENUITEM "Help", ID_HELP\r
+ MENUITEM "Help",ID_HELP\r
END\r
END\r
-\r
-\r
-IDD_ABOUTBOX DIALOG DISCARDABLE 22,16,190,182\r
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU\r
+IDD_ABOUTBOX DIALOGEX 22,16,190,182\r
CAPTION "About Service Manager"\r
-FONT 8, "Tahoma"\r
+FONT 8,"Tahoma",0,0\r
+STYLE 0x00C80080\r
BEGIN\r
- CONTROL "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)",\r
- IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,48,7,130,26\r
- DEFPUSHBUTTON "Close",IDOK,75,162,44,15,WS_GROUP\r
- ICON IDI_SM_ICON,IDC_STATIC,12,7,30,20\r
- EDITTEXT IDC_LICENSE_EDIT,8,44,174,107,ES_MULTILINE |\r
- ES_READONLY | WS_VSCROLL\r
+ CONTROL "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)",IDC_STATIC,"Static",WS_VISIBLE|0x0002000C,48,7,130,26\r
+ CONTROL "Close",IDOK,"Button",0x50030001,75,162,44,15\r
+ CONTROL "",IDI_SM_ICON,"Static",0x50000203,0,12,7,30\r
+ CONTROL "",IDC_LICENSE_EDIT,"Edit",0x50210804,8,44,174,107,0x00000200\r
END\r
-\r
-\r
IDD_DLG_GENERAL DIALOGEX 6,6,253,225\r
CAPTION "General"\r
FONT 8,"MS Sans Serif",0,0\r
STYLE 0x10CF0000\r
BEGIN\r
CONTROL "Service name:",IDC_STATIC,"Static",0x50000000,4,11,53,11\r
- CONTROL "Display name:",IDC_STATIC,"Static",0x50000000,4,29,53,11\r
- CONTROL "Description",IDC_STATIC,"Static",0x50000000,4,51,53,11\r
- CONTROL "",IDC_SERV_NAME,"Static",0x50000000,70,11,176,11\r
CONTROL "",IDC_DISP_NAME,"Static",0x50001000,70,29,176,12\r
CONTROL "",IDC_DESCRIPTION,"Static",0x50201000,70,46,176,22\r
- CONTROL "Path to executable:",IDC_STATIC,"Static",0x50000000,6,73,82,9\r
CONTROL "",IDC_EXEPATH,"Static",0x50001000,6,86,238,12\r
- CONTROL "Startup type:",IDC_STATIC,"Static",0x50000000,6,108,53,11\r
CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11\r
- CONTROL "Service status:",IDC_STATIC,"Static",0x50000000,4,138,53,11\r
- CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11\r
CONTROL "Start",IDC_START,"Button",0x50010000,6,155,54,15\r
CONTROL "Stop",IDC_STOP,"Button",0x50010000,68,155,54,15\r
CONTROL "Pause",IDC_PAUSE,"Button",0x50010000,130,155,54,15\r
CONTROL "Resume",IDC_RESUME,"Button",0x50010000,192,155,54,15\r
+ CONTROL "",IDC_START_PARAM,"Static",0x50001000,70,199,176,11\r
+ CONTROL "Display name:",IDC_STATIC,"Static",0x50000000,4,29,53,11\r
+ CONTROL "Description",IDC_STATIC,"Static",0x50000000,4,51,53,11\r
+ CONTROL "",IDC_SERV_NAME,"Static",0x50000000,70,11,176,11\r
+ CONTROL "Path to executable:",IDC_STATIC,"Static",0x50000000,6,73,82,9\r
+ CONTROL "Startup type:",IDC_STATIC,"Static",0x50000000,6,108,53,11\r
+ CONTROL "Service status:",IDC_STATIC,"Static",0x50000000,4,138,53,11\r
+ CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11\r
CONTROL "You can specify the start parameters that apply when you start the service from here.",IDC_STATIC,"Static",0x50000000,6,177,240,15\r
CONTROL "Start parameters",IDC_STATIC,"Static",0x50000000,6,199,53,11\r
- CONTROL "",IDC_START_PARAM,"Static",0x50001000,70,199,176,11\r
END\r
-\r
IDD_DLG_DEPEND DIALOGEX 6,6,253,225\r
CAPTION "Dependencies"\r
FONT 8,"MS Sans Serif",0,0\r
CONTROL "This service depends on the following components",IDC_STATIC,"Static",0x50000000,8,57,236,9\r
CONTROL "",IDC_DEPEND_SERVICE,"Static",0x50000000,8,38,236,13\r
END\r
-\r
-\r
-\r
-IDB_BUTTONS BITMAP "res/toolbar.bmp"\r
-\r
+IDB_BUTTONS BITMAP DISCARDABLE "res/toolbar.bmp"\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
- IDS_FIRSTCOLUMN "Name"\r
+ IDS_FIRSTCOLUMN "Name"\r
IDS_SECONDCOLUMN "Description"\r
- IDS_THIRDCOLUMN "Status"\r
+ IDS_THIRDCOLUMN "Status"\r
IDS_FOURTHCOLUMN "Startup Type"\r
- IDS_FITHCOLUMN "Log On As"\r
+ IDS_FITHCOLUMN "Log On As"\r
END\r
-\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
- IDS_SERVICES_STARTED "Started"\r
- IDS_SERVICES_AUTO "Automatic"\r
- IDS_SERVICES_MAN "Manual"\r
- IDS_SERVICES_DIS "Disabled"\r
+ IDS_SERVICES_STARTED "Started"\r
+ IDS_SERVICES_STOPPED "Stopped"\r
+ IDS_SERVICES_AUTO "Automatic"\r
+ IDS_SERVICES_MAN "Manual"\r
+ IDS_SERVICES_DIS "Disabled"\r
END\r
-\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
IDS_NUM_SERVICES "Num Services: %d"\r
- IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."\r
+ IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have receive"\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
- IDS_TOOLTIP_NEW "Create a service"\r
- IDS_TOOLTIP_HELP "Help"\r
- IDS_TOOLTIP_EXIT "Exit"\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
+ IDS_TOOLTIP_NEW "Create new a service"\r
+ IDS_TOOLTIP_HELP "Help"\r
+ IDS_TOOLTIP_EXIT "Exit"\r
END\r
* FILE: subsys/system/servman/about.c\r
* PURPOSE: About dialog box message handler\r
* COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
- * \r
+ *\r
*/\r
\r
//ShellAbout(hwnd, _T("test"), _T("test2"), MAKEINTRESOURCE(IDI_SM_ICON));\r
BOOL CALLBACK\r
AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
- HWND hLicenseEditWnd;\r
- TCHAR strLicense[0x1000];\r
+ HWND hLicenseEditWnd;\r
+ HICON hIcon = NULL;\r
+ TCHAR strLicense[0x1000];\r
\r
switch (message)\r
{\r
case WM_INITDIALOG:\r
\r
+ hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+ SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);\r
+\r
hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT);\r
\r
LoadString(hInstance, IDS_LICENSE, strLicense, 0x1000);\r
\r
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))\r
{\r
+ DestroyIcon(hIcon);\r
EndDialog(hDlg, LOWORD(wParam));\r
return TRUE;\r
}\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: subsys/system/servman/control\r
+ * PURPOSE: Stops, pauses and resumes a service\r
+ * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HWND hListView;\r
+\r
+\r
+BOOL Control(DWORD Control)\r
+{\r
+ SC_HANDLE hSCManager;\r
+ SC_HANDLE hSc;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ SERVICE_STATUS Status;\r
+ LVITEM item;\r
+\r
+ item.mask = LVIF_PARAM;\r
+ item.iItem = GetSelectedItem();\r
+ SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
+\r
+ /* copy pointer to selected service */\r
+ Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
+\r
+ /* open handle to the SCM */\r
+ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
+ if (hSCManager == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* open handle to the service */\r
+ hSc = OpenService(hSCManager, Service->lpServiceName,\r
+ SERVICE_PAUSE_CONTINUE | SERVICE_STOP);\r
+ if (hSc == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* process requested action */\r
+ if (! ControlService(hSc, Control, &Status))\r
+ {\r
+ GetError(0);\r
+ CloseServiceHandle(hSc);\r
+ return FALSE;\r
+ }\r
+\r
+ CloseServiceHandle(hSc);\r
+\r
+ return TRUE;\r
+\r
+}\r
-\r
+//#include <stdarg>\r
#include "servman.h"\r
/* temp file for debugging */\r
\r
\r
VOID DisplayString(PTCHAR Msg)\r
{\r
+\r
MessageBox(NULL, Msg, _T("Error!"), MB_OK | MB_ICONERROR);\r
\r
}\r
* LICENSE: GPL - See COPYING in the top level directory\r
* FILE: subsys/system/servman/propsheet.c\r
* PURPOSE: Property dialog box message handler\r
- * COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
+ * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
*/\r
\r
extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;\r
extern HINSTANCE hInstance;\r
extern HWND hListView;\r
-extern INT SelectedItem;\r
+extern HWND hMainWnd;\r
\r
\r
typedef struct _PROP_DLG_INFO\r
LPTSTR lpDisplayName;\r
LPTSTR lpDescription;\r
LPTSTR lpPathToExe;\r
- DWORD dwStartupType;\r
- DWORD dwServiceStatus;\r
+ TCHAR szStartupType;\r
+ TCHAR szServiceStatus[25];\r
LPTSTR lpStartParams;\r
} PROP_DLG_INFO, *PPROP_DLG_INFO;\r
\r
\r
+/*\r
+ * Fills the 'startup type' combo box with possible\r
+ * values and sets it to value of the selected item\r
+ */\r
+VOID SetStartupType(HKEY hKey, HWND hwndDlg)\r
+{\r
+ HWND hList;\r
+ TCHAR buf[25];\r
+ DWORD dwValueSize = 0;\r
+ DWORD StartUp = 0;\r
+\r
+ hList = GetDlgItem(hwndDlg, IDC_START_TYPE);\r
+\r
+ LoadString(hInstance, IDS_SERVICES_AUTO, buf, sizeof(buf) / sizeof(TCHAR));\r
+ SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);\r
+ LoadString(hInstance, IDS_SERVICES_MAN, buf, sizeof(buf) / sizeof(TCHAR));\r
+ SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);\r
+ LoadString(hInstance, IDS_SERVICES_DIS, buf, sizeof(buf) / sizeof(TCHAR));\r
+ SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)buf);\r
+\r
+ dwValueSize = sizeof(DWORD);\r
+ if (RegQueryValueEx(hKey,\r
+ _T("Start"),\r
+ NULL,\r
+ NULL,\r
+ (LPBYTE)&StartUp,\r
+ &dwValueSize))\r
+ {\r
+ RegCloseKey(hKey);\r
+ return;\r
+ }\r
+\r
+ if (StartUp == 0x02)\r
+ SendMessage(hList, CB_SETCURSEL, 0, 0);\r
+ else if (StartUp == 0x03)\r
+ SendMessage(hList, CB_SETCURSEL, 1, 0);\r
+ else if (StartUp == 0x04)\r
+ SendMessage(hList, CB_SETCURSEL, 2, 0);\r
+\r
+}\r
\r
\r
+/*\r
+ * Populates the General Properties dialog with\r
+ * the relevant service information\r
+ */\r
VOID GetDlgInfo(HWND hwndDlg)\r
{\r
HKEY hKey;\r
TCHAR buf[300];\r
\r
item.mask = LVIF_PARAM;\r
- item.iItem = SelectedItem;\r
+ item.iItem = GetSelectedItem();\r
SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
\r
/* copy pointer to selected service */\r
DlgInfo.lpServiceName = Service->lpServiceName;\r
SendDlgItemMessageW(hwndDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpServiceName);\r
\r
+\r
/* set the display name */\r
DlgInfo.lpDisplayName = Service->lpDisplayName;\r
SendDlgItemMessageW(hwndDlg, IDC_DISP_NAME, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpDisplayName);\r
\r
+\r
/* set the description */\r
if (GetDescription(hKey, &DlgInfo.lpDescription))\r
SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpDescription);\r
\r
+\r
+ /* FIXME: needs implementing. Use code base at bottom of query.c */\r
/* set the executable path */\r
if (GetExecutablePath(&DlgInfo.lpPathToExe))\r
SendDlgItemMessageW(hwndDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);\r
\r
\r
+ /* set startup type */\r
+ SetStartupType(hKey, hwndDlg);\r
+\r
+\r
+\r
+ /* set service status */\r
+ if (Service->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_STARTED, DlgInfo.szServiceStatus,\r
+ sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));\r
+ SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
+ }\r
+ else\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_STOPPED, DlgInfo.szServiceStatus,\r
+ sizeof(DlgInfo.szServiceStatus) / sizeof(TCHAR));\r
+ SendDlgItemMessageW(hwndDlg, IDC_SERV_STATUS, WM_SETTEXT, 0, (LPARAM)DlgInfo.szServiceStatus);\r
+ }\r
+\r
+\r
\r
\r
}\r
#ifdef _MSC_VER\r
#pragma warning(disable : 4100)\r
#endif\r
-/* Property page dialog callback */\r
+\r
+/*\r
+ * General Property dialog callback.\r
+ * Controls messages to the General dialog\r
+ */\r
+/* FIXME: this may be better as a modeless dialog */\r
INT_PTR CALLBACK\r
GeneralPageProc(HWND hwndDlg,\r
UINT uMsg,\r
\r
\r
\r
-\r
-\r
+/*\r
+ * Dependancies Property dialog callback.\r
+ * Controls messages to the Dependancies dialog\r
+ */\r
+/* FIXME: this may be better as a modeless dialog */\r
INT_PTR CALLBACK\r
DependanciesPageProc(HWND hwndDlg,\r
UINT uMsg,\r
\r
return (LONG)(PropertySheet(&psh) != -1);\r
}\r
+\r
* LICENSE: GPL - See COPYING in the top level directory\r
* FILE: subsys/system/servman/query.c\r
* PURPOSE: Query service information\r
- * COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
+ * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
*/\r
\r
HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
}\r
\r
+\r
/* Retrives the service description from the registry */\r
BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)\r
{\r
}\r
\r
\r
+/* get vendor of service binary */\r
BOOL GetExecutablePath(LPTSTR *ExePath)\r
{\r
+ LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;\r
+ SC_HANDLE hService = NULL;\r
+ LVITEM item;\r
+ WORD wCodePage, wLangID;\r
+ DWORD BytesNeeded = 0, dwHandle, dwLen;\r
+ TCHAR FileName[MAX_PATH];\r
+ LPTSTR lpData;\r
+ LPTSTR lpBuffer;\r
+ TCHAR szStrFileInfo[80];\r
+ LPVOID pvData;\r
+ UINT BufLen;\r
+\r
+\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 FALSE;\r
+\r
+ if (!QueryServiceConfig(hService,\r
+ pServiceConfig,\r
+ BytesNeeded,\r
+ &BytesNeeded))\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
+ return FALSE;\r
+ }\r
+ }\r
+ else /* exit on failure */\r
+ {\r
+ return FALSE;\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
- return FALSE;\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 FALSE;\r
+\r
+ if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {\r
+ HeapFree(GetProcessHeap(), 0, lpData);\r
+ return FALSE;\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
+\r
+ CloseServiceHandle(hService);\r
+\r
+ return TRUE;\r
}\r
\r
\r
+\r
+\r
BOOL\r
RefreshServiceList(VOID)\r
{\r
CloseServiceHandle(hService);\r
}\r
*/\r
+\r
#define IDS_TOOLTIP_EXIT 6009\r
\r
#define IDS_SERVICES_STARTED 5000\r
+#define IDS_SERVICES_STOPPED 5001\r
#define IDS_SERVICES_AUTO 5004\r
#define IDS_SERVICES_MAN 5005\r
#define IDS_SERVICES_DIS 5006\r
* LICENSE: GPL - See COPYING in the top level directory\r
* FILE: subsys/system/servman/servman.c\r
* PURPOSE: Main window message handler\r
- * COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
+ * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
*\r
*/\r
\r
INT SelectedItem;\r
\r
\r
+INT GetSelectedItem(VOID)\r
+{\r
+ return SelectedItem;\r
+}\r
+\r
+\r
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
{\r
switch(msg)\r
break;\r
\r
case ID_START:\r
+ DoStartService();\r
+ RefreshServiceList();\r
break;\r
\r
case ID_STOP:\r
+ Control(SERVICE_CONTROL_STOP);\r
+ RefreshServiceList();\r
break;\r
\r
case ID_PAUSE:\r
+ Control(SERVICE_CONTROL_PAUSE);\r
+ RefreshServiceList();\r
break;\r
\r
case ID_RESUME:\r
+ Control(SERVICE_CONTROL_CONTINUE );\r
+ RefreshServiceList();\r
break;\r
\r
case ID_RESTART:\r
+ Control(SERVICE_CONTROL_STOP);\r
+ DoStartService();\r
+ RefreshServiceList();\r
break;\r
\r
case ID_NEW:\r
}\r
\r
\r
+\r
\r
#define WIN32_LEAN_AND_MEAN\r
#include <windows.h>\r
-#include <windowsx.h>\r
+#include <windowsx.h> /* GET_X/Y_LPARAM */\r
#include <stdio.h>\r
#include <tchar.h>\r
#include <commctrl.h>\r
\r
BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
\r
-BOOL Start(LPCTSTR, LPCTSTR, INT);\r
+BOOL DoStartService(VOID);\r
+BOOL Control(DWORD Control);\r
+\r
+INT GetSelectedItem(VOID);\r
\r
VOID GetError(DWORD);\r
VOID FreeMemory(VOID);\r
<library>shell32</library>\r
<compilationunit name="unit.c">\r
<file>about.c</file>\r
+ <file>control.c</file>\r
<file>geterror.c</file>\r
<file>propsheet.c</file>\r
<file>query.c</file>\r
<file>servman.c</file>\r
+ <file>start.c</file>\r
</compilationunit>\r
<file>servman.rc</file>\r
<pch>servman.h</pch>\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: subsys/system/servman/start.c\r
+ * PURPOSE: Start a service\r
+ * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HWND hListView;\r
+\r
+BOOL DoStartService(VOID)\r
+{\r
+ SC_HANDLE hSCManager;\r
+ SC_HANDLE hSc;\r
+ SERVICE_STATUS_PROCESS ServiceStatus;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ LVITEM item;\r
+ DWORD BytesNeeded;\r
+ INT ArgCount = 0;\r
+ BOOL Loop = 10; //FIXME: testing value. needs better control\r
+\r
+ item.mask = LVIF_PARAM;\r
+ item.iItem = GetSelectedItem();\r
+ SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
+\r
+ /* copy pointer to selected service */\r
+ Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
+\r
+ /* open handle to the SCM */\r
+ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
+ if (hSCManager == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* get a handle to the service requested for starting */\r
+ hSc = OpenService(hSCManager, Service->lpServiceName, SERVICE_ALL_ACCESS);\r
+ if (hSc == NULL)\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* start the service opened */\r
+ if (! StartService(hSc, ArgCount, NULL))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* query the state of the service */\r
+ if (! QueryServiceStatusEx(\r
+ hSc,\r
+ SC_STATUS_PROCESS_INFO,\r
+ (LPBYTE)&ServiceStatus,\r
+ sizeof(SERVICE_STATUS_PROCESS),\r
+ &BytesNeeded))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* loop whilst service is not running */\r
+ /* FIXME: needs more control adding. 'Loop' is temparary */\r
+ while (ServiceStatus.dwCurrentState == SERVICE_START_PENDING || !Loop)\r
+ {\r
+ /* wait before checking status */\r
+ Sleep(ServiceStatus.dwWaitHint);\r
+\r
+ /* check status again */\r
+ if (! QueryServiceStatusEx(\r
+ hSc,\r
+ SC_STATUS_PROCESS_INFO,\r
+ (LPBYTE)&ServiceStatus,\r
+ sizeof(SERVICE_STATUS_PROCESS),\r
+ &BytesNeeded))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+ Loop--;\r
+ }\r
+\r
+ CloseServiceHandle(hSc);\r
+\r
+ if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+\r
+}\r
+\r