add some more info for services in msconfig (if req, vendor)
Modified: trunk/reactos/subsys/system/msconfig/msconfig.xml
Modified: trunk/reactos/subsys/system/msconfig/srvpage.c
_____
Modified: trunk/reactos/subsys/system/msconfig/msconfig.xml
--- trunk/reactos/subsys/system/msconfig/msconfig.xml 2005-11-11
23:26:19 UTC (rev 19158)
+++ trunk/reactos/subsys/system/msconfig/msconfig.xml 2005-11-11
23:33:07 UTC (rev 19159)
@@ -8,6 +8,7 @@
<define name="_WIN32_WINNT">0x501</define>
<library>kernel32</library>
<library>user32</library>
+ <library>version</library>
<library>comctl32</library>
<library>shell32</library>
<file>toolspage.c</file>
_____
Modified: trunk/reactos/subsys/system/msconfig/srvpage.c
--- trunk/reactos/subsys/system/msconfig/srvpage.c 2005-11-11
23:26:19 UTC (rev 19158)
+++ trunk/reactos/subsys/system/msconfig/srvpage.c 2005-11-11
23:33:07 UTC (rev 19159)
@@ -62,20 +62,31 @@
GetServices ( void )
{
LV_ITEM item;
+ WORD wCodePage;
+ WORD wLangID;
SC_HANDLE ScHandle;
- DWORD BufSize = 0;
+ 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];
+ 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, BufSize,
&BytesNeeded, &NumServices, &ResumeHandle, 0) == 0)
+ 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)
@@ -110,19 +121,100 @@
item.lParam = 0;
item.iItem = ListView_InsertItem(hServicesListCtrl,
&item);
- /* FIXME
- if (QueryServiceConfig2(ScHandle,
SERVICE_CONFIG_FAILURE_ACTIONS, ) == 0)
+ BytesNeeded = 0;
+ hService = OpenService(ScHandle,
pServiceStatus[Index].lpServiceName, SC_MANAGER_CONNECT);
+ if (hService != INVALID_HANDLE_VALUE)
{
- if (GetLastError() == ERROR_MORE_DATA)
+ /* 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(hInst, IDS_YES, szStatus, 128);
+ item.pszText = szStatus;
+ item.iSubItem = 1;
+ SendMessage(hServicesListCtrl,
LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+ }
+ }
+
+ /* 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);
+ }
+
+ 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(hServicesListCtrl,
LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
+ }
+ }
+ CloseServiceHandle(hService);
}
- 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;
@@ -132,6 +224,9 @@
}
}
+ HeapFree(GetProcessHeap(), 0, pServiceStatus);
+ HeapFree(GetProcessHeap(), 0, pServiceConfig);
+ HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
CloseServiceHandle(ScHandle);
}