[2/6] services: Store process id in the process object.
Sebastian Lackner
sebastian at fds-team.de
Thu Aug 11 00:21:23 CDT 2016
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
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;
--
2.9.0
More information about the wine-patches
mailing list