list services with EnumServicesStatusEx instead of reading them from
registry
Modified: trunk/reactos/subsys/system/msconfig/De.rc
Modified: trunk/reactos/subsys/system/msconfig/En.rc
Modified: trunk/reactos/subsys/system/msconfig/resource.h
Modified: trunk/reactos/subsys/system/msconfig/srvpage.c
_____
Modified: trunk/reactos/subsys/system/msconfig/De.rc
--- trunk/reactos/subsys/system/msconfig/De.rc 2005-11-10 23:02:14 UTC
(rev 19127)
+++ trunk/reactos/subsys/system/msconfig/De.rc 2005-11-11 01:05:23 UTC
(rev 19128)
@@ -50,6 +50,7 @@
STRINGTABLE DISCARDABLE
BEGIN
IDS_SERVICES_COLUMN_SERVICE "Dienst"
+ IDS_SERVICES_COLUMN_REQ "Erforderlich"
IDS_SERVICES_COLUMN_VENDOR "Hersteller"
IDS_SERVICES_COLUMN_STATUS "Status"
END
@@ -81,3 +82,12 @@
IDS_STARTUP_COLUMN_CMD "Befehl"
IDS_STARTUP_COLUMN_PATH "Pfad"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_SERVICES_STATUS_RUNNING "Gestartet"
+ IDS_SERVICES_STATUS_STOPPED "Beendet"
+ IDS_YES "Ja"
+ IDS_NO "Nein"
+END
+
_____
Modified: trunk/reactos/subsys/system/msconfig/En.rc
--- trunk/reactos/subsys/system/msconfig/En.rc 2005-11-10 23:02:14 UTC
(rev 19127)
+++ trunk/reactos/subsys/system/msconfig/En.rc 2005-11-11 01:05:23 UTC
(rev 19128)
@@ -50,6 +50,7 @@
STRINGTABLE DISCARDABLE
BEGIN
IDS_SERVICES_COLUMN_SERVICE "Service"
+ IDS_SERVICES_COLUMN_REQ "Required"
IDS_SERVICES_COLUMN_VENDOR "Vendor"
IDS_SERVICES_COLUMN_STATUS "Status"
END
@@ -80,3 +81,11 @@
IDS_STARTUP_COLUMN_CMD "Command"
IDS_STARTUP_COLUMN_PATH "Path"
END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_SERVICES_STATUS_RUNNING "Running"
+ IDS_SERVICES_STATUS_STOPPED "Stopped"
+ IDS_YES "Yes"
+ IDS_NO "No"
+END
_____
Modified: trunk/reactos/subsys/system/msconfig/resource.h
--- trunk/reactos/subsys/system/msconfig/resource.h 2005-11-10
23:02:14 UTC (rev 19127)
+++ trunk/reactos/subsys/system/msconfig/resource.h 2005-11-11
01:05:23 UTC (rev 19128)
@@ -23,11 +23,12 @@
#define IDS_TOOLS_COLUMN_NAME 2010
#define IDS_TOOLS_COLUMN_DESCR 2011
#define IDS_SERVICES_COLUMN_SERVICE 2012
-#define IDS_SERVICES_COLUMN_VENDOR 2013
-#define IDS_SERVICES_COLUMN_STATUS 2014
-#define IDS_STARTUP_COLUMN_ELEMENT 2015
-#define IDS_STARTUP_COLUMN_CMD 2016
-#define IDS_STARTUP_COLUMN_PATH 2017
+#define IDS_SERVICES_COLUMN_REQ 2013
+#define IDS_SERVICES_COLUMN_VENDOR 2014
+#define IDS_SERVICES_COLUMN_STATUS 2015
+#define IDS_STARTUP_COLUMN_ELEMENT 2016
+#define IDS_STARTUP_COLUMN_CMD 2017
+#define IDS_STARTUP_COLUMN_PATH 2018
#define IDS_TOOLS_CMD_NAME 2100
#define IDS_TOOLS_CMD_DESCR 2101
@@ -49,4 +50,8 @@
#define IDS_TOOLS_SYSDM_CMD 2114
#define IDS_TOOLS_SYSDM_PARAM 2115
+#define IDS_SERVICES_STATUS_STOPPED 2200
+#define IDS_SERVICES_STATUS_RUNNING 2201
+#define IDS_YES 2202
+#define IDS_NO 2203
/* EOF */
_____
Modified: trunk/reactos/subsys/system/msconfig/srvpage.c
--- trunk/reactos/subsys/system/msconfig/srvpage.c 2005-11-10
23:02:14 UTC (rev 19127)
+++ trunk/reactos/subsys/system/msconfig/srvpage.c 2005-11-11
01:05:23 UTC (rev 19128)
@@ -34,16 +34,22 @@
ListView_InsertColumn(hServicesListCtrl, 0, &column);
column.mask = LVCF_TEXT | LVCF_WIDTH;
+ LoadString(hInst, IDS_SERVICES_COLUMN_REQ, szTemp, 256);
+ column.pszText = szTemp;
+ column.cx = 70;
+ ListView_InsertColumn(hServicesListCtrl, 1, &column);
+
+ column.mask = LVCF_TEXT | LVCF_WIDTH;
LoadString(hInst, IDS_SERVICES_COLUMN_VENDOR, szTemp, 256);
column.pszText = szTemp;
column.cx = 200;
- ListView_InsertColumn(hServicesListCtrl, 1, &column);
+ ListView_InsertColumn(hServicesListCtrl, 2, &column);
column.mask = LVCF_TEXT | LVCF_WIDTH;
LoadString(hInst, IDS_SERVICES_COLUMN_STATUS, szTemp, 256);
column.pszText = szTemp;
column.cx = 70;
- ListView_InsertColumn(hServicesListCtrl, 2, &column);
+ ListView_InsertColumn(hServicesListCtrl, 3, &column);
GetServices();
return TRUE;
@@ -55,50 +61,79 @@
void
GetServices ( void )
{
- HKEY hKey, hSubKey;
- DWORD dwSubKeys, dwKeyLength;
- DWORD dwType, dwDataLength;
+ LV_ITEM item;
+ SC_HANDLE ScHandle;
+ DWORD BufSize = 0;
+ DWORD BytesNeeded = 0;
+ DWORD ResumeHandle = 0;
+ DWORD NumServices = 0;
size_t Index;
- TCHAR lpKeyName[MAX_KEY_LENGTH];
- TCHAR lpSubKey[MAX_KEY_LENGTH];
- TCHAR DisplayName[MAX_VALUE_NAME];
- TCHAR ObjectName[MAX_VALUE_NAME];
- TCHAR lpServicesKey[MAX_KEY_LENGTH] =
_T("SYSTEM\\CurrentControlSet\\Services");
- LV_ITEM item;
+ TCHAR szStatus[128];
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpServicesKey, 0, KEY_READ,
&hKey) == ERROR_SUCCESS)
+ ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
+
+ ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
+ if (ScHandle != INVALID_HANDLE_VALUE)
{
- if (RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, NULL,
NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ if (EnumServicesStatusEx(ScHandle, SC_ENUM_PROCESS_INFO,
SERVICE_WIN32, SERVICE_STATE_ALL, (LPBYTE)pServiceStatus, BufSize,
&BytesNeeded, &NumServices, &ResumeHandle, 0) == 0)
{
- for (Index = 0; Index < dwSubKeys; Index++)
- {
- dwKeyLength = MAX_KEY_LENGTH;
- if (RegEnumKeyEx(hKey, Index, lpKeyName, &dwKeyLength,
NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ /* 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)
{
- _tcscpy(lpSubKey, lpServicesKey);
- _tcscat(lpSubKey, _T("\\"));
- _tcscat(lpSubKey, lpKeyName);
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0,
KEY_READ, &hSubKey) == ERROR_SUCCESS)
+ HeapFree(GetProcessHeap(), 0, pServiceStatus);
+ return;
+ }
+ }
+ else /* exit on failure */
+ {
+ return;
+ }
+ }
+
+ if (NumServices)
+ {
+ 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(hServicesListCtrl);
+ item.lParam = 0;
+ item.iItem = ListView_InsertItem(hServicesListCtrl,
&item);
+
+ /* FIXME
+ if (QueryServiceConfig2(ScHandle,
SERVICE_CONFIG_FAILURE_ACTIONS, ) == 0)
+ {
+ if (GetLastError() == ERROR_MORE_DATA)
{
- dwDataLength = MAX_VALUE_NAME;
- if (RegQueryValueEx(hSubKey, _T("ObjectName"),
NULL, &dwType, (LPBYTE)ObjectName, &dwDataLength) == ERROR_SUCCESS)
- {
- dwDataLength = MAX_VALUE_NAME;
- if (RegQueryValueEx(hSubKey,
_T("DisplayName"), NULL, &dwType, (LPBYTE)DisplayName, &dwDataLength)
==
ERROR_SUCCESS)
- {
- memset(&item, 0, sizeof(LV_ITEM));
- item.mask = LVIF_TEXT;
- item.iImage = 0;
- item.pszText = DisplayName;
- item.iItem =
ListView_GetItemCount(hServicesListCtrl);
- item.lParam = 0;
- ListView_InsertItem(hServicesListCtrl,
&item);
- }
- }
+
}
}
+ LoadString(hInst, ( CONDITION ? IDS_YES : IDS_NO),
szStatus, 128);
+ item.pszText = szStatus;
+ item.iSubItem = 1;
+ SendMessage(hServicesListCtrl, LVM_SETITEMTEXT,
item.iItem, (LPARAM) &item);
+ */
+
+ LoadString(hInst,
((pServiceStatus[Index].ServiceStatusProcess.dwCurrentState ==
SERVICE_STOPPED) ? IDS_SERVICES_STATUS_STOPPED :
IDS_SERVICES_STATUS_RUNNING), szStatus, 128);
+ item.pszText = szStatus;
+ item.iSubItem = 3;
+ SendMessage(hServicesListCtrl, LVM_SETITEMTEXT,
item.iItem, (LPARAM) &item);
+
}
}
- RegCloseKey(hKey);
- }
+
+ CloseServiceHandle(ScHandle);
+ }
+
+
}