【发布时间】:2023-03-09 16:15:01
【问题描述】:
我需要确定 Windows 服务的进程 ID(我正在使用 C)。鉴于我可以访问服务的 SC_HANDLE,QueryServiceStatusEx 正是我需要的功能。但是,当访问QueryServiceStatusEx返回的SERVICE_STATUS_PROCESS结构中的dwProcessId字段时,它包含0。
这是我的代码:
unsigned int get_svc_pid (SC_HANDLE svc) {
unsigned int pid = 0;
BYTE *svc_info = NULL;
DWORD buf_size = 0;
DWORD bytes_needed = 0;
//determine svc_info size
QueryServiceStatusEx(svc, SC_STATUS_PROCESS_INFO, svc_info, buf_size, &bytes_needed);
svc_info = malloc(bytes_needed);
buf_size = bytes_needed;
//get pid
if(QueryServiceStatusEx(svc, SC_STATUS_PROCESS_INFO, svc_info, buf_size, &bytes_needed) != 0){
pid = (*(SERVICE_STATUS_PROCESS *)svc_info).dwProcessId;
}else{
fprintf(msglog, "ERR: QueryServiceStatusEx failed\nGLE: %u\n", (unsigned int) GetLastError());
}
free(svc_info);
return pid;
}
另外:我使用EnumServiceStatusEx 枚举所有正在运行的服务并输出它们的名称和包含在ENUM_SERVICE_STATUS_PROCESS 结构中的PID。大多数 PID 为 0。结构中只有少数 PID 与 ProcessHacker/TaskManager 中列出的那些匹配。
我不知道为什么 dwProcessId 字段包含 0,但显然这不是有效的 PID。提前谢谢你。
【问题讨论】:
-
因为那些服务没有运行