- Added the properties dialog - Add an about dialog - Split up the query code to make it more usable - Call description from the registry - Many other code mods Modified: trunk/reactos/subsys/system/servman/En.rc Added: trunk/reactos/subsys/system/servman/about.c Added: trunk/reactos/subsys/system/servman/geterror.c Added: trunk/reactos/subsys/system/servman/propsheet.c Added: trunk/reactos/subsys/system/servman/query.c Modified: trunk/reactos/subsys/system/servman/resource.h Modified: trunk/reactos/subsys/system/servman/servman.c Added: trunk/reactos/subsys/system/servman/servman.h Modified: trunk/reactos/subsys/system/servman/servman.rc Modified: trunk/reactos/subsys/system/servman/servman.xml _____
Modified: trunk/reactos/subsys/system/servman/En.rc --- trunk/reactos/subsys/system/servman/En.rc 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/En.rc 2006-01-06 18:28:27 UTC (rev 20616) @@ -27,6 +27,46 @@
END END
+IDD_ABOUTBOX DIALOG DISCARDABLE 22,16,190,182 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "About Service Manager" +FONT 8, "Tahoma" +BEGIN + CONTROL "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", + IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,48,7,130,26 + DEFPUSHBUTTON "Close",IDOK,140,162,44,15,WS_GROUP + ICON IDI_SM_ICON,IDC_STATIC,12,7,30,20 + EDITTEXT IDC_LICENSE_EDIT,8,44,174,107,ES_MULTILINE | + ES_READONLY | WS_VSCROLL +END + + +IDD_DLG_GENERAL DIALOGEX 6,6,253,225 +CAPTION "General" +FONT 8,"MS Sans Serif",0,0 +STYLE 0x10CF0000 +BEGIN + CONTROL "Service name:",IDC_STATIC,"Static",0x50000000,4,11,53,11 + CONTROL "Display name:",IDC_STATIC,"Static",0x50000000,4,29,53,11 + CONTROL "Description",IDC_STATIC,"Static",0x50000000,4,51,53,11 + CONTROL "",IDC_SERV_NAME,"Static",0x50000000,70,11,176,11 + CONTROL "",IDC_DISP_NAME,"Static",0x50001000,70,29,176,12 + CONTROL "",IDC_DESCRIPTION,"Static",0x50201000,70,46,176,22 + CONTROL "Path to executable:",IDC_STATIC,"Static",0x50000000,6,73,82,9 + CONTROL "",IDC_STATIC,"Static",0x50001000,6,86,238,12 + CONTROL "Startup type:",IDC_STATIC,"Static",0x50000000,6,108,53,11 + CONTROL "",IDC_START_TYPE,"ComboBox",0x50010003,70,107,176,11 + CONTROL "Service status:",IDC_STATIC,"Static",0x50000000,4,138,53,11 + CONTROL "",IDC_SERV_STATUS,"Static",0x50000000,70,138,176,11 + CONTROL "Start",IDC_START,"Button",0x50010000,6,155,54,15 + CONTROL "Stop",IDC_STOP,"Button",0x50010000,68,155,54,15 + CONTROL "Pause",IDC_PAUSE,"Button",0x50010000,130,155,54,15 + CONTROL "Resume",IDC_RESUME,"Button",0x50010000,192,155,54,15 + CONTROL "You can specify the start parameters that apply when you start the service from here.",IDC_STATIC,"Static",0x50000000,6,177,240,15 + CONTROL "Start parameters",IDC_STATIC,"Static",0x50000000,6,199,53,11 + CONTROL "",IDC_START_PARAM,"Static",0x50001000,70,199,176,11 +END + STRINGTABLE DISCARDABLE BEGIN IDS_FIRSTCOLUMN "Name" @@ -48,6 +88,20 @@ BEGIN IDS_SERVICES_NUM_SERVICES "Num Services: %d" IDB_START "res/start.bmp" + IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." + /*"This program is free software; you can redistribute it " + "and/or modify it under the terms of the GNU Lesser General " + "Public License as published by the Free Software Foundation; " + "either version 2.1 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., 59 Temple Place - Suite " + "330, Boston, MA 02111-1307, USA." */ + END
STRINGTABLE DISCARDABLE _____
Added: trunk/reactos/subsys/system/servman/about.c --- trunk/reactos/subsys/system/servman/about.c 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/about.c 2006-01-06 18:28:27 UTC (rev 20616) @@ -0,0 +1,35 @@
+#include "servman.h" + +extern HINSTANCE hInstance; + +BOOL CALLBACK +AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND hLicenseEditWnd; + TCHAR strLicense[0x1000]; + + switch (message) + { + case WM_INITDIALOG: + + hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT); + + LoadString(hInstance, IDS_LICENSE, strLicense, 0x1000); + + SetWindowText(hLicenseEditWnd, strLicense); + + return TRUE; + + case WM_COMMAND: + + if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + + break; + } + + return 0; +} _____
Added: trunk/reactos/subsys/system/servman/geterror.c --- trunk/reactos/subsys/system/servman/geterror.c 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/geterror.c 2006-01-06 18:28:27 UTC (rev 20616) @@ -0,0 +1,28 @@
+#include "servman.h" +/* temp file for debugging */ + +VOID GetError(VOID) +{ + LPVOID lpMsgBuf; + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + (LPTSTR) &lpMsgBuf, + 0, + NULL ); + + MessageBox(NULL, lpMsgBuf, _T("Error!"), MB_OK | MB_ICONERROR); + + LocalFree(lpMsgBuf); +} + + +VOID DisplayString(PTCHAR Msg) +{ + MessageBox(NULL, Msg, _T("Error!"), MB_OK | MB_ICONERROR); + +} _____
Added: trunk/reactos/subsys/system/servman/propsheet.c --- trunk/reactos/subsys/system/servman/propsheet.c 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/propsheet.c 2006-01-06 18:28:27 UTC (rev 20616) @@ -0,0 +1,90 @@
+#include "servman.h" + +extern HINSTANCE hInstance; + + +/* Property page dialog callback */ +INT_PTR CALLBACK +GeneralPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + + switch (uMsg) + { + case WM_INITDIALOG: + + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_START: + break; + + case IDC_STOP: + + break; + } + break; + + case WM_DESTROY: + break; + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + + default: + break; + } + break; + } + + return FALSE; +} + + + +static VOID +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) +{ + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hInstance; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; +} + + +LONG APIENTRY +PropSheets(HWND hwnd) +{ + PROPSHEETHEADER psh; + PROPSHEETPAGE psp[1]; + TCHAR Caption[256]; + + LoadString(hInstance, IDS_PROP_SHEET, Caption, sizeof(Caption) / sizeof(TCHAR)); + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; + psh.hwndParent = NULL; + psh.hInstance = hInstance; + psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON)); + psh.pszCaption = Caption; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = 0; + psh.ppsp = psp; + + InitPropSheetPage(&psp[0], IDD_DLG_GENERAL, GeneralPageProc); + //logon + //recovery + //dependancies + + return (LONG)(PropertySheet(&psh) != -1); +} _____
Added: trunk/reactos/subsys/system/servman/query.c --- trunk/reactos/subsys/system/servman/query.c 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/query.c 2006-01-06 18:28:27 UTC (rev 20616) @@ -0,0 +1,328 @@
+#include "servman.h" + +extern HINSTANCE hInstance; +extern HWND hListView; +extern HWND hStatus; + +/* Stores the service array */ +ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL; + + +/* free service array */ +VOID FreeMemory(VOID) +{ + HeapFree(GetProcessHeap(), 0, pServiceStatus); +} + + +BOOL +RefreshServiceList(VOID) +{ + LV_ITEM item; + TCHAR szNumServices[32]; + TCHAR szStatus[128]; + DWORD NumServices = 0; + DWORD Index; + + NumServices = GetServiceList(); + + 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 = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0); + ImageList_AddIcon(hSmall, 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++) + { + HKEY hKey = NULL; + TCHAR Description[5000]; + DWORD Size = 5000; + + /* set the display name */ + + ZeroMemory(&item, 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); + + + /* set the description */ + + _stprintf(buf, _T("System\CurrentControlSet\Services\%s"), + pServiceStatus[Index].lpServiceName); + + if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, + buf, + 0, + KEY_READ, + &hKey) != ERROR_SUCCESS) + { + GetError(); + return FALSE; + } + + RegQueryValueEx(hKey, + _T("Description"), + NULL, + NULL, + (LPBYTE)Description, + &Size); + + item.pszText = Description; + item.iSubItem = 1; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + + + /* set the status */ + + 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); + } + } + } + + return TRUE; +} + + + + +DWORD +GetServiceList(VOID) +{ + SC_HANDLE ScHandle; + + DWORD BytesNeeded = 0; + DWORD ResumeHandle = 0; + DWORD NumServices = 0; + + 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 FALSE; + + /* 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 FALSE; + } + } + else /* exit on failure */ + { + return FALSE; + } + } + } + + CloseServiceHandle(ScHandle); + + return NumServices; +} + + + + + + + + + + + +/* + //WORD wCodePage; + //WORD wLangID; + //SC_HANDLE hService; + //DWORD dwHandle, dwLen; + //UINT BufLen; + //TCHAR* lpData; + //TCHAR* lpBuffer; + //TCHAR szStrFileInfo[80]; + //TCHAR FileName[MAX_PATH]; + //LPVOID pvData; + + //LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL; + //LPQUERY_SERVICE_CONFIG pServiceConfig = NULL; + + 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 FALSE; + + if (!QueryServiceConfig2(hService, + SERVICE_CONFIG_FAILURE_ACTIONS, + (LPBYTE)pServiceFailureActions, + BytesNeeded, + &BytesNeeded)) + { + HeapFree(GetProcessHeap(), 0, pServiceFailureActions); + return FALSE; + } + } + else / * exit on failure * / + { + return FALSE; + } + } + 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 FALSE; + + if (!QueryServiceConfig(hService, + pServiceConfig, + BytesNeeded, + &BytesNeeded)) + { + HeapFree(GetProcessHeap(), 0, pServiceConfig); + return FALSE; + } + } + else / * exit on failure * / + { + return FALSE; + } + } + + 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 FALSE; + + if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) { + HeapFree(GetProcessHeap(), 0, lpData); + return FALSE; + } + + 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); + } +*/ _____
Modified: trunk/reactos/subsys/system/servman/resource.h --- trunk/reactos/subsys/system/servman/resource.h 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/resource.h 2006-01-06 18:28:27 UTC (rev 20616) @@ -1,5 +1,10 @@
#define IDC_STATIC -1
+/* about box info */ +#define IDD_ABOUTBOX 200 +#define IDC_LICENSE_EDIT 201 +#define IDS_LICENSE 202 + #define IDC_SERVLIST 1000 #define IDC_TOOLBAR 1001 #define IDC_STATUSBAR 1002 @@ -42,3 +47,19 @@
#define IDB_START 50 #define IDI_SM_ICON 51 + + + + +#define IDS_PROP_SHEET 10000 +#define IDD_DLG_GENERAL 10001 +#define IDC_SERV_NAME 10041 +#define IDC_DISP_NAME 10051 +#define IDC_DESCRIPTION 10061 +#define IDC_START_TYPE 10101 +#define IDC_SERV_STATUS 10121 +#define IDC_START 10131 +#define IDC_STOP 10141 +#define IDC_PAUSE 10151 +#define IDC_RESUME 10161 +#define IDC_START_PARAM 10191 _____
Modified: trunk/reactos/subsys/system/servman/servman.c --- trunk/reactos/subsys/system/servman/servman.c 2006-01-06 17:46:36 UTC (rev 20615) +++ trunk/reactos/subsys/system/servman/servman.c 2006-01-06 18:28:27 UTC (rev 20616) @@ -1,270 +1,14 @@
-#include <windows.h> -#include <stdio.h> -#include <tchar.h> -#include <commctrl.h> -#include "resource.h" +#include "servman.h"
+ const TCHAR ClassName[] = _T("ServiceManager");
HINSTANCE hInstance; +HWND hMainWnd; 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 = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0); - ImageList_AddIcon(hSmall, 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) @@ -285,7 +29,6 @@ LVCOLUMN lvc = { 0 }; //LVITEM lv = { 0 };
- //GetClientRect(hwnd, &rc); hListView = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS, @@ -309,13 +52,13 @@ ListView_InsertColumn(hListView, 0, &lvc);
lvc.iSubItem = 1; - lvc.cx = 150; + lvc.cx = 260; LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256); lvc.pszText = szTemp; ListView_InsertColumn(hListView, 1, &lvc);
lvc.iSubItem = 2; - lvc.cx = 80; + lvc.cx = 75; LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256); lvc.pszText = szTemp; ListView_InsertColumn(hListView, 2, &lvc); @@ -332,7 +75,7 @@ lvc.pszText = szTemp; ListView_InsertColumn(hListView, 4, &lvc);
- // Create Toolbar + /* Create Toolbar */ hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, @@ -396,12 +139,14 @@ hInstance, NULL); if(hStatus == NULL) - MessageBox(hwnd, _T("Could not create status bar."), _T("Error"), MB_OK | MB_ICONERROR); + 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(); + if (! RefreshServiceList() ) + GetError(); } break; case WM_SIZE: @@ -410,11 +155,11 @@ RECT rcTool; int iToolHeight;
- HWND hStatus; + //HWND hStatus; RECT rcStatus; int iStatusHeight;
- HWND hListView; + //HWND hListView; int lvHeight; RECT rcClient;
@@ -490,14 +235,14 @@ } break;
- // Process other notifications here. - default: break; } break;
case WM_CLOSE: + /* free the service array */ + FreeMemory(); DestroyWindow(hwnd); break; case WM_DESTROY: @@ -529,13 +274,18 @@ break;
case ID_PROP: + PropSheets(hwnd); break;
case ID_VIEW_CUSTOMIZE: break;
case ID_HELP_ABOUT: - break; + DialogBox(GetModuleHandle(NULL), + MAKEINTRESOURCE(IDD_ABOUTBOX), + hwnd, + AboutDialogProc); + break;
case ID_EXPORT: break; @@ -554,7 +304,6 @@ LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; - HWND hwnd; MSG Msg; BOOL bRet;
@@ -568,7 +317,7 @@ wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; - wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SM_ICON)); [truncated at 1000 lines; 91 more skipped]