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_STATIC,"Static",0x50001000,6,86,238,12\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_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
+STYLE 0x10CF0000\r
+BEGIN\r
+ CONTROL "",IDC_DEPEND_TREE1,"SysTreeView32",0x50010007,8,70,236,68,0x00000200\r
+ CONTROL "",IDC_DEPEND_TREE2,"SysTreeView32",0x50010007,8,151,234,67,0x00000200\r
+ 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\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
STRINGTABLE DISCARDABLE\r
* FILE: subsys/system/servman/propsheet.c\r
* PURPOSE: Property dialog box message handler\r
* COPYRIGHT: Copyright 2005 Ged Murphy <gedmurphy@gmail.com>\r
- * \r
+ *\r
*/\r
\r
#include "servman.h"\r
\r
+extern ENUM_SERVICE_STATUS_PROCESS *pServiceStatus;\r
extern HINSTANCE hInstance;\r
+extern HWND hListView;\r
+extern INT SelectedItem;\r
+\r
+\r
+typedef struct _PROP_DLG_INFO\r
+{\r
+ LPTSTR lpServiceName;\r
+ LPTSTR lpDisplayName;\r
+ LPTSTR lpDescription;\r
+ LPTSTR lpPathToExe;\r
+ DWORD dwStartupType;\r
+ DWORD dwServiceStatus;\r
+ LPTSTR lpStartParams;\r
+} PROP_DLG_INFO, *PPROP_DLG_INFO;\r
+\r
+\r
+\r
+\r
+VOID GetDlgInfo(HWND hwndDlg)\r
+{\r
+ HKEY hKey;\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ LVITEM item;\r
+ PROP_DLG_INFO DlgInfo;\r
+ LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
+ TCHAR buf[300];\r
+\r
+ item.mask = LVIF_PARAM;\r
+ item.iItem = SelectedItem;\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 the registry key for the service */\r
+ _sntprintf(buf, 300, Path, Service->lpServiceName);\r
+ RegOpenKeyEx(HKEY_LOCAL_MACHINE,\r
+ buf,\r
+ 0,\r
+ KEY_READ,\r
+ &hKey);\r
+\r
+ /* set the service name */\r
+ DlgInfo.lpServiceName = Service->lpServiceName;\r
+ SendDlgItemMessageW(hwndDlg, IDC_SERV_NAME, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpServiceName);\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
+ /* set the description */\r
+ if (GetDescription(hKey, &DlgInfo.lpDescription))\r
+ SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpDescription);\r
+\r
+ /* set the executable path */\r
+ if (GetExecutablePath(&DlgInfo.lpPathToExe))\r
+ SendDlgItemMessageW(hwndDlg, IDC_EXEPATH, WM_SETTEXT, 0, (LPARAM)DlgInfo.lpPathToExe);\r
+\r
+\r
+\r
+\r
+}\r
+\r
\r
#ifdef _MSC_VER\r
#pragma warning(disable : 4100)\r
switch (uMsg)\r
{\r
case WM_INITDIALOG:\r
+ GetDlgInfo(hwndDlg);\r
\r
break;\r
\r
\r
\r
\r
+\r
+\r
+INT_PTR CALLBACK\r
+DependanciesPageProc(HWND hwndDlg,\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam)\r
+{\r
+\r
+ switch (uMsg)\r
+ {\r
+ case WM_INITDIALOG:\r
+\r
+ break;\r
+\r
+ case WM_COMMAND:\r
+ switch(LOWORD(wParam))\r
+ {\r
+ case IDC_START:\r
+ break;\r
+\r
+ case IDC_STOP:\r
+\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case WM_DESTROY:\r
+ break;\r
+\r
+ case WM_NOTIFY:\r
+ {\r
+ LPNMHDR lpnm = (LPNMHDR)lParam;\r
+\r
+ switch (lpnm->code)\r
+\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+\r
static VOID\r
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)\r
{\r
\r
\r
LONG APIENTRY\r
-PropSheets(HWND hwnd)\r
+OpenPropSheet(HWND hwnd)\r
{\r
PROPSHEETHEADER psh;\r
- PROPSHEETPAGE psp[1];\r
+ PROPSHEETPAGE psp[2];\r
TCHAR Caption[256];\r
\r
LoadString(hInstance, IDS_PROP_SHEET, Caption, sizeof(Caption) / sizeof(TCHAR));\r
psh.ppsp = psp;\r
\r
InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc);\r
- //logon\r
- //recovery\r
- //dependancies\r
+ //InitPropSheetPage(&psp[1], IDD_DLG_GENERAL, LogonPageProc);\r
+ //InitPropSheetPage(&psp[2], IDD_DLG_GENERAL, RecoveryPageProc);\r
+ InitPropSheetPage(&psp[1], IDD_DLG_DEPEND, DependanciesPageProc);\r
+\r
\r
return (LONG)(PropertySheet(&psh) != -1);\r
}\r
extern HWND hListView;\r
extern HWND hStatus;\r
\r
-/* Stores the service array */\r
+/* Stores the complete services array */\r
ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;\r
\r
\r
-/* free service array */\r
+/* Free service array */\r
VOID FreeMemory(VOID)\r
{\r
HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
}\r
\r
-VOID GetData(VOID)\r
+/* Retrives the service description from the registry */\r
+BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)\r
{\r
- LVITEM item;\r
- UINT sel;\r
- TCHAR buf[200];\r
\r
- sel = ListView_GetHotItem(hListView);\r
+ LPTSTR Description = NULL;\r
+ DWORD dwValueSize = 0;\r
+ LONG ret = RegQueryValueEx(hKey,\r
+ _T("Description"),\r
+ NULL,\r
+ NULL,\r
+ NULL,\r
+ &dwValueSize);\r
+ if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)\r
+ {\r
+ RegCloseKey(hKey);\r
+ return FALSE;\r
+ }\r
+\r
+ if (ret != ERROR_FILE_NOT_FOUND)\r
+ {\r
+ Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);\r
+ if (Description == NULL)\r
+ {\r
+ RegCloseKey(hKey);\r
+ return FALSE;\r
+ }\r
+\r
+ if(RegQueryValueEx(hKey,\r
+ _T("Description"),\r
+ NULL,\r
+ NULL,\r
+ (LPBYTE)Description,\r
+ &dwValueSize))\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, Description);\r
+ RegCloseKey(hKey);\r
+ return FALSE;\r
+ }\r
+ }\r
\r
- ZeroMemory(&item, sizeof(LV_ITEM));\r
+ /* copy pointer over */\r
+ *retDescription = Description;\r
\r
- item.mask = LVIF_TEXT;\r
- item.iItem = sel;\r
- item.iSubItem = 0;\r
- item.pszText = buf;\r
- item.cchTextMax = 200;\r
+ return TRUE;\r
+}\r
\r
- ListView_GetItem(hListView, &item);\r
\r
+BOOL GetExecutablePath(LPTSTR *ExePath)\r
+{\r
\r
- //DisplayString(sel);\r
- DisplayString(item.pszText);\r
+ return FALSE;\r
}\r
\r
\r
/* assign the image to the list view */\r
ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);\r
\r
-\r
for (Index = 0; Index < NumServices; Index++)\r
{\r
HKEY hKey = NULL;\r
LPTSTR Description = NULL;\r
- LONG ret;\r
LPTSTR LogOnAs = NULL;\r
DWORD StartUp = 0;\r
DWORD dwValueSize;\r
\r
/* set the display name */\r
\r
- ZeroMemory(&item, sizeof(LV_ITEM));\r
- item.mask = LVIF_TEXT;\r
+ ZeroMemory(&item, sizeof(LVITEM));\r
+ item.mask = LVIF_TEXT | LVIF_PARAM;\r
item.pszText = pServiceStatus[Index].lpDisplayName;\r
+\r
+ /* Set a pointer for each service so we can query it later.\r
+ * Not all services are added to the list, so we can't query\r
+ * the item number as they become out of sync with the array */\r
+ item.lParam = (LPARAM)&pServiceStatus[Index];\r
+\r
item.iItem = ListView_GetItemCount(hListView);\r
item.iItem = ListView_InsertItem(hListView, &item);\r
\r
\r
\r
+\r
/* set the description */\r
- dwValueSize = 0;\r
- ret = RegQueryValueEx(hKey,\r
- _T("Description"),\r
- NULL,\r
- NULL,\r
- NULL,\r
- &dwValueSize);\r
- if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)\r
- {\r
- RegCloseKey(hKey);\r
- continue;\r
- }\r
\r
- if (ret != ERROR_FILE_NOT_FOUND)\r
+ if (GetDescription(hKey, &Description))\r
{\r
- Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize);\r
- if (Description == NULL)\r
- {\r
- RegCloseKey(hKey);\r
- return FALSE;\r
- }\r
- if(RegQueryValueEx(hKey,\r
- _T("Description"),\r
- NULL,\r
- NULL,\r
- (LPBYTE)Description,\r
- &dwValueSize))\r
- {\r
- HeapFree(GetProcessHeap(), 0, Description);\r
- RegCloseKey(hKey);\r
- continue;\r
- }\r
-\r
item.pszText = Description;\r
item.iSubItem = 1;\r
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
}\r
\r
\r
-\r
/* set the status */\r
\r
if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)\r
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);\r
}\r
\r
+ /* turn redraw flag on. It's turned off initially via the LBS_NOREDRAW flag */\r
+ SendMessage (hListView, WM_SETREDRAW, TRUE, 0) ;\r
+\r
return TRUE;\r
}\r
\r
#define ID_VIEW_CUSTOMIZE 4021\r
#define ID_ABOUT 4031\r
\r
+/* List view columns */\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
+/* tooltips */\r
#define IDS_TOOLTIP_PROP 6000\r
#define IDS_TOOLTIP_REFRESH 6001\r
#define IDS_TOOLTIP_EXPORT 6002\r
#define IDI_SM_ICON 50\r
#define IDB_BUTTONS 51\r
\r
+/* toolbar buttons */\r
#define TBICON_PROP 0\r
#define TBICON_REFRESH 1\r
#define TBICON_EXPORT 2\r
#define TBICON_HELP 8\r
#define TBICON_EXIT 9\r
\r
+/* properties dialog */\r
#define IDS_PROP_SHEET 10000\r
#define IDD_DLG_GENERAL 10001\r
#define IDC_SERV_NAME 10041\r
#define IDC_DISP_NAME 10051\r
#define IDC_DESCRIPTION 10061\r
+#define IDC_EXEPATH 10062\r
#define IDC_START_TYPE 10101\r
#define IDC_SERV_STATUS 10121\r
#define IDC_START 10131\r
#define IDC_PAUSE 10151\r
#define IDC_RESUME 10161\r
#define IDC_START_PARAM 10191\r
+\r
+#define IDD_DLG_DEPEND 20001\r
+#define IDC_DEPEND_TREE1 20002\r
+#define IDC_DEPEND_TREE2 20003\r
+#define IDC_DEPEND_SERVICE 20004\r
+\r
HWND hStatus;\r
HWND hTool;\r
HMENU hShortcutMenu;\r
+INT SelectedItem;\r
\r
\r
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
\r
/* ======================== Create List View ============================== */\r
\r
- hListView = CreateWindow(WC_LISTVIEW,\r
- NULL,\r
- WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |\r
- LVS_EDITLABELS | LVS_SORTASCENDING,\r
- 0, 0, 0, 0, /* sized via WM_SIZE */\r
- hwnd,\r
- (HMENU) IDC_SERVLIST,\r
- hInstance,\r
- NULL);\r
+ hListView = CreateWindowEx(0,\r
+ WC_LISTVIEW,\r
+ NULL,\r
+ WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |\r
+ LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,\r
+ 0, 0, 0, 0, /* sized via WM_SIZE */\r
+ hwnd,\r
+ (HMENU) IDC_SERVLIST,\r
+ hInstance,\r
+ NULL);\r
if (hListView == NULL)\r
MessageBox(hwnd, _T("Could not create List View."), _T("Error"), MB_OK | MB_ICONERROR);\r
\r
\r
case WM_NOTIFY:\r
{\r
- LPNMITEMACTIVATE item;\r
+ NMHDR* nm = (NMHDR*) lParam;\r
\r
-\r
- switch (((LPNMHDR) lParam)->code)\r
+ switch (nm->code)\r
{\r
case NM_DBLCLK:\r
- item = (LPNMITEMACTIVATE) lParam;\r
- PropSheets(hwnd);\r
+ OpenPropSheet(hwnd);\r
+ break;\r
+\r
+ case LVN_ITEMCHANGED:\r
+ {\r
+ LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;\r
+\r
+ SelectedItem = pnmv->iItem;\r
+\r
+ }\r
break;\r
\r
case TTN_GETDISPINFO:\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
}\r
break;\r
\r
- case WM_CLOSE:\r
- FreeMemory(); /* free the service array */\r
- DestroyMenu(hShortcutMenu);\r
- DestroyWindow(hwnd);\r
- break;\r
-\r
- case WM_DESTROY:\r
- PostQuitMessage(0);\r
- break;\r
-\r
case WM_CONTEXTMENU:\r
{\r
int xPos, yPos;\r
break;\r
\r
case WM_COMMAND:\r
+\r
switch(LOWORD(wParam))\r
{\r
case ID_PROP:\r
- PropSheets(hwnd);\r
+ OpenPropSheet(hwnd);\r
break;\r
\r
case ID_REFRESH:\r
}\r
break;\r
\r
+ case WM_CLOSE:\r
+ FreeMemory(); /* free the service array */\r
+ DestroyMenu(hShortcutMenu);\r
+ DestroyWindow(hwnd);\r
+ break;\r
+\r
+ case WM_DESTROY:\r
+ PostQuitMessage(0);\r
+ break;\r
+\r
default:\r
return DefWindowProc(hwnd, msg, wParam, lParam);\r
}\r
\r
BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
\r
-BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount);\r
+BOOL Start(LPCTSTR, LPCTSTR, INT);\r
\r
VOID GetError(DWORD);\r
VOID FreeMemory(VOID);\r
VOID DisplayString(PTCHAR);\r
\r
-VOID GetData(VOID);\r
+BOOL GetDescription(HKEY, LPTSTR *);\r
+BOOL GetExecutablePath(LPTSTR *);\r
\r
-LONG APIENTRY PropSheets(HWND hwnd);\r
+LONG APIENTRY OpenPropSheet(HWND);\r
\r
DWORD GetServiceList(VOID);\r
\r