86 TRACE(
"ScCreateStatusBinding()\n");
96 ERR(
"RpcStringBindingCompose returned 0x%x\n",
status);
105 ERR(
"RpcBindingFromStringBinding returned 0x%x\n",
status);
111 ERR(
"RpcStringFree returned 0x%x\n",
status);
123 TRACE(
"ScDestroyStatusBinding()\n");
131 ERR(
"RpcBindingFree returned 0x%x\n",
status);
147 TRACE(
"ScLookupServiceByServiceName(%S)\n",
163 TRACE(
"No service found!\n");
185 Teb->SubProcessTag = 0;
214 Teb->SubProcessTag = 0;
229 DWORD dwBytesWritten;
231 DWORD dwServiceCurrent = 1;
237 TRACE(
"ScConnectControlPipe(%p)\n",
256 ERR(
"RtlQueryRegistryValues() failed (Status %lx)\n",
Status);
262 dwServiceCurrent = 0;
265 swprintf(NtControlPipeName,
L"\\\\.\\pipe\\net\\NtControlPipe%u", dwServiceCurrent);
266 TRACE(
"PipeName: %S\n", NtControlPipeName);
270 ERR(
"WaitNamedPipe(%S) failed (Error %lu)\n", NtControlPipeName,
GetLastError());
283 ERR(
"CreateFileW() failed for pipe %S (Error %lu)\n", NtControlPipeName,
GetLastError());
303 TRACE(
"Sent Process ID %lu\n", dwProcessId);
334 PWSTR pszServiceName;
340 if (ControlPacket ==
NULL || lpArgCount ==
NULL || lpArgVector ==
NULL)
354 cbTotal =
sizeof(
PWSTR) + cbServiceName;
359 cbTotal += cbArguments;
363 if (lpVector ==
NULL)
381 TRACE(
"Unicode lpVector[%lu] = '%ls'\n",
i + 1, lpVector[
i + 1]);
387 memcpy(lpVector[0], pszServiceName, cbServiceName);
388 TRACE(
"Unicode lpVector[%lu] = '%ls'\n", 0, lpVector[0]);
391 *lpArgVector = lpVector;
410 if (ControlPacket ==
NULL || lpArgCount ==
NULL || lpArgVector ==
NULL)
422 lpVectorA = (
PSTR*)lpVectorW;
423 for (
i = 0;
i < ArgCount;
i++)
439 TRACE(
"Ansi lpVector[%lu] = '%s'\n",
i, lpVectorA[
i]);
442 *lpArgCount = ArgCount;
443 *lpArgVector = lpVectorA;
459 TRACE(
"ScStartService(%p %p)\n",
460 lpService, ControlPacket);
462 if (lpService ==
NULL || ControlPacket ==
NULL)
477 if (ThreadParamsW ==
NULL)
495 if (ThreadHandle ==
NULL)
511 if (ThreadParamsA ==
NULL)
529 if (ThreadHandle ==
NULL)
553 TRACE(
"ScControlService(%p %p)\n",
554 lpService, ControlPacket);
556 if (lpService ==
NULL || ControlPacket ==
NULL)
600 TRACE(
"ScControlService() done (Error %lu)\n", dwError);
619 TRACE(
"ScServiceDispatcher(%p %p %lu)\n",
620 hPipe, ControlPacket, dwBufferSize);
633 if (bResult ==
FALSE)
640 TRACE(
"Service: %S\n", lpServiceName);
645 TRACE(
"Stop dispatcher thread\n");
655 if (lpService !=
NULL)
662 TRACE(
"Start command - received SERVICE_CONTROL_START\n");
667 TRACE(
"Stop command - received SERVICE_CONTROL_STOP\n");
691 if (bResult ==
FALSE)
715 TRACE(
"RegisterServiceCtrlHandlerA(%s %p)\n",
745 TRACE(
"RegisterServiceCtrlHandlerW(%s %p)\n",
761 Service->HandlerFunction = lpHandlerProc;
764 TRACE(
"RegisterServiceCtrlHandler returning %p\n",
Service->hServiceStatus);
766 return Service->hServiceStatus;
784 TRACE(
"RegisterServiceCtrlHandlerExA(%s %p %p)\n",
785 debugstr_a(lpServiceName), lpHandlerProc, lpContext);
816 TRACE(
"RegisterServiceCtrlHandlerExW(%s %p %p)\n",
817 debugstr_w(lpServiceName), lpHandlerProc, lpContext);
833 Service->HandlerFunctionEx = lpHandlerProc;
834 Service->HandlerContext = lpContext;
836 TRACE(
"RegisterServiceCtrlHandlerEx returning %p\n",
Service->hServiceStatus);
838 return Service->hServiceStatus;
853 TRACE(
"I_ScIsSecurityProcess()\n");
873 TRACE(
"I_ScPnPGetServiceName(%lu %p %lu)\n",
900 BOOL bUpdateImmediately,
905 TRACE(
"I_ScSetServiceBitsA(%lu %lx %u %u %s)\n",
939 BOOL bUpdateImmediately,
944 TRACE(
"I_ScSetServiceBitsW(%lu %lx %u %u %s)\n",
976 BOOL bUpdateImmediately)
978 TRACE(
"SetServiceBits(%lu %lx %u %u)\n",
1000 TRACE(
"SetServiceStatus(%lu %p)\n",
1016 ERR(
"RSetServiceStatus() failed (Error %lu)\n", dwError);
1021 TRACE(
"SetServiceStatus() done\n");
1042 TRACE(
"StartServiceCtrlDispatcherA(%p)\n",
1043 lpServiceStartTable);
1046 while (lpServiceStartTable[
i].lpServiceProc !=
NULL)
1067 lpServiceStartTable[
i].lpServiceName);
1088 if (ControlPacket ==
NULL)
1107 RtlFreeHeap(RtlGetProcessHeap(), 0, ControlPacket);
1141 TRACE(
"StartServiceCtrlDispatcherW(%p)\n",
1142 lpServiceStartTable);
1145 while (lpServiceStartTable[
i].lpServiceProc !=
NULL)
1166 lpServiceStartTable[
i].lpServiceName);
1187 if (ControlPacket ==
NULL)
1205 RtlFreeHeap(RtlGetProcessHeap(), 0, ControlPacket);
BOOL WINAPI I_ScSetServiceBitsW(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately, LPWSTR lpString)
#define ERROR_INVALID_PARAMETER
RPC_STATUS WINAPI RpcBindingFromStringBindingW(RPC_WSTR StringBinding, RPC_BINDING_HANDLE *Binding)
LPSERVICE_MAIN_FUNCTIONW lpServiceProc
VOID WINAPI I_ScIsSecurityProcess(VOID)
static BOOL ScServiceDispatcher(HANDLE hPipe, PSCM_CONTROL_PACKET ControlPacket, DWORD dwBufferSize)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
void(WINAPI * LPSERVICE_MAIN_FUNCTIONW)(DWORD, LPWSTR *)
DWORD dwServiceNameOffset
static DWORD ScBuildUnicodeArgsVector(PSCM_CONTROL_PACKET ControlPacket, LPDWORD lpArgCount, LPWSTR **lpArgVector)
static PACTIVE_SERVICE lpActiveServices
#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL
struct _SERVICE_THREAD_PARAMSW SERVICE_THREAD_PARAMSW
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
WINE_DEFAULT_DEBUG_CHANNEL(advapi)
RPC_STATUS WINAPI RpcStringFreeW(RPC_WSTR *String)
SERVICE_STATUS_HANDLE hServiceStatus
DWORD WINAPI RI_ScSetServiceBitsA(RPC_SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, int bSetBitsOn, int bUpdateImmediately, char *lpString)
ULONG_PTR RPC_SERVICE_STATUS_HANDLE
static DWORD ScControlService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket)
struct _ACTIVE_SERVICE * PACTIVE_SERVICE
BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
LPSERVICE_MAIN_FUNCTIONW lpServiceMain
#define ERROR_NOT_ENOUGH_MEMORY
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
#define SERVICE_CONTROL_START_SHARE
static DWORD dwActiveServiceCount
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
#define RTL_REGISTRY_CONTROL
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
static DWORD ScBuildAnsiArgsVector(PSCM_CONTROL_PACKET ControlPacket, LPDWORD lpArgCount, LPSTR **lpArgVector)
BOOL WINAPI StartServiceCtrlDispatcherA(const SERVICE_TABLE_ENTRYA *lpServiceStartTable)
RPC_STATUS WINAPI RpcStringBindingComposeW(RPC_WSTR ObjUuid, RPC_WSTR Protseq, RPC_WSTR NetworkAddr, RPC_WSTR Endpoint, RPC_WSTR Options, RPC_WSTR *StringBinding)
LPSERVICE_MAIN_FUNCTIONA A
BOOL WINAPI I_ScSetServiceBitsA(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately, LPSTR lpString)
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA(LPCSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
static BOOL bSecurityServiceProcess
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
static handle_t hStatusBinding
LPSERVICE_MAIN_FUNCTIONA lpServiceProc
#define EXCEPTION_EXECUTE_HANDLER
DWORD WINAPI I_ScPnPGetServiceName(IN SERVICE_STATUS_HANDLE hServiceStatus, OUT LPWSTR lpServiceName, IN DWORD cchServiceName)
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)
DWORD WINAPI RI_ScSetServiceBitsW(RPC_SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, int bSetBitsOn, int bUpdateImmediately, wchar_t *lpString)
static RPC_STATUS ScCreateStatusBinding(VOID)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
#define SERVICE_CONTROL_START_OWN
#define ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
static DWORD ScConnectControlPipe(HANDLE *hPipe)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
handle_t __RPC_USER RPC_SERVICE_STATUS_HANDLE_bind(RPC_SERVICE_STATUS_HANDLE hServiceStatus)
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
#define RpcExceptionCode()
BOOL WINAPI SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus, DWORD dwServiceBits, BOOL bSetBitsOn, BOOL bUpdateImmediately)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
DWORD(WINAPI * LPHANDLER_FUNCTION_EX)(DWORD, DWORD, LPVOID, LPVOID)
BOOL WINAPI SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout)
#define NT_SUCCESS(StatCode)
const unsigned int MAX_SERVICE_NAME_LENGTH
static DWORD WINAPI ScServiceMainStubW(LPVOID Context)
DWORD WINAPI RSetServiceStatus(RPC_SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define ERROR_SERVICE_NOT_IN_EXE
static DWORD WINAPI ScServiceMainStubA(LPVOID Context)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FILE_ATTRIBUTE_NORMAL
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
void(WINAPI * LPSERVICE_MAIN_FUNCTIONA)(DWORD, LPSTR *)
SERVICE_STATUS_HANDLE hServiceStatus
static DWORD ScStartService(PACTIVE_SERVICE lpService, PSCM_CONTROL_PACKET ControlPacket)
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA(LPCSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
#define memcpy(s1, s2, n)
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
SERVICE_STATUS_HANDLE hServiceStatus
struct _SERVICE_THREAD_PARAMSA * PSERVICE_THREAD_PARAMSA
#define PIPE_READMODE_MESSAGE
#define ERROR_EXCEPTION_IN_SERVICE
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
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
#define ERROR_SERVICE_NO_THREAD
LPHANDLER_FUNCTION_EX HandlerFunctionEx
UNICODE_STRING ServiceName
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
struct _SERVICE_THREAD_PARAMSA SERVICE_THREAD_PARAMSA
struct _ACTIVE_SERVICE ACTIVE_SERVICE
LPHANDLER_FUNCTION HandlerFunction
DWORD ScmRpcStatusToWinError(RPC_STATUS Status)
#define ReadFile(a, b, c, d, e)
static RPC_STATUS ScDestroyStatusBinding(VOID)
struct _SERVICE_THREAD_PARAMSW * PSERVICE_THREAD_PARAMSW
VOID(WINAPI * LPHANDLER_FUNCTION)(DWORD)
void __RPC_USER RPC_SERVICE_STATUS_HANDLE_unbind(RPC_SERVICE_STATUS_HANDLE hServiceStatus, handle_t hBinding)
struct tagContext Context
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
LPSERVICE_MAIN_FUNCTIONW W
#define SERVICE_CONTROL_STOP
union _ACTIVE_SERVICE::@309 ServiceMain
#define _SEH2_EXCEPT(...)
struct _SCM_CONTROL_PACKET SCM_CONTROL_PACKET
LPSERVICE_MAIN_FUNCTIONA lpServiceMain
#define RTL_QUERY_REGISTRY_REQUIRED
static SERVICE_STATUS status
#define HeapFree(x, y, z)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define RTL_QUERY_REGISTRY_DIRECT
static PACTIVE_SERVICE ScLookupServiceByServiceName(LPCWSTR lpServiceName)
DWORD WINAPI GetCurrentProcessId(VOID)