query.c
来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C语言 代码 · 共 549 行 · 第 1/2 页
C
549 行
if (NumServices)
{
TCHAR buf[300]; /* buffer to hold key path */
INT NumListedServ = 0; /* how many services were listed */
for (Index = 0; Index < NumServices; Index++)
{
HKEY hKey = NULL;
LPTSTR Description = NULL;
LPTSTR LogOnAs = NULL;
DWORD StartUp = 0;
DWORD dwValueSize;
/* open the registry key for the service */
_sntprintf(buf,
300,
Path,
Info->pServiceStatus[Index].lpServiceName);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
buf,
0,
KEY_READ,
&hKey);
/* set the display name */
ZeroMemory(&lvItem, sizeof(LVITEM));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.pszText = Info->pServiceStatus[Index].lpDisplayName;
/* Set a pointer for each service so we can query it later.
* Not all services are added to the list, so we can't query
* the item number as they become out of sync with the array */
lvItem.lParam = (LPARAM)&Info->pServiceStatus[Index];
lvItem.iItem = ListView_GetItemCount(Info->hListView);
lvItem.iItem = ListView_InsertItem(Info->hListView, &lvItem);
/* set the description */
if (GetDescription(Info->pServiceStatus[Index].lpServiceName, &Description))
{
lvItem.pszText = Description;
lvItem.iSubItem = 1;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
HeapFree(ProcessHeap,
0,
Description);
}
/* set the status */
if (Info->pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
{
LoadString(hInstance,
IDS_SERVICES_STARTED,
szStatus,
sizeof(szStatus) / sizeof(TCHAR));
lvItem.pszText = szStatus;
lvItem.iSubItem = 2;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
}
/* set the startup type */
dwValueSize = sizeof(DWORD);
if (RegQueryValueEx(hKey,
_T("Start"),
NULL,
NULL,
(LPBYTE)&StartUp,
&dwValueSize))
{
RegCloseKey(hKey);
continue;
}
if (StartUp == 0x02)
{
LoadString(hInstance,
IDS_SERVICES_AUTO,
szStatus,
sizeof(szStatus) / sizeof(TCHAR));
lvItem.pszText = szStatus;
lvItem.iSubItem = 3;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
}
else if (StartUp == 0x03)
{
LoadString(hInstance,
IDS_SERVICES_MAN,
szStatus,
sizeof(szStatus) / sizeof(TCHAR));
lvItem.pszText = szStatus;
lvItem.iSubItem = 3;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
}
else if (StartUp == 0x04)
{
LoadString(hInstance,
IDS_SERVICES_DIS,
szStatus,
sizeof(szStatus) / sizeof(TCHAR));
lvItem.pszText = szStatus;
lvItem.iSubItem = 3;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
}
/* set Log On As */
dwValueSize = 0;
if (RegQueryValueEx(hKey,
_T("ObjectName"),
NULL,
NULL,
NULL,
&dwValueSize))
{
RegCloseKey(hKey);
continue;
}
LogOnAs = HeapAlloc(ProcessHeap,
HEAP_ZERO_MEMORY,
dwValueSize);
if (LogOnAs == NULL)
{
RegCloseKey(hKey);
return FALSE;
}
if(RegQueryValueEx(hKey,
_T("ObjectName"),
NULL,
NULL,
(LPBYTE)LogOnAs,
&dwValueSize))
{
HeapFree(ProcessHeap,
0,
LogOnAs);
RegCloseKey(hKey);
continue;
}
lvItem.pszText = LogOnAs;
lvItem.iSubItem = 4;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
HeapFree(ProcessHeap,
0,
LogOnAs);
RegCloseKey(hKey);
}
NumListedServ = ListView_GetItemCount(Info->hListView);
/* set the number of listed services in the status bar */
LoadString(hInstance,
IDS_NUM_SERVICES,
szNumServices,
sizeof(szNumServices) / sizeof(TCHAR));
_sntprintf(buf,
300,
szNumServices,
NumListedServ);
SendMessage(Info->hStatus,
SB_SETTEXT,
0,
(LPARAM)buf);
}
/* turn redraw flag on. It's turned off initially via the LBS_NOREDRAW flag */
SendMessage (Info->hListView,
WM_SETREDRAW,
TRUE,
0) ;
return TRUE;
}
DWORD
GetServiceList(PMAIN_WND_INFO Info)
{
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)Info->pServiceStatus,
0, &BytesNeeded,
&NumServices,
&ResumeHandle,
0) == FALSE)
{
/* Call function again if required size was returned */
if (GetLastError() == ERROR_MORE_DATA)
{
/* reserve memory for service info array */
Info->pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *)
HeapAlloc(ProcessHeap,
0,
BytesNeeded);
if (Info->pServiceStatus == NULL)
return FALSE;
/* fill array with service info */
if (EnumServicesStatusEx(ScHandle,
SC_ENUM_PROCESS_INFO,
SERVICE_WIN32,
SERVICE_STATE_ALL,
(LPBYTE)Info->pServiceStatus,
BytesNeeded,
&BytesNeeded,
&NumServices,
&ResumeHandle,
0) == FALSE)
{
HeapFree(ProcessHeap,
0,
Info->pServiceStatus);
return FALSE;
}
}
else /* exit on failure */
{
return FALSE;
}
}
}
CloseServiceHandle(ScHandle);
return NumServices;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?