windows-nt/Source/XPSP1/NT/net/tapi/skywalker/h323tsp/h323.c

364 lines
7.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}