364 lines
7.2 KiB
C
364 lines
7.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992-1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
H323.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Entry point for H323 TAPI Service Provider.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Include files //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include "globals.h"
|
|||
|
#include "provider.h"
|
|||
|
#include "config.h"
|
|||
|
#include "line.h"
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Global variables //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
CRITICAL_SECTION g_GlobalLock;
|
|||
|
HINSTANCE g_hInstance;
|
|||
|
WCHAR * g_pwszProviderInfo = NULL;
|
|||
|
WCHAR * g_pwszLineName = NULL;
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private prototypes //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
CCDllMain(
|
|||
|
PVOID DllHandle,
|
|||
|
ULONG Reason,
|
|||
|
LPVOID lpReserved
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
H245DllMain(
|
|||
|
PVOID DllHandle,
|
|||
|
ULONG Reason,
|
|||
|
LPVOID lpReserved
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
H245WSDllMain(
|
|||
|
PVOID DllHandle,
|
|||
|
ULONG Reason,
|
|||
|
LPVOID lpReserved
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
BOOL
|
|||
|
H323LoadStrings(
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Loads strings from resource table.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns true if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DWORD dwNumBytes;
|
|||
|
DWORD dwNumChars;
|
|||
|
WCHAR wszBuffer[256];
|
|||
|
|
|||
|
// load string into buffer
|
|||
|
dwNumChars = LoadStringW(
|
|||
|
g_hInstance,
|
|||
|
IDS_LINENAME,
|
|||
|
wszBuffer,
|
|||
|
sizeof(wszBuffer)
|
|||
|
);
|
|||
|
|
|||
|
// determine memory needed
|
|||
|
dwNumBytes = (dwNumChars + 1) * sizeof(WCHAR);
|
|||
|
|
|||
|
// allocate memory for unicode string
|
|||
|
g_pwszLineName = H323HeapAlloc(dwNumBytes);
|
|||
|
|
|||
|
// validate pointer
|
|||
|
if (g_pwszLineName == NULL) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"could not allocate strings.\n"
|
|||
|
));
|
|||
|
|
|||
|
// failure
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// copy loaded string into buffer
|
|||
|
memcpy(g_pwszLineName, wszBuffer, dwNumBytes);
|
|||
|
|
|||
|
// load string into buffer
|
|||
|
dwNumChars = LoadStringW(
|
|||
|
g_hInstance,
|
|||
|
IDS_PROVIDERNAME,
|
|||
|
wszBuffer,
|
|||
|
sizeof(wszBuffer)
|
|||
|
);
|
|||
|
|
|||
|
// determine memory needed
|
|||
|
dwNumBytes = (dwNumChars + 1) * sizeof(WCHAR);
|
|||
|
|
|||
|
// allocate memory for unicode string
|
|||
|
g_pwszProviderInfo = H323HeapAlloc(dwNumBytes);
|
|||
|
|
|||
|
// validate pointer
|
|||
|
if (g_pwszProviderInfo == NULL) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"could not allocate strings.\n"
|
|||
|
));
|
|||
|
|
|||
|
// failure
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// copy loaded string into buffer
|
|||
|
memcpy(g_pwszProviderInfo, wszBuffer, dwNumBytes);
|
|||
|
|
|||
|
// success
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
H323UnloadStrings(
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Unloads strings from resource table.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns true if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// validate string pointer
|
|||
|
if (g_pwszLineName != NULL) {
|
|||
|
|
|||
|
// release memory consumed
|
|||
|
H323HeapFree(g_pwszLineName);
|
|||
|
|
|||
|
// re-initialize pointer
|
|||
|
g_pwszLineName = NULL;
|
|||
|
}
|
|||
|
|
|||
|
// validate string pointer
|
|||
|
if (g_pwszProviderInfo != NULL) {
|
|||
|
|
|||
|
// release memory consumed
|
|||
|
H323HeapFree(g_pwszProviderInfo);
|
|||
|
|
|||
|
// re-initialize pointer
|
|||
|
g_pwszProviderInfo = NULL;
|
|||
|
}
|
|||
|
|
|||
|
// success
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
H323StartupTSP(
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Loads H.323 TAPI service provider.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns true if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
__try {
|
|||
|
|
|||
|
// initialize global lock (and allocate event immediately)
|
|||
|
InitializeCriticalSectionAndSpinCount(&g_GlobalLock,H323_SPIN_COUNT);
|
|||
|
|
|||
|
} __except ((GetExceptionCode() == STATUS_NO_MEMORY)
|
|||
|
? EXCEPTION_EXECUTE_HANDLER
|
|||
|
: EXCEPTION_CONTINUE_SEARCH
|
|||
|
) {
|
|||
|
|
|||
|
// failure
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// create heap
|
|||
|
if (!H323HeapCreate()) {
|
|||
|
|
|||
|
// failure
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// load resource strings
|
|||
|
if (!H323LoadStrings()) {
|
|||
|
|
|||
|
// failure
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// success
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
H323ShutdownTSP(
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Unloads H.323 TAPI service provider.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns true if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// unload strings
|
|||
|
H323UnloadStrings();
|
|||
|
|
|||
|
// nuke heap
|
|||
|
H323HeapDestroy();
|
|||
|
|
|||
|
// release global lock resource
|
|||
|
DeleteCriticalSection(&g_GlobalLock);
|
|||
|
|
|||
|
// success
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Public Procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
DllMain(
|
|||
|
PVOID DllHandle,
|
|||
|
ULONG Reason,
|
|||
|
LPVOID lpReserved
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dll entry point.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Same as DllMain.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns true if successful.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
BOOL fOk;
|
|||
|
|
|||
|
// check if new process attaching
|
|||
|
if (Reason == DLL_PROCESS_ATTACH) {
|
|||
|
|
|||
|
// store the handle into a global variable so that
|
|||
|
// the UI code can use it.
|
|||
|
g_hInstance = (HINSTANCE)DllHandle;
|
|||
|
|
|||
|
// turn off thread attach messages
|
|||
|
DisableThreadLibraryCalls(DllHandle);
|
|||
|
|
|||
|
// start h323 tsp
|
|||
|
fOk = CCDllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H245DllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H245WSDllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H323StartupTSP();
|
|||
|
|
|||
|
// check if new process detaching
|
|||
|
} else if (Reason == DLL_PROCESS_DETACH) {
|
|||
|
|
|||
|
// stop h323 tsp
|
|||
|
fOk = CCDllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H245DllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H245WSDllMain(DllHandle,Reason,lpReserved) &&
|
|||
|
H323ShutdownTSP();
|
|||
|
}
|
|||
|
|
|||
|
return fOk;
|
|||
|
}
|