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;
|
||
}
|