static DWORD ScStartService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket) { HANDLE ThreadHandle; DWORD ThreadId; DWORD dwError; if (lpService == NULL || ControlPacket == NULL) return ERROR_INVALID_PARAMETER; TRACE("ScStartService() called\n"); TRACE("Size: %lu\n", ControlPacket->dwSize); TRACE("Service: %S\n", (PWSTR)((PBYTE)ControlPacket + ControlPacket->dwServiceNameOffset)); /* Set the service status handle */ lpService->hServiceStatus = ControlPacket->hServiceStatus; /* Build the arguments vector */ if (lpService->bUnicode == TRUE) { dwError = ScBuildUnicodeArgsVector(ControlPacket, &lpService->ThreadParams.W.dwArgCount, &lpService->ThreadParams.W.lpArgVector); } else { dwError = ScBuildAnsiArgsVector(ControlPacket, &lpService->ThreadParams.A.dwArgCount, &lpService->ThreadParams.A.lpArgVector); } if (dwError != ERROR_SUCCESS) return dwError; /* Invoke the services entry point and implement the command loop */ ThreadHandle = CreateThread(NULL, 0, ScServiceMainStub, lpService, CREATE_SUSPENDED, &ThreadId); if (ThreadHandle == NULL) { /* Free the arguments vector */ if (lpService->bUnicode) { if (lpService->ThreadParams.W.lpArgVector != NULL) { HeapFree(GetProcessHeap(), 0, lpService->ThreadParams.W.lpArgVector); lpService->ThreadParams.W.lpArgVector = NULL; lpService->ThreadParams.W.dwArgCount = 0; } } else { if (lpService->ThreadParams.A.lpArgVector != NULL) { HeapFree(GetProcessHeap(), 0, lpService->ThreadParams.A.lpArgVector); lpService->ThreadParams.A.lpArgVector = NULL; lpService->ThreadParams.A.dwArgCount = 0; } } return ERROR_SERVICE_NO_THREAD; } ResumeThread(ThreadHandle); CloseHandle(ThreadHandle); return ERROR_SUCCESS; }
static DWORD ScStartService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket) { HANDLE ThreadHandle; DWORD ThreadId; DWORD dwError; PSERVICE_THREAD_PARAMSA ThreadParamsA; PSERVICE_THREAD_PARAMSW ThreadParamsW; if (lpService == NULL || ControlPacket == NULL) return ERROR_INVALID_PARAMETER; TRACE("ScStartService() called\n"); TRACE("Size: %lu\n", ControlPacket->dwSize); TRACE("Service: %S\n", (PWSTR)((PBYTE)ControlPacket + ControlPacket->dwServiceNameOffset)); /* Set the service status handle */ lpService->hServiceStatus = ControlPacket->hServiceStatus; /* Build the arguments vector */ if (lpService->bUnicode == TRUE) { ThreadParamsW = HeapAlloc(GetProcessHeap(), 0, sizeof(*ThreadParamsW)); if (ThreadParamsW == NULL) return ERROR_NOT_ENOUGH_MEMORY; dwError = ScBuildUnicodeArgsVector(ControlPacket, &ThreadParamsW->dwArgCount, &ThreadParamsW->lpArgVector); if (dwError != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, ThreadParamsW); return dwError; } ThreadParamsW->lpServiceMain = lpService->ServiceMain.W; ThreadHandle = CreateThread(NULL, 0, ScServiceMainStubW, ThreadParamsW, CREATE_SUSPENDED, &ThreadId); if (ThreadHandle == NULL) { if (ThreadParamsW->lpArgVector != NULL) { HeapFree(GetProcessHeap(), 0, ThreadParamsW->lpArgVector); } HeapFree(GetProcessHeap(), 0, ThreadParamsW); } } else { ThreadParamsA = HeapAlloc(GetProcessHeap(), 0, sizeof(*ThreadParamsA)); if (ThreadParamsA == NULL) return ERROR_NOT_ENOUGH_MEMORY; dwError = ScBuildAnsiArgsVector(ControlPacket, &ThreadParamsA->dwArgCount, &ThreadParamsA->lpArgVector); if (dwError != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, ThreadParamsA); return dwError; } ThreadParamsA->lpServiceMain = lpService->ServiceMain.A; ThreadHandle = CreateThread(NULL, 0, ScServiceMainStubA, ThreadParamsA, CREATE_SUSPENDED, &ThreadId); if (ThreadHandle == NULL) { if (ThreadParamsA->lpArgVector != NULL) { HeapFree(GetProcessHeap(), 0, ThreadParamsA->lpArgVector); } HeapFree(GetProcessHeap(), 0, ThreadParamsA); } } ResumeThread(ThreadHandle); CloseHandle(ThreadHandle); return ERROR_SUCCESS; }