|
|
/*++
Copyright (c) 1998 - 2000 Microsoft Corporation
Module Name:
main.cpp
Abstract:
Contains: 1. Module startup routines 2. Component activation routines 3. Component deactivation routines 4. Module shutdown/cleanup routines 5. Auxiliary routines
Revision History: 1. 31-Jul-1998 -- File creation Ajay Chitturi (ajaych) 2. 15-Jul-1999 -- Arlie Davis (arlied) 3. 14-Feb-2000 -- Added support for multiple Ilya Kleyman (ilyak) private interfaces
--*/
#include "stdafx.h"
///////////////////////////////////////////////////////////////////////////////
// //
// Global Variables //
// //
///////////////////////////////////////////////////////////////////////////////
HANDLE NatHandle = NULL;
///////////////////////////////////////////////////////////////////////////////
// //
// Static declarations //
// //
///////////////////////////////////////////////////////////////////////////////
static void QueryRegistry ( void );
static HRESULT H323ProxyStartServiceInternal ( void );
static HRESULT H323ProxyStart ( void );
static HRESULT LdapProxyStart ( void );
static void H323ProxyStop ( void );
static void LdapProxyStop ( void );
///////////////////////////////////////////////////////////////////////////////
// //
// Module startup routines //
// //
///////////////////////////////////////////////////////////////////////////////
EXTERN_C BOOLEAN H323ProxyInitializeModule ( void ) /*++
Routine Description: Initializes module. Arguments: None Return Values: TRUE - if initialization was successful FALSE - if initialization failed
Notes: Equivalent to DLL_PROCESS_ATTACH --*/
{ Debug (_T("H323: DLL_PROCESS_ATTACH.\n"));
H323ASN1Initialize();
return TRUE; } // H323ProxyInitializeModule
EXTERN_C ULONG H323ProxyStartService ( void ) /*++
Routine Description: Starts the service Arguments: None Return Values: Win32 error code
Notes: Module entry point --*/
{ HRESULT Result;
Debug (_T("H323: starting...\n"));
Result = H323ProxyStartServiceInternal();
if (Result == S_OK) { DebugF (_T("H323: H.323/LDAP proxy has initialized successfully.\n")); return ERROR_SUCCESS; } else { DebugError (Result, _T("H323: H.323/LDAP proxy has FAILED to initialize.\n")); return ERROR_CAN_NOT_COMPLETE; } } // H323ProxyStartService
///////////////////////////////////////////////////////////////////////////////
// //
// Component activation routines //
// //
///////////////////////////////////////////////////////////////////////////////
static HRESULT H323ProxyStartServiceInternal ( void ) /*++
Routine Description:
Initializes all components.
Arguments: None.
Return Values:
Returns S_OK in case of success or an error in case of failure.
Notes: Internal version of DLL entry point
--*/
{ WSADATA WsaData; HRESULT Result;
QueryRegistry ();
// Initialize WinSock
Result = WSAStartup (MAKEWORD (2, 0), &WsaData); if (S_OK == Result) {
// Initialize allocator of call reference values
Result = InitCrvAllocator(); if (S_OK == Result) {
// initialize NAT
Result = NatInitializeTranslator (&NatHandle); if (S_OK == Result) {
// Initialize Port Pool
Result = PortPoolStart (); if (S_OK == Result) {
// Initialize H.323 Proxy
Result = H323ProxyStart (); if (S_OK == Result) {
// Initialize LDAP Proxy
Result = LdapProxyStart (); if (S_OK == Result) {
return S_OK; } H323ProxyStop (); }
PortPoolStop (); }
NatShutdownTranslator (NatHandle); NatHandle = NULL; }
CleanupCrvAllocator (); }
WSACleanup (); }
return Result; } // H323ProxyStartServiceInternal
HRESULT H323ProxyStart ( void ) /*++
Routine Description:
Initializes components of H.323 proxy
Arguments:
None
Return Values:
S_OK if successful, error code otherwise.
Notes:
--*/
{ HRESULT Result;
Result = Q931SyncCounter.Start (); if (S_OK == Result) {
CallBridgeList.Start (); Result = Q931CreateBindSocket (); if (S_OK == Result) {
Result = Q931StartLoopbackRedirect (); if (S_OK == Result) {
return S_OK;
}
Q931CloseSocket (); CallBridgeList.Stop (); }
Q931SyncCounter.Wait (INFINITE); Q931SyncCounter.Stop (); }
return Result; } // H323ProxyStart
HRESULT LdapProxyStart ( void ) /*++
Routine Description:
Initializes components of LDAP proxy
Arguments:
None
Return Values:
S_OK if successful, error code otherwise
Notes:
--*/
{ HRESULT Status;
Status = LdapSyncCounter.Start (); if (S_OK == Status) {
Status = LdapCoder.Start(); if (S_OK == Status) {
Status = LdapTranslationTable.Start (); if (S_OK == Status) {
LdapConnectionArray.Start (); Status = LdapAccept.Start (); if (S_OK == Status) {
return S_OK; }
LdapConnectionArray.Stop (); LdapTranslationTable.Stop (); }
LdapCoder.Stop (); } LdapSyncCounter.Wait (INFINITE);
LdapSyncCounter.Stop (); }
return Status; } // LdapProxyStart
EXTERN_C ULONG H323ProxyActivateInterface( IN ULONG Index, IN H323_INTERFACE_TYPE InterfaceType, IN PIP_ADAPTER_BINDING_INFO BindingInfo ) /*++
Routine Description:
Activates an interface for H.323/LDAP
Arguments: Index - Interface index (for internal use) BindingInfo - Interface binding information
Return Values:
Win32 error code
Notes:
Module entry point
--*/
{ ULONG Error;
DebugF (_T("H323: Request to activate interface with adapter index %d.\n"), Index);
if (!BindingInfo->AddressCount || !BindingInfo->Address[0].Address || Index == INVALID_INTERFACE_INDEX) {
return ERROR_INVALID_PARAMETER; }
Error = InterfaceArray.AddStartInterface (Index, InterfaceType, BindingInfo);
return Error; } // H323ProxyActivateInterface
///////////////////////////////////////////////////////////////////////////////
// //
// Module shutdown routines //
// //
///////////////////////////////////////////////////////////////////////////////
EXTERN_C void H323ProxyCleanupModule ( void ) /*++
Routine Description: Shuts down module Arguments: None Return Values: None
Notes: Equivalent to DLL_PROCESS_DETACH --*/
{ Debug (_T("H323: DLL_PROCESS_DETACH\n"));
H323ASN1Shutdown ();
} // H323ProxyCleanupModule
EXTERN_C void H323ProxyStopService ( void ) /*++
Routine Description: Stops the service Arguments: None Return Values: None
Notes: Module entry point --*/
{ LdapProxyStop ();
H323ProxyStop ();
InterfaceArray.AssertShutdownReady ();
InterfaceArray.Stop ();
PortPoolStop ();
if (NatHandle) { NatShutdownTranslator (NatHandle); NatHandle = NULL; }
CleanupCrvAllocator ();
WSACleanup ();
Debug (_T("H323: service has stopped\n")); } // H323ProxyStopService
void H323ProxyStop ( void ) /*++
Routine Description: Stops H.323 proxy and waits until all call-bridges are deleted. Arguments: None Return Values: None
Notes:
--*/
{ Q931StopLoopbackRedirect ();
Q931CloseSocket ();
CallBridgeList.Stop ();
Q931SyncCounter.Wait (INFINITE); Q931SyncCounter.Stop (); } // H323ProxyStop
void LdapProxyStop ( void) /*++
Routine Description: LdapProxyStop is responsible for undoing all of the work that LdapProxyStart performed. It deletes the NAT redirect, deletes all LDAP connections (or, at least, it releases them -- they may not delete themselves yet if they have pending I/O or timer callbacks), and disables the creation of new LDAP connections. Arguments: None Return Values: None
Notes:
--*/
{ LdapAccept.Stop ();
LdapConnectionArray.Stop ();
LdapTranslationTable.Stop ();
LdapCoder.Stop();
LdapSyncCounter.Wait (INFINITE);
LdapSyncCounter.Stop (); } // LdapProxyStop
///////////////////////////////////////////////////////////////////////////////
// //
// Component deactivation routines //
// //
///////////////////////////////////////////////////////////////////////////////
EXTERN_C VOID H323ProxyDeactivateInterface ( IN ULONG Index ) /*++
Routine Description: Deactivates interface for H.323/LDAP Arguments: Index -- Interface index, previously passed to the interface activation routine Return Values: None
Notes: Module entry point --*/
{ DebugF (_T("H323: DeactivateInterface called, index %d\n"), Index);
InterfaceArray.RemoveStopInterface (Index); } // H323ProxyDeactivateInterface
///////////////////////////////////////////////////////////////////////////////
// //
// Auxiliary routines //
// //
///////////////////////////////////////////////////////////////////////////////
static void QueryRegistry ( void ) /*++
Routine Description: Queries Registry for the values needed in module operations Arguments: None Return Values: None
Notes: static --*/
{ HKEY Key; HRESULT Result;
Result = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, H323ICS_SERVICE_PARAMETERS_KEY_PATH, 0, KEY_READ, &Key );
if (ERROR_SUCCESS == Result) {
Result = RegQueryValueDWORD (Key, H323ICS_REG_VAL_LOCAL_H323_ROUTING, &EnableLocalH323Routing);
if (ERROR_SUCCESS != Result) {
EnableLocalH323Routing = FALSE;
}
RegCloseKey (Key);
} else {
EnableLocalH323Routing = FALSE;
}
DebugF (_T("H323: Local H323 routing is %sabled.\n"), EnableLocalH323Routing ? _T("en") : _T("dis"));
} // QueryRegistry
|