query.c
来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C语言 代码 · 共 549 行 · 第 1/2 页
C
549 行
/*
* PROJECT: ReactOS Services
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/system/servman/query.c
* PURPOSE: Query service information
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
*
*/
#include "precomp.h"
ENUM_SERVICE_STATUS_PROCESS*
GetSelectedService(PMAIN_WND_INFO Info)
{
LVITEM lvItem;
lvItem.mask = LVIF_PARAM;
lvItem.iItem = Info->SelectedItem;
SendMessage(Info->hListView,
LVM_GETITEM,
0,
(LPARAM)&lvItem);
/* return pointer to selected service */
return (ENUM_SERVICE_STATUS_PROCESS *)lvItem.lParam;
}
/* Sets the service description in the registry */
BOOL SetDescription(LPTSTR ServiceName, LPTSTR Description)
{
HKEY hKey;
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
TCHAR buf[300];
TCHAR szBuf[MAX_PATH];
LONG val;
/* open the registry key for the service */
_sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, ServiceName);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
buf,
0,
KEY_WRITE,
&hKey);
if ((val = RegSetValueEx(hKey,
_T("Description"),
0,
REG_SZ,
(LPBYTE)Description,
(DWORD)lstrlen(szBuf)+1)) != ERROR_SUCCESS)
{
//GetError(val);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
/* Retrives the service description from the registry */
BOOL GetDescription(LPTSTR lpServiceName, LPTSTR *retDescription)
{
HKEY hKey;
LPTSTR Description = NULL;
DWORD dwValueSize = 0;
LONG ret;
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
TCHAR buf[300];
/* open the registry key for the service */
_sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, lpServiceName);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
buf,
0,
KEY_READ,
&hKey);
ret = RegQueryValueEx(hKey,
_T("Description"),
NULL,
NULL,
NULL,
&dwValueSize);
if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE)
{
RegCloseKey(hKey);
return FALSE;
}
if (ret != ERROR_FILE_NOT_FOUND)
{
Description = HeapAlloc(ProcessHeap,
HEAP_ZERO_MEMORY,
dwValueSize);
if (Description == NULL)
{
RegCloseKey(hKey);
return FALSE;
}
if(RegQueryValueEx(hKey,
_T("Description"),
NULL,
NULL,
(LPBYTE)Description,
&dwValueSize))
{
HeapFree(ProcessHeap,
0,
Description);
RegCloseKey(hKey);
return FALSE;
}
}
/* copy pointer over */
*retDescription = Description;
return TRUE;
}
/* get vendor of service binary */
BOOL
GetExecutablePath(PMAIN_WND_INFO Info,
LPTSTR *ExePath)
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hSc = NULL;
LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
DWORD BytesNeeded = 0;
/* open handle to the SCM */
hSCManager = OpenSCManager(NULL,
NULL,
SC_MANAGER_ENUMERATE_SERVICE);
if (hSCManager == NULL)
{
GetError();
return FALSE;
}
/* get a handle to the service requested for starting */
hSc = OpenService(hSCManager,
Info->CurrentService->lpServiceName,
SERVICE_QUERY_CONFIG);
if (hSc == NULL)
{
GetError();
goto cleanup;
}
if (!QueryServiceConfig(hSc,
pServiceConfig,
0,
&BytesNeeded))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
pServiceConfig = (LPQUERY_SERVICE_CONFIG)
HeapAlloc(ProcessHeap,
0,
BytesNeeded);
if (pServiceConfig == NULL)
goto cleanup;
if (!QueryServiceConfig(hSc,
pServiceConfig,
BytesNeeded,
&BytesNeeded))
{
HeapFree(ProcessHeap,
0,
pServiceConfig);
goto cleanup;
}
}
else /* exit on failure */
{
goto cleanup;
}
}
*ExePath = pServiceConfig->lpBinaryPathName;
CloseServiceHandle(hSCManager);
CloseServiceHandle(hSc);
return TRUE;
cleanup:
if (hSCManager != NULL)
CloseServiceHandle(hSCManager);
if (hSc != NULL)
CloseServiceHandle(hSc);
return FALSE;
}
static VOID
InitListViewImage(PMAIN_WND_INFO Info)
{
HICON hSmIconItem, hLgIconItem; /* icon for list-view items */
HIMAGELIST hSmall, hLarge; /* image list for other views */
/* Create the icon image lists */
hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_MASK | ILC_COLOR32,
1,
1);
hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON),
ILC_MASK | ILC_COLOR32,
1,
1);
/* Add an icon to each image list */
hSmIconItem = LoadImage(hInstance,
MAKEINTRESOURCE(IDI_SM_ICON),
IMAGE_ICON,
16,
16,
0);
ImageList_AddIcon(hSmall,
hSmIconItem);
hLgIconItem = LoadImage(hInstance,
MAKEINTRESOURCE(IDI_SM_ICON),
IMAGE_ICON,
32,
32,
0);
ImageList_AddIcon(hLarge,
hLgIconItem);
/* assign the image to the list view */
(void)ListView_SetImageList(Info->hListView,
hSmall,
LVSIL_SMALL);
(void)ListView_SetImageList(Info->hListView,
hLarge,
LVSIL_NORMAL);
}
BOOL
RefreshServiceList(PMAIN_WND_INFO Info)
{
LVITEM lvItem;
TCHAR szNumServices[32];
TCHAR szStatus[64];
DWORD NumServices = 0;
DWORD Index;
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");
(void)ListView_DeleteAllItems(Info->hListView);
InitListViewImage(Info);
NumServices = GetServiceList(Info);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?