627 lines
12 KiB
C++
627 lines
12 KiB
C++
/*++
|
||
|
||
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
|