mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 13:45:58 +00:00
Added some experimental code
svn path=/trunk/; revision=3269
This commit is contained in:
parent
db6e84c404
commit
951f903bda
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: scm.c,v 1.8 2001/10/21 19:06:42 chorns Exp $
|
/* $Id: scm.c,v 1.9 2002/07/20 13:31:34 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -369,11 +369,12 @@ LockServiceDatabase(
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* OpenSCManagerA
|
* OpenSCManagerA
|
||||||
*/
|
*/
|
||||||
SC_HANDLE STDCALL OpenSCManagerA(LPCSTR lpMachineName,
|
SC_HANDLE STDCALL
|
||||||
|
OpenSCManagerA(LPCSTR lpMachineName,
|
||||||
LPCSTR lpDatabaseName,
|
LPCSTR lpDatabaseName,
|
||||||
DWORD dwDesiredAccess)
|
DWORD dwDesiredAccess)
|
||||||
{
|
{
|
||||||
SC_HANDLE h;
|
SC_HANDLE Handle;
|
||||||
UNICODE_STRING MachineNameW;
|
UNICODE_STRING MachineNameW;
|
||||||
UNICODE_STRING DatabaseNameW;
|
UNICODE_STRING DatabaseNameW;
|
||||||
ANSI_STRING MachineNameA;
|
ANSI_STRING MachineNameA;
|
||||||
|
@ -388,7 +389,7 @@ SC_HANDLE STDCALL OpenSCManagerA(LPCSTR lpMachineName,
|
||||||
&DatabaseNameA,
|
&DatabaseNameA,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
|
||||||
h = OpenSCManagerW(MachineNameW.Buffer,
|
Handle = OpenSCManagerW(MachineNameW.Buffer,
|
||||||
DatabaseNameW.Buffer,
|
DatabaseNameW.Buffer,
|
||||||
dwDesiredAccess);
|
dwDesiredAccess);
|
||||||
|
|
||||||
|
@ -399,14 +400,15 @@ SC_HANDLE STDCALL OpenSCManagerA(LPCSTR lpMachineName,
|
||||||
0,
|
0,
|
||||||
DatabaseNameW.Buffer);
|
DatabaseNameW.Buffer);
|
||||||
|
|
||||||
return(h);
|
return(Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* OpenSCManagerW
|
* OpenSCManagerW
|
||||||
*/
|
*/
|
||||||
SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName,
|
SC_HANDLE STDCALL
|
||||||
|
OpenSCManagerW(LPCWSTR lpMachineName,
|
||||||
LPCWSTR lpDatabaseName,
|
LPCWSTR lpDatabaseName,
|
||||||
DWORD dwDesiredAccess)
|
DWORD dwDesiredAccess)
|
||||||
{
|
{
|
||||||
|
@ -522,16 +524,13 @@ SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName,
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* OpenServiceA
|
* OpenServiceA
|
||||||
*/
|
*/
|
||||||
SC_HANDLE
|
SC_HANDLE STDCALL
|
||||||
STDCALL
|
OpenServiceA(SC_HANDLE hSCManager,
|
||||||
OpenServiceA(
|
|
||||||
SC_HANDLE hSCManager,
|
|
||||||
LPCSTR lpServiceName,
|
LPCSTR lpServiceName,
|
||||||
DWORD dwDesiredAccess
|
DWORD dwDesiredAccess)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
return NULL;
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: sctrl.c,v 1.3 2001/10/21 19:06:42 chorns Exp $
|
/* $Id: sctrl.c,v 1.4 2002/07/20 13:31:34 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -15,14 +15,19 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
/* TYPES *********************************************************************/
|
/* TYPES *********************************************************************/
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
DWORD ThreadId;
|
DWORD ThreadId;
|
||||||
UNICODE_STRING ServiceName;
|
UNICODE_STRING ServiceName;
|
||||||
|
LPSERVICE_MAIN_FUNCTION MainFunction;
|
||||||
|
LPHANDLER_FUNCTION HandlerFunction;
|
||||||
SERVICE_STATUS ServiceStatus;
|
SERVICE_STATUS ServiceStatus;
|
||||||
LPHANDLER_FUNCTION Handler;
|
|
||||||
} ACTIVE_SERVICE, *PACTIVE_SERVICE;
|
} ACTIVE_SERVICE, *PACTIVE_SERVICE;
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
@ -33,9 +38,28 @@ static PHANDLE ActiveServicesThreadHandles;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
PACTIVE_SERVICE
|
|
||||||
ScLookupServiceByThreadId(
|
static PACTIVE_SERVICE
|
||||||
DWORD ThreadId)
|
ScLookupServiceByServiceName(LPWSTR lpServiceName)
|
||||||
|
{
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
for (i = 0; i < ActiveServiceCount; i++)
|
||||||
|
{
|
||||||
|
if (wcsicmp(ActiveServices[i].ServiceName.Buffer, lpServiceName) == 0)
|
||||||
|
{
|
||||||
|
return(&ActiveServices[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLastError(ERROR_SERVICE_DOES_NOT_EXIST);
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PACTIVE_SERVICE
|
||||||
|
ScLookupServiceByThreadId(DWORD ThreadId)
|
||||||
{
|
{
|
||||||
DWORD i;
|
DWORD i;
|
||||||
|
|
||||||
|
@ -43,18 +67,74 @@ ScLookupServiceByThreadId(
|
||||||
{
|
{
|
||||||
if (ActiveServices[i].ThreadId == ThreadId)
|
if (ActiveServices[i].ThreadId == ThreadId)
|
||||||
{
|
{
|
||||||
return &ActiveServices[i];
|
return(&ActiveServices[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
SetLastError(ERROR_SERVICE_DOES_NOT_EXIST);
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DWORD
|
static DWORD
|
||||||
WINAPI
|
ScConnectControlPipe(HANDLE *hPipe)
|
||||||
ScServiceMainStub(
|
{
|
||||||
LPVOID Context)
|
DWORD dwBytesWritten;
|
||||||
|
DWORD dwProcessId;
|
||||||
|
DWORD dwState;
|
||||||
|
|
||||||
|
WaitNamedPipeW(L"\\\\.\\pipe\\net\\NtControlPipe",
|
||||||
|
15000);
|
||||||
|
|
||||||
|
*hPipe = CreateFileW(L"\\\\.\\pipe\\net\\NtControlPipe",
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (*hPipe == INVALID_HANDLE_VALUE)
|
||||||
|
return(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT);
|
||||||
|
|
||||||
|
dwState = PIPE_READMODE_MESSAGE;
|
||||||
|
if (!SetNamedPipeHandleState(*hPipe, &dwState, NULL, NULL))
|
||||||
|
{
|
||||||
|
CloseHandle(hPipe);
|
||||||
|
*hPipe = INVALID_HANDLE_VALUE;
|
||||||
|
return(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
dwProcessId = GetCurrentProcessId();
|
||||||
|
WriteFile(*hPipe,
|
||||||
|
&dwProcessId,
|
||||||
|
sizeof(DWORD),
|
||||||
|
&dwBytesWritten,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return(ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
ScServiceDispatcher(HANDLE hPipe, PVOID p1, PVOID p2)
|
||||||
|
{
|
||||||
|
DPRINT1("ScDispatcherLoop() called\n");
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
/* Read command from the control pipe */
|
||||||
|
|
||||||
|
/* Execute command */
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD WINAPI
|
||||||
|
ScServiceMainStub(LPVOID Context)
|
||||||
{
|
{
|
||||||
LPSERVICE_MAIN_FUNCTION lpServiceProc = (LPSERVICE_MAIN_FUNCTION)Context;
|
LPSERVICE_MAIN_FUNCTION lpServiceProc = (LPSERVICE_MAIN_FUNCTION)Context;
|
||||||
|
|
||||||
|
@ -69,11 +149,10 @@ ScServiceMainStub(
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* RegisterServiceCtrlHandlerA
|
* RegisterServiceCtrlHandlerA
|
||||||
*/
|
*/
|
||||||
SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerA(
|
SERVICE_STATUS_HANDLE STDCALL
|
||||||
LPCSTR lpServiceName,
|
RegisterServiceCtrlHandlerA(LPCSTR lpServiceName,
|
||||||
LPHANDLER_FUNCTION lpHandlerProc)
|
LPHANDLER_FUNCTION lpHandlerProc)
|
||||||
{
|
{
|
||||||
|
|
||||||
ANSI_STRING ServiceNameA;
|
ANSI_STRING ServiceNameA;
|
||||||
UNICODE_STRING ServiceNameU;
|
UNICODE_STRING ServiceNameU;
|
||||||
SERVICE_STATUS_HANDLE SHandle;
|
SERVICE_STATUS_HANDLE SHandle;
|
||||||
|
@ -82,7 +161,7 @@ SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerA(
|
||||||
if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&ServiceNameU, &ServiceNameA, TRUE)))
|
if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&ServiceNameU, &ServiceNameA, TRUE)))
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_OUTOFMEMORY);
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
return (SERVICE_STATUS_HANDLE)0;
|
return((SERVICE_STATUS_HANDLE)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SHandle = RegisterServiceCtrlHandlerW(ServiceNameU.Buffer,
|
SHandle = RegisterServiceCtrlHandlerW(ServiceNameU.Buffer,
|
||||||
|
@ -97,26 +176,29 @@ SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerA(
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* RegisterServiceCtrlHandlerW
|
* RegisterServiceCtrlHandlerW
|
||||||
*/
|
*/
|
||||||
SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerW(
|
SERVICE_STATUS_HANDLE STDCALL
|
||||||
LPCWSTR lpServiceName,
|
RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName,
|
||||||
LPHANDLER_FUNCTION lpHandlerProc)
|
LPHANDLER_FUNCTION lpHandlerProc)
|
||||||
{
|
{
|
||||||
PACTIVE_SERVICE Service;
|
PACTIVE_SERVICE Service;
|
||||||
|
|
||||||
/* FIXME: Locate active service entry from name */
|
Service = ScLookupServiceByServiceName((LPWSTR)lpServiceName);
|
||||||
|
if (Service == NULL)
|
||||||
|
{
|
||||||
|
return((SERVICE_STATUS_HANDLE)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
Service = &ActiveServices[0];
|
Service->HandlerFunction = lpHandlerProc;
|
||||||
|
|
||||||
Service->Handler = lpHandlerProc;
|
return((SERVICE_STATUS_HANDLE)Service->ThreadId);
|
||||||
|
|
||||||
return (SERVICE_STATUS_HANDLE)Service->ThreadId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* SetServiceBits
|
* SetServiceBits
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus,
|
BOOL STDCALL
|
||||||
|
SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus,
|
||||||
DWORD dwServiceBits,
|
DWORD dwServiceBits,
|
||||||
BOOL bSetBitsOn,
|
BOOL bSetBitsOn,
|
||||||
BOOL bUpdateImmediately)
|
BOOL bUpdateImmediately)
|
||||||
|
@ -129,13 +211,10 @@ BOOL STDCALL SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus,
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* SetServiceObjectSecurity
|
* SetServiceObjectSecurity
|
||||||
*/
|
*/
|
||||||
WINBOOL
|
WINBOOL STDCALL
|
||||||
STDCALL
|
SetServiceObjectSecurity(SC_HANDLE hService,
|
||||||
SetServiceObjectSecurity(
|
|
||||||
SC_HANDLE hService,
|
|
||||||
SECURITY_INFORMATION dwSecurityInformation,
|
SECURITY_INFORMATION dwSecurityInformation,
|
||||||
PSECURITY_DESCRIPTOR lpSecurityDescriptor
|
PSECURITY_DESCRIPTOR lpSecurityDescriptor)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -145,10 +224,8 @@ SetServiceObjectSecurity(
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* SetServiceStatus
|
* SetServiceStatus
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL STDCALL
|
||||||
STDCALL
|
SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,
|
||||||
SetServiceStatus(
|
|
||||||
SERVICE_STATUS_HANDLE hServiceStatus,
|
|
||||||
LPSERVICE_STATUS lpServiceStatus)
|
LPSERVICE_STATUS lpServiceStatus)
|
||||||
{
|
{
|
||||||
PACTIVE_SERVICE Service;
|
PACTIVE_SERVICE Service;
|
||||||
|
@ -157,22 +234,22 @@ SetServiceStatus(
|
||||||
if (!Service)
|
if (!Service)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
return FALSE;
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlCopyMemory(
|
RtlCopyMemory(&Service->ServiceStatus,
|
||||||
&Service->ServiceStatus,
|
|
||||||
lpServiceStatus,
|
lpServiceStatus,
|
||||||
sizeof(SERVICE_STATUS));
|
sizeof(SERVICE_STATUS));
|
||||||
|
|
||||||
return TRUE;
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* StartServiceCtrlDispatcherA
|
* StartServiceCtrlDispatcherA
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL StartServiceCtrlDispatcherA(
|
BOOL STDCALL
|
||||||
LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
|
StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
|
||||||
{
|
{
|
||||||
LPSERVICE_TABLE_ENTRYW ServiceStartTableW;
|
LPSERVICE_TABLE_ENTRYW ServiceStartTableW;
|
||||||
ANSI_STRING ServiceNameA;
|
ANSI_STRING ServiceNameA;
|
||||||
|
@ -188,8 +265,7 @@ BOOL STDCALL StartServiceCtrlDispatcherA(
|
||||||
}
|
}
|
||||||
Count = i;
|
Count = i;
|
||||||
|
|
||||||
ServiceStartTableW = RtlAllocateHeap(
|
ServiceStartTableW = RtlAllocateHeap(RtlGetProcessHeap(),
|
||||||
RtlGetProcessHeap(),
|
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
sizeof(SERVICE_TABLE_ENTRYW) * Count);
|
sizeof(SERVICE_TABLE_ENTRYW) * Count);
|
||||||
for (i = 0; i < Count; i++)
|
for (i = 0; i < Count; i++)
|
||||||
|
@ -234,13 +310,17 @@ BOOL STDCALL StartServiceCtrlDispatcherA(
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* StartServiceCtrlDispatcherW
|
* StartServiceCtrlDispatcherW
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL StartServiceCtrlDispatcherW(
|
BOOL STDCALL
|
||||||
LPSERVICE_TABLE_ENTRYW lpServiceStartTable)
|
StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW lpServiceStartTable)
|
||||||
{
|
{
|
||||||
ULONG i;
|
ULONG i;
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
DWORD Tid;
|
DWORD Tid;
|
||||||
DWORD r;
|
DWORD r;
|
||||||
|
HANDLE hPipe;
|
||||||
|
DWORD dwError;
|
||||||
|
|
||||||
|
DPRINT1("StartServiceCtrlDispatcherW() called\n");
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (lpServiceStartTable[i].lpServiceProc != NULL)
|
while (lpServiceStartTable[i].lpServiceProc != NULL)
|
||||||
|
@ -249,26 +329,45 @@ BOOL STDCALL StartServiceCtrlDispatcherW(
|
||||||
}
|
}
|
||||||
|
|
||||||
ActiveServiceCount = i;
|
ActiveServiceCount = i;
|
||||||
ActiveServices = RtlAllocateHeap(
|
ActiveServices = RtlAllocateHeap(RtlGetProcessHeap(),
|
||||||
RtlGetProcessHeap(),
|
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
ActiveServiceCount *
|
ActiveServiceCount * sizeof(ACTIVE_SERVICE));
|
||||||
sizeof(ACTIVE_SERVICE));
|
if (ActiveServices == NULL)
|
||||||
if (!ActiveServices)
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActiveServicesThreadHandles = RtlAllocateHeap(
|
/* Copy service names and start procedure */
|
||||||
RtlGetProcessHeap(),
|
for (i = 0; i < ActiveServiceCount; i++)
|
||||||
|
{
|
||||||
|
RtlCreateUnicodeString(&ActiveServices[i].ServiceName,
|
||||||
|
lpServiceStartTable[i].lpServiceName);
|
||||||
|
ActiveServices[i].MainFunction = lpServiceStartTable[i].lpServiceProc;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwError = ScConnectControlPipe(&hPipe);
|
||||||
|
if (dwError = ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
/* FIXME: free the service table */
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScServiceDispatcher(hPipe, NULL, NULL);
|
||||||
|
CloseHandle(hPipe);
|
||||||
|
|
||||||
|
/* FIXME: free the service table */
|
||||||
|
|
||||||
|
return(TRUE);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
ActiveServicesThreadHandles = RtlAllocateHeap(RtlGetProcessHeap(),
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
(ActiveServiceCount + 1) *
|
(ActiveServiceCount + 1) * sizeof(HANDLE));
|
||||||
sizeof(HANDLE));
|
|
||||||
if (!ActiveServicesThreadHandles)
|
if (!ActiveServicesThreadHandles)
|
||||||
{
|
{
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, ActiveServices);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, ActiveServices);
|
||||||
ActiveServices = NULL;
|
ActiveServices = NULL;
|
||||||
return FALSE;
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i<ActiveServiceCount; i++)
|
for (i = 0; i<ActiveServiceCount; i++)
|
||||||
|
@ -321,6 +420,7 @@ BOOL STDCALL StartServiceCtrlDispatcherW(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue