Clean up RPCSS.

svn path=/trunk/; revision=45661
This commit is contained in:
Dmitry Gorbachev
2010-02-22 21:36:07 +00:00
parent 3d06ca1682
commit 41e49f062c
3 changed files with 74 additions and 99 deletions
+1 -1
View File
@@ -58,7 +58,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
static HANDLE exit_event;
HANDLE exit_event;
//extern HANDLE __wine_make_process_system(void);
+8 -3
View File
@@ -1,8 +1,13 @@
Index: rpcss_main.c
===================================================================
--- rpcss_main.c (revision 37240)
+++ rpcss_main.c (working copy)
@@ -62,7 +62,7 @@
--- rpcss_main.c
+++ rpcss_main.c
@@ -58,11 +58,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-static HANDLE exit_event;
+HANDLE exit_event;
//extern HANDLE __wine_make_process_system(void);
+65 -95
View File
@@ -9,120 +9,90 @@
#include "rpcss.h"
BOOL RPCSS_Initialize(void);
BOOL RPCSS_Shutdown(void);
#define NDEBUG
#include <debug.h>
extern BOOL RPCSS_Initialize(void);
extern BOOL RPCSS_Shutdown(void);
extern HANDLE exit_event;
static VOID WINAPI ServiceMain(DWORD, LPWSTR *);
static WCHAR ServiceName[] = L"RpcSs";
typedef struct _ServiceInfo
SERVICE_TABLE_ENTRYW ServiceTable[] =
{
SERVICE_STATUS servStatus;
SERVICE_STATUS_HANDLE hStatus;
} SERVICEINFO, *PSERVICEINFO;
{ ServiceName, ServiceMain },
{ NULL, NULL }
};
static SERVICE_STATUS ServiceStatus;
static SERVICE_STATUS_HANDLE ServiceStatusHandle;
static VOID
UpdateStatus(PSERVICEINFO pServInfo,
DWORD NewStatus,
DWORD Check)
DWORD WINAPI
ServiceControlHandler(DWORD dwControl,
DWORD dwEventType,
LPVOID lpEventData,
LPVOID lpContext)
{
if (Check > 0)
{
pServInfo->servStatus.dwCheckPoint += Check;
}
else
{
pServInfo->servStatus.dwCheckPoint = Check;
}
if (NewStatus > 0)
{
pServInfo->servStatus.dwCurrentState = NewStatus;
}
SetServiceStatus(pServInfo->hStatus, &pServInfo->servStatus);
}
static BOOL
RunService(PSERVICEINFO pServInfo)
{
return RPCSS_Initialize();
}
VOID WINAPI
ServerCtrlHandler(DWORD dwControl,
DWORD dwEventType,
LPVOID lpEventData,
LPVOID lpContext)
{
PSERVICEINFO pServInfo = (PSERVICEINFO)lpContext;
switch (dwControl)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
RPCSS_Shutdown();
pServInfo->servStatus.dwWin32ExitCode = 0;
pServInfo->servStatus.dwWaitHint = 0;
UpdateStatus(pServInfo, SERVICE_STOP_PENDING, 1);
break;
SetEvent(exit_event);
return NO_ERROR;
case SERVICE_CONTROL_INTERROGATE:
return NO_ERROR;
default:
break;
return ERROR_CALL_NOT_IMPLEMENTED;
}
}
VOID WINAPI
ServiceMain(DWORD argc, LPWSTR argv[])
{
SERVICEINFO servInfo;
HANDLE hThread;
DWORD dwThreadId;
DWORD dwError;
servInfo.servStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
servInfo.servStatus.dwCurrentState = SERVICE_STOPPED;
servInfo.servStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN;
servInfo.servStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
servInfo.servStatus.dwServiceSpecificExitCode = 0;
servInfo.servStatus.dwCheckPoint = 0;
servInfo.servStatus.dwWaitHint = 1000;
servInfo.hStatus = RegisterServiceCtrlHandlerExW(ServiceName,
(LPHANDLER_FUNCTION_EX)ServerCtrlHandler,
&servInfo);
if (!servInfo.hStatus) return;
UpdateStatus(&servInfo, SERVICE_START_PENDING, 1);
/* Create worker thread */
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)RunService,
&servInfo,
0,
&dwThreadId);
if (!hThread) return;
/* Set service status to running */
UpdateStatus(&servInfo, SERVICE_RUNNING, 0);
/* Wait until thread has terminated */
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
UpdateStatus(&servInfo, SERVICE_STOPPED, 0);
}
int wmain(int argc, LPWSTR argv [])
{
SERVICE_TABLE_ENTRYW ServiceTable[] =
ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
ServiceControlHandler,
NULL);
if (!ServiceStatusHandle)
{
{ServiceName, ServiceMain},
{NULL, NULL }
};
dwError = GetLastError();
DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError);
return;
}
return (int)(StartServiceCtrlDispatcherW(ServiceTable) != TRUE);
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = 0;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 1000;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
if (RPCSS_Initialize())
{
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
WaitForSingleObject(exit_event, INFINITE);
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
RPCSS_Shutdown();
}
}
int wmain(int argc, LPWSTR argv[])
{
if (!StartServiceCtrlDispatcherW(ServiceTable))
{
DPRINT1("StartServiceCtrlDispatcherW() failed\n");
return 1;
}
return 0;
}