Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
3.6 KiB

//*************************************************************
//
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// main.cxx
//
//*************************************************************
#include "appmgext.hxx"
static SERVICE_STATUS gServiceStatus;
static SERVICE_STATUS_HANDLE ghServiceHandle;
static HINSTANCE ghInstAppmgmt;
extern "C" void
ServiceHandler(
DWORD OpCode
);
void
UpdateState(
DWORD NewState
);
extern "C" void
ServiceMain(
DWORD argc,
LPWSTR argv[]
)
{
DWORD Status;
BOOL bStatus;
Status = ERROR_SUCCESS;
if ( ! gbInitialized )
Initialize();
InitDebugSupport( DEBUGMODE_SERVICE );
VerboseDebugDump( L"Entering ServiceMain" );
gServiceStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
gServiceStatus.dwCurrentState = SERVICE_START_PENDING;
gServiceStatus.dwControlsAccepted = 0;
gServiceStatus.dwWin32ExitCode = 0;
gServiceStatus.dwServiceSpecificExitCode = 0;
gServiceStatus.dwCheckPoint = 0;
gServiceStatus.dwWaitHint = 10000L;
ghServiceHandle = RegisterServiceCtrlHandler( L"APPMGMT", ServiceHandler );
if ( ! ghServiceHandle )
Status = GetLastError();
if ( ERROR_SUCCESS == Status )
{
//
// SD is null indicating that RPC should pick a default DACL.
// which should be everybody can call and nobody can change this
// permission
//
Status = RpcServerUseProtseqEp(
L"ncalrpc",
RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
L"appmgmt",
NULL );
}
if ( ERROR_SUCCESS == Status )
Status = RpcServerRegisterIf( appmgmt_ServerIfHandle, NULL, NULL );
if ( Status != ERROR_SUCCESS )
{
gServiceStatus.dwWin32ExitCode = Status;
UpdateState( SERVICE_STOPPED );
return;
}
InitializeCriticalSection( &gAppCS );
UpdateState( SERVICE_RUNNING );
}
extern "C" void
ServiceHandler(
DWORD OpCode
)
{
RPC_STATUS status;
switch( OpCode )
{
case SERVICE_CONTROL_STOP:
// Not registered for this control.
break;
case SERVICE_CONTROL_INTERROGATE:
// Service controller wants us to call SetServiceStatus.
UpdateState( gServiceStatus.dwCurrentState );
break ;
case SERVICE_CONTROL_SHUTDOWN:
// Not registered for this control.
break;
// case SERVICE_CONTROL_PAUSE:
// case SERVICE_CONTROL_CONTINUE:
default:
break;
}
return;
}
void
UpdateState(
DWORD NewState
)
{
DWORD Status = ERROR_SUCCESS;
switch ( NewState )
{
case SERVICE_RUNNING:
case SERVICE_STOPPED:
gServiceStatus.dwCheckPoint = 0;
gServiceStatus.dwWaitHint = 0;
break;
case SERVICE_START_PENDING:
case SERVICE_STOP_PENDING:
++gServiceStatus.dwCheckPoint;
gServiceStatus.dwWaitHint = 30000L;
break;
default:
ASSERT(0);
return;
}
gServiceStatus.dwCurrentState = NewState;
SetServiceStatus( ghServiceHandle, &gServiceStatus );
// We could return a status but how would we recover? Ignore it, the
// worst thing is that services will kill us and there's nothing
// we can about it if this call fails.
}
void * midl_user_allocate( size_t len )
{
return (void *) LocalAlloc( 0, len );
}
void midl_user_free( void * ptr )
{
LocalFree(ptr);
}