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.
 
 
 
 
 
 

289 lines
5.9 KiB

/*++
Copyright (C) 1992-98 Microsft Corporation. All rights reserved.
Module Name:
dllinit.c
Abstract:
This file contains init code called from DLL's init routine
Author:
Gurdeep Singh Pall (gurdeep) 06-Jun-1997
Revision History:
Miscellaneous Modifications - raos 31-Dec-1997
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <rasman.h>
#include <wanpub.h>
#include <ntlsa.h>
#include <ntmsv1_0.h>
#include <raserror.h>
#include <rasppp.h>
#include <media.h>
#include <devioctl.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "defs.h"
#include "structs.h"
#include "protos.h"
#include "globals.h"
/*++
Routine Description
Function: Used to close any open ports when rasman exits
Arguments
Return Value
FALSE to allow other handlers to run.
--*/
BOOL
HandlerRoutine (DWORD ctrltype)
{
WORD i ;
BYTE buffer [10] ;
if (ctrltype == CTRL_SHUTDOWN_EVENT)
{
}
return FALSE ;
}
/*++
Routine Description
Used to check if the service is already running: if not,
to start it.
Arguments
Return Value
SUCCESS
1 (failure to start)
Error codes from service control APIs. "
--*/
/*
DWORD
RasmanServiceCheck()
{
SC_HANDLE schandle ;
SC_HANDLE svchandle ;
SERVICE_STATUS status ;
STARTUPINFO startupinfo ;
//
// If this is the Service DLL attaching, let it: no
// initializations required. NOTE: We do not increment
// AttachedCount for RASMAN service: its used *only*
// for rasman client processes like UI, Gateway, etc.
//
GetStartupInfo(&startupinfo) ;
if (strstr (startupinfo.lpTitle, SCREG_EXE_NAME) != NULL)
{
return SUCCESS ;
}
if (strstr (startupinfo.lpTitle, RASMAN_EXE_NAME) != NULL)
{
SetConsoleCtrlHandler (HandlerRoutine, TRUE) ;
return SUCCESS ;
}
//
// This is put in as a work-around for the SC bug which
// does not allow OpenService call to be made when
// Remoteaccess is starting
//
if (strstr (startupinfo.lpTitle, "rassrv.exe") != NULL)
{
return SUCCESS ;
}
//
// Get handles to check status of service and (if it
// is not started -) to start it.
//
if ( !(schandle = OpenSCManager(
NULL,
NULL,
SC_MANAGER_CONNECT))
|| !(svchandle = OpenService(
schandle,
RASMAN_SERVICE_NAME,
SERVICE_START
|SERVICE_QUERY_STATUS)))
{
DWORD retcode;
retcode = GetLastError();
#if DBG
RasmanOutputDebug("RASMAN: Failed to openservice %s. error=%d\n",
RASMAN_SERVICE_NAME,
retcode );
#endif
if (ERROR_SERVICE_DOES_NOT_EXIST == retcode)
{
#if DBG
RasmanOutputDebug ("RASMAN: RAS is not installed. %d\n",
retcode);
#endif
//
// let rasman.dll load eventhough RAS is not
// installed. Any Ras call when made through
// this dll will fail with rasman service not
// installed error.
//
return SUCCESS;
}
return retcode;
}
//
// Check if service is already starting:
//
if (QueryServiceStatus(svchandle,&status) == FALSE)
{
DWORD retcode;
retcode = GetLastError();
#if DBG
RasmanOutputDebug ("RASMAN: Failed to query rasman. %d\n",
retcode );
#endif
return retcode;
}
switch (status.dwCurrentState)
{
case SERVICE_STOPPED:
break ;
case SERVICE_START_PENDING:
case SERVICE_RUNNING:
break ;
default:
return 1 ;
}
CloseServiceHandle (schandle) ;
CloseServiceHandle (svchandle) ;
return SUCCESS ;
} */
/*++
Routine Description
Waits until the rasman service is stopped before returning.
Arguments
Return Value
Nothing.
--*/
VOID
WaitForRasmanServiceStop ()
{
SC_HANDLE schandle = NULL;
SC_HANDLE svchandle = NULL;
SERVICE_STATUS status ;
DWORD i;
//
// Get handles to check status of service
//
if ( !(schandle = OpenSCManager(
NULL,
NULL,
SC_MANAGER_CONNECT))
|| !(svchandle = OpenService(
schandle,
RASMAN_SERVICE_NAME,
SERVICE_START
| SERVICE_QUERY_STATUS)))
{
GetLastError() ;
goto done ;
}
//
// Loop here for the service to stop.
//
for (i = 0; i < 60; i++)
{
//
// Check if service is already starting:
//
if (QueryServiceStatus(svchandle,&status) == FALSE)
{
GetLastError () ;
goto done ;
}
switch (status.dwCurrentState)
{
case SERVICE_STOPPED:
goto done ;
case SERVICE_STOP_PENDING:
case SERVICE_RUNNING:
Sleep (250L) ;
break ;
default:
goto done ;
}
}
done:
if(NULL != schandle)
{
CloseServiceHandle(schandle);
}
if(NULL != svchandle)
{
CloseServiceHandle(svchandle);
}
return;
}