/*++ 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; }