88 TRACE(
"ScCreateStatusBinding()\n");
98 ERR(
"RpcStringBindingCompose returned 0x%x\n",
status);
107 ERR(
"RpcBindingFromStringBinding returned 0x%x\n",
status);
113 ERR(
"RpcStringFree returned 0x%x\n",
status);
125 TRACE(
"ScDestroyStatusBinding()\n");
133 ERR(
"RpcBindingFree returned 0x%x\n",
status);
149 TRACE(
"ScLookupServiceByServiceName(%S)\n",
165 TRACE(
"No service found!\n");
187 Teb->SubProcessTag = 0;
216 Teb->SubProcessTag = 0;
231 DWORD dwBytesWritten;
233 DWORD dwServiceCurrent = 1;
239 TRACE(
"ScConnectControlPipe(%p)\n",
258 ERR(
"RtlQueryRegistryValues() failed (Status %lx)\n",
Status);
264 dwServiceCurrent = 0;
267 swprintf(NtControlPipeName,
L"\\\\.\\pipe\\net\\NtControlPipe%u", dwServiceCurrent);
268 TRACE(
"PipeName: %S\n", NtControlPipeName);
272 ERR(
"WaitNamedPipe(%S) failed (Error %lu)\n", NtControlPipeName,
GetLastError());
285 ERR(
"CreateFileW() failed for pipe %S (Error %lu)\n", NtControlPipeName,
GetLastError());
305 TRACE(
"Sent Process ID %lu\n", dwProcessId);
336 PWSTR pszServiceName;
342 if (ControlPacket ==
NULL || lpArgCount ==
NULL || lpArgVector ==
NULL)
356 cbTotal =
sizeof(
PWSTR) + cbServiceName;
361 cbTotal += cbArguments;
365 if (lpVector ==
NULL)
383 TRACE(
"Unicode lpVector[%lu] = '%ls'\n",
i + 1, lpVector[
i + 1]);
389 memcpy(lpVector[0], pszServiceName, cbServiceName);
390 TRACE(
"Unicode lpVector[%lu] = '%ls'\n", 0, lpVector[0]);
393 *lpArgVector = lpVector;
412 if (ControlPacket ==
NULL || lpArgCount ==
NULL || lpArgVector ==
NULL)
424 lpVectorA = (
PSTR*)lpVectorW;
425 for (
i = 0;
i < ArgCount;
i++)
441 TRACE(
"Ansi lpVector[%lu] = '%s'\n",
i, lpVectorA[
i]);
444 *lpArgCount = ArgCount;
445 *lpArgVector = lpVectorA;
461 TRACE(
"ScStartService(%p %p)\n",
462 lpService, ControlPacket);
464 if (lpService ==
NULL || ControlPacket ==
NULL)
479 if (ThreadParamsW ==
NULL)
497 if (ThreadHandle ==
NULL)
513 if (ThreadParamsA ==
NULL)
531 if (ThreadHandle ==
NULL)
555 TRACE(
"ScControlService(%p %p)\n",
556 lpService, ControlPacket);
558 if (lpService ==
NULL || ControlPacket ==
NULL)
602 TRACE(
"ScControlService() done (Error %lu)\n", dwError);
621 TRACE(
"ScServiceDispatcher(%p %p %lu)\n",
622 hPipe, ControlPacket, dwBufferSize);
635 if (bResult ==
FALSE)
642 TRACE(
"Service: %S\n", lpServiceName);
647 TRACE(
"Stop dispatcher thread\n");
657 if (lpService !=
NULL)
664 TRACE(
"Start command - received SERVICE_CONTROL_START\n");
669 TRACE(
"Stop command - received SERVICE_CONTROL_STOP\n");
693 if (bResult ==
FALSE)
717 TRACE(
"RegisterServiceCtrlHandlerA(%s %p)\n",
747 TRACE(
"RegisterServiceCtrlHandlerW(%s %p)\n",
763 Service->HandlerFunction = lpHandlerProc;
766 TRACE(
"RegisterServiceCtrlHandler returning %p\n",
Service->hServiceStatus);
768 return Service->hServiceStatus;
786 TRACE(
"RegisterServiceCtrlHandlerExA(%s %p %p)\n",
787 debugstr_a(lpServiceName), lpHandlerProc, lpContext);
818 TRACE(
"RegisterServiceCtrlHandlerExW(%s %p %p)\n",
819 debugstr_w(lpServiceName), lpHandlerProc, lpContext);
835 Service->HandlerFunctionEx = lpHandlerProc;
836 Service->HandlerContext = lpContext;
838 TRACE(
"RegisterServiceCtrlHandlerEx returning %p\n",
Service->hServiceStatus);
840 return Service->hServiceStatus;
855 TRACE(
"I_ScIsSecurityProcess()\n");
875 TRACE(
"I_ScPnPGetServiceName(%lu %p %lu)\n",
902 BOOL bUpdateImmediately,
907 TRACE(
"I_ScSetServiceBitsA(%lu %lx %u %u %s)\n",
941 BOOL bUpdateImmediately,
946 TRACE(
"I_ScSetServiceBitsW(%lu %lx %u %u %s)\n",
978 BOOL bUpdateImmediately)
980 TRACE(
"SetServiceBits(%lu %lx %u %u)\n",
1002 TRACE(
"SetServiceStatus(%lu %p)\n",
1018 ERR(
"RSetServiceStatus() failed (Error %lu)\n", dwError);
1023 TRACE(
"SetServiceStatus() done\n");
1044 TRACE(
"StartServiceCtrlDispatcherA(%p)\n",
1045 lpServiceStartTable);
1048 while (lpServiceStartTable[
i].lpServiceProc !=
NULL)
1069 lpServiceStartTable[
i].lpServiceName);
1090 if (ControlPacket ==
NULL)
1109 RtlFreeHeap(RtlGetProcessHeap(), 0, ControlPacket);
1143 TRACE(
"StartServiceCtrlDispatcherW(%p)\n",
1144 lpServiceStartTable);
1147 while (lpServiceStartTable[
i].lpServiceProc !=
NULL)
1168 lpServiceStartTable[
i].lpServiceName);
1189 if (ControlPacket ==
NULL)
1207 RtlFreeHeap(RtlGetProcessHeap(), 0, ControlPacket);
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
DWORD ScmRpcStatusToWinError(RPC_STATUS Status)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static WCHAR ServiceName[]
DWORD WINAPI RI_ScSetServiceBitsA(RPC_SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, int bSetBitsOn, int bUpdateImmediately, char *lpString)
DWORD WINAPI RI_ScSetServiceBitsW(RPC_SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, int bSetBitsOn, int bUpdateImmediately, wchar_t *lpString)
DWORD WINAPI RSetServiceStatus(RPC_SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define ReadFile(a, b, c, d, e)
#define INVALID_HANDLE_VALUE
#define HeapFree(x, y, z)
#define FILE_ATTRIBUTE_NORMAL
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define EXCEPTION_EXECUTE_HANDLER
#define memcpy(s1, s2, n)
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
BOOL WINAPI SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout)
BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
#define RTL_REGISTRY_CONTROL
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_QUERY_REGISTRY_REQUIRED
#define RTL_QUERY_REGISTRY_DIRECT
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define _SEH2_EXCEPT(...)
RPC_STATUS WINAPI RpcBindingFromStringBindingW(RPC_WSTR StringBinding, RPC_BINDING_HANDLE *Binding)
RPC_STATUS WINAPI RpcStringBindingComposeW(RPC_WSTR ObjUuid, RPC_WSTR Protseq, RPC_WSTR NetworkAddr, RPC_WSTR Endpoint, RPC_WSTR Options, RPC_WSTR *StringBinding)
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
RPC_STATUS WINAPI RpcStringFreeW(RPC_WSTR *String)
static DWORD ScControlService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket)
struct _SERVICE_THREAD_PARAMSA SERVICE_THREAD_PARAMSA
BOOL WINAPI StartServiceCtrlDispatcherA(const SERVICE_TABLE_ENTRYA *lpServiceStartTable)
BOOL WINAPI SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately)
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA(LPCSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
static DWORD ScConnectControlPipe(HANDLE *hPipe)
static BOOL bSecurityServiceProcess
static BOOL ScServiceDispatcher(HANDLE hPipe, PSCM_CONTROL_PACKET ControlPacket, DWORD dwBufferSize)
static DWORD WINAPI ScServiceMainStubW(LPVOID Context)
static RPC_STATUS ScDestroyStatusBinding(VOID)
static PACTIVE_SERVICE ScLookupServiceByServiceName(LPCWSTR lpServiceName)
static handle_t hStatusBinding
VOID WINAPI I_ScIsSecurityProcess(VOID)
static DWORD dwActiveServiceCount
struct _SERVICE_THREAD_PARAMSW * PSERVICE_THREAD_PARAMSW
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
void __RPC_USER RPC_SERVICE_STATUS_HANDLE_unbind(RPC_SERVICE_STATUS_HANDLE hServiceStatus, handle_t hBinding)
static DWORD ScBuildAnsiArgsVector(PSCM_CONTROL_PACKET ControlPacket, LPDWORD lpArgCount, LPSTR **lpArgVector)
DWORD WINAPI I_ScPnPGetServiceName(IN SERVICE_STATUS_HANDLE hServiceStatus, OUT LPWSTR lpServiceName, IN DWORD cchServiceName)
static DWORD ScBuildUnicodeArgsVector(PSCM_CONTROL_PACKET ControlPacket, LPDWORD lpArgCount, LPWSTR **lpArgVector)
static RPC_STATUS ScCreateStatusBinding(VOID)
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
struct _SERVICE_THREAD_PARAMSA * PSERVICE_THREAD_PARAMSA
static DWORD WINAPI ScServiceMainStubA(LPVOID Context)
struct _ACTIVE_SERVICE * PACTIVE_SERVICE
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
handle_t __RPC_USER RPC_SERVICE_STATUS_HANDLE_bind(RPC_SERVICE_STATUS_HANDLE hServiceStatus)
struct _SERVICE_THREAD_PARAMSW SERVICE_THREAD_PARAMSW
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA(LPCSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
BOOL WINAPI I_ScSetServiceBitsW(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately, LPWSTR lpString)
static DWORD ScStartService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket)
static PACTIVE_SERVICE lpActiveServices
BOOL WINAPI I_ScSetServiceBitsA(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately, LPSTR lpString)
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
struct _ACTIVE_SERVICE ACTIVE_SERVICE
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define RpcExceptionCode()
struct _SCM_CONTROL_PACKET SCM_CONTROL_PACKET
#define SERVICE_CONTROL_START_OWN
#define SERVICE_CONTROL_START_SHARE
SERVICE_STATUS_HANDLE hServiceStatus
LPSERVICE_MAIN_FUNCTIONW W
LPSERVICE_MAIN_FUNCTIONA A
LPHANDLER_FUNCTION_EX HandlerFunctionEx
union _ACTIVE_SERVICE::@343 ServiceMain
LPHANDLER_FUNCTION HandlerFunction
UNICODE_STRING ServiceName
DWORD dwServiceNameOffset
SERVICE_STATUS_HANDLE hServiceStatus
LPSERVICE_MAIN_FUNCTIONA lpServiceProc
LPSERVICE_MAIN_FUNCTIONW lpServiceProc
LPSERVICE_MAIN_FUNCTIONA lpServiceMain
LPSERVICE_MAIN_FUNCTIONW lpServiceMain
ULONG_PTR RPC_SERVICE_STATUS_HANDLE
const unsigned int MAX_SERVICE_NAME_LENGTH
#define RtlZeroMemory(Destination, Length)
SERVICE_STATUS_HANDLE hServiceStatus
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentProcessId(void)
#define PIPE_READMODE_MESSAGE
#define ERROR_SERVICE_NO_THREAD
#define ERROR_EXCEPTION_IN_SERVICE
#define ERROR_SERVICE_NOT_IN_EXE
#define ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL
void(WINAPI * LPSERVICE_MAIN_FUNCTIONA)(DWORD, LPSTR *)
VOID(WINAPI * LPHANDLER_FUNCTION)(DWORD)
DWORD(WINAPI * LPHANDLER_FUNCTION_EX)(DWORD, DWORD, LPVOID, LPVOID)
void(WINAPI * LPSERVICE_MAIN_FUNCTIONW)(DWORD, LPWSTR *)
#define SERVICE_CONTROL_STOP