Module: wine Branch: master Commit: 46b27469383b603bb00e29de80784abbb21938a8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=46b27469383b603bb00e29de80...
Author: Sebastian Lackner sebastian@fds-team.de Date: Thu Aug 11 07:21:23 2016 +0200
services: Store process id in the process object.
Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/services/rpc.c | 51 ++++++++++++-------------------------------- programs/services/services.c | 4 +--- programs/services/services.h | 3 ++- 3 files changed, 17 insertions(+), 41 deletions(-)
diff --git a/programs/services/rpc.c b/programs/services/rpc.c index 4036f7d..36a0620 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -761,13 +761,7 @@ DWORD __cdecl svcctl_SetServiceStatus( service_lock(service->service_entry); /* FIXME: be a bit more discriminant about what parts of the status we set * and check that fields are valid */ - service->service_entry->status.dwServiceType = lpServiceStatus->dwServiceType; - service->service_entry->status.dwCurrentState = lpServiceStatus->dwCurrentState; - service->service_entry->status.dwControlsAccepted = lpServiceStatus->dwControlsAccepted; - service->service_entry->status.dwWin32ExitCode = lpServiceStatus->dwWin32ExitCode; - service->service_entry->status.dwServiceSpecificExitCode = lpServiceStatus->dwServiceSpecificExitCode; - service->service_entry->status.dwCheckPoint = lpServiceStatus->dwCheckPoint; - service->service_entry->status.dwWaitHint = lpServiceStatus->dwWaitHint; + service->service_entry->status = *lpServiceStatus; if ((process = service->service_entry->process)) { if (lpServiceStatus->dwCurrentState == SERVICE_STOPPED) @@ -886,6 +880,14 @@ DWORD __cdecl svcctl_QueryServiceConfig2W( SC_RPC_HANDLE hService, DWORD level, return err; }
+static void fill_status_process(SERVICE_STATUS_PROCESS *status, struct service_entry *service) +{ + struct process_entry *process = service->process; + memcpy(status, &service->status, sizeof(service->status)); + status->dwProcessId = process ? process->process_id : 0; + status->dwServiceFlags = 0; +} + DWORD __cdecl svcctl_QueryServiceStatusEx( SC_RPC_HANDLE hService, SC_STATUS_TYPE InfoLevel, @@ -918,17 +920,7 @@ DWORD __cdecl svcctl_QueryServiceStatusEx( }
service_lock(service->service_entry); - - pSvcStatusData->dwServiceType = service->service_entry->status.dwServiceType; - pSvcStatusData->dwCurrentState = service->service_entry->status.dwCurrentState; - pSvcStatusData->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; - pSvcStatusData->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; - pSvcStatusData->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; - pSvcStatusData->dwCheckPoint = service->service_entry->status.dwCheckPoint; - pSvcStatusData->dwWaitHint = service->service_entry->status.dwWaitHint; - pSvcStatusData->dwProcessId = service->service_entry->status.dwProcessId; - pSvcStatusData->dwServiceFlags = service->service_entry->status.dwServiceFlags; - + fill_status_process(pSvcStatusData, service->service_entry); service_unlock(service->service_entry);
return ERROR_SUCCESS; @@ -1151,16 +1143,7 @@ DWORD __cdecl svcctl_ControlService(
if (result != ERROR_SUCCESS) { - if (lpServiceStatus) - { - lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType; - lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState; - lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; - lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; - lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; - lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint; - lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint; - } + if (lpServiceStatus) *lpServiceStatus = service->service_entry->status; service_unlock(service->service_entry); return result; } @@ -1195,13 +1178,7 @@ DWORD __cdecl svcctl_ControlService( if (lpServiceStatus) { service_lock(service->service_entry); - lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType; - lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState; - lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted; - lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode; - lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode; - lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint; - lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint; + *lpServiceStatus = service->service_entry->status; service_unlock(service->service_entry); }
@@ -1365,7 +1342,7 @@ DWORD __cdecl svcctl_EnumServicesStatusW( s->lpDisplayName = (WCHAR *)offset; offset += sz; } - memcpy(&s->ServiceStatus, &service->status, sizeof(SERVICE_STATUS)); + s->ServiceStatus = service->status; s++; } } @@ -1490,7 +1467,7 @@ DWORD __cdecl svcctl_EnumServicesStatusExW( s->lpDisplayName = (WCHAR *)offset; offset += sz; } - s->ServiceStatusProcess = service->status; + fill_status_process(&s->ServiceStatusProcess, service); s++; } } diff --git a/programs/services/services.c b/programs/services/services.c index 56c3e45..feb137d 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -791,7 +791,7 @@ static DWORD service_start_process(struct service_entry *service_entry, struct p return err; }
- service_entry->status.dwProcessId = pi.dwProcessId; + process->process_id = pi.dwProcessId; process->process = pi.hProcess; CloseHandle( pi.hThread );
@@ -936,7 +936,6 @@ void service_terminate(struct service_entry *service) release_process(process); service->process = NULL; } - service->status.dwProcessId = 0; service->status.dwCurrentState = SERVICE_STOPPED; service_unlock(service); } @@ -951,7 +950,6 @@ void process_terminate(struct process_entry *process) LIST_FOR_EACH_ENTRY(service, &db->services, struct service_entry, entry) { if (service->process != process) continue; - service->status.dwProcessId = 0; service->status.dwCurrentState = SERVICE_STOPPED; service->process = NULL; release_process(process); diff --git a/programs/services/services.h b/programs/services/services.h index ff9d582..778b30a 100644 --- a/programs/services/services.h +++ b/programs/services/services.h @@ -37,6 +37,7 @@ struct process_entry struct list entry; struct scmdatabase *db; LONG ref_count; + DWORD process_id; HANDLE process; HANDLE control_mutex; HANDLE control_pipe; @@ -50,7 +51,7 @@ struct service_entry struct scmdatabase *db; LONG ref_count; /* number of references - if goes to zero and the service is deleted the structure will be freed */ LPWSTR name; - SERVICE_STATUS_PROCESS status; + SERVICE_STATUS status; QUERY_SERVICE_CONFIGW config; DWORD preshutdown_timeout; LPWSTR description;