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>
This commit is contained in:
parent
c8187d62f8
commit
46b2746938
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue