一个取服务PID的C语言!/////////////////////////////////////////////////////////
// Get PID of Service Process
// hScMgt 为OpenSCManager()的返回值
// lpSrvName是服务名
DWORD GetServicePid(SC_HANDLE hScMgt, LPCTSTR lpSrvName)
{
SC_HANDLE hSrv;
SERVICE_STATUS_PROCESS InfoLevel;
DWORD dwBytesNeed; hSrv = OpenService(hScMgt, lpSrvName, SERVICE_QUERY_STATUS);
if (hSrv == NULL)
{
printf("[-] OpenService() Error: %d\n", GetLastError());
return 0;
}
if(!QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO, (LPBYTE) &InfoLevel, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeed))
{
printf("[-] QueryServiceStatusEx() Error: %d\n", GetLastError());
CloseServiceHandle(hSrv);
return 0;
}
CloseServiceHandle(hSrv);
return InfoLevel.dwProcessId;
}
// Get PID of Service Process
// hScMgt 为OpenSCManager()的返回值
// lpSrvName是服务名
DWORD GetServicePid(SC_HANDLE hScMgt, LPCTSTR lpSrvName)
{
SC_HANDLE hSrv;
SERVICE_STATUS_PROCESS InfoLevel;
DWORD dwBytesNeed; hSrv = OpenService(hScMgt, lpSrvName, SERVICE_QUERY_STATUS);
if (hSrv == NULL)
{
printf("[-] OpenService() Error: %d\n", GetLastError());
return 0;
}
if(!QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO, (LPBYTE) &InfoLevel, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeed))
{
printf("[-] QueryServiceStatusEx() Error: %d\n", GetLastError());
CloseServiceHandle(hSrv);
return 0;
}
CloseServiceHandle(hSrv);
return InfoLevel.dwProcessId;
}
var
hScMgt, hSrv: SC_HANDLE;
InfoLevel: SERVICE_STATUS_PROCESS;
dwBytesNeed: DWORD;
begin
Result := 0;
hScMgt := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if (hSrv = 0) then
begin
ShowMessage(Format('[-] OpenSCManager() Error: %d', [GetLastError()]));
Exit;
end; hSrv := OpenService(hScMgt, PChar(lpSrvName), SERVICE_QUERY_STATUS);
if (hSrv = 0) then
begin
ShowMessage(Format('[-] OpenService() Error: %d', [GetLastError()]));
Result := 0;
end; if not (QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO, PBYTE(@InfoLevel),
sizeof(SERVICE_STATUS_PROCESS), dwBytesNeed)) then
begin
CloseServiceHandle(hSrv);
Exit;
end;
CloseServiceHandle(hScMgt);
CloseServiceHandle(hSrv);
Result := InfoLevel.dwProcessId;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetServicePid('stisvc')));
end;
if (hSrv = 0) then
begin
ShowMessage(Format('[-] OpenService() Error: %d', [GetLastError()]));
Exit;
end;
http://dl6.csdn.net/fd.php?i=148320204409465&s=d462ae5dd6affb2b260b2013428e980f
上边代码需修改后的WinSvc 单元才可运行,WinSvc在DEMO里附带里
http://topic.csdn.net/u/20100122/21/b1e45a70-91b9-4365-b3db-f84d6a9ab739.html
sanguomi能帮我看下这个问题吗