windows-nt/Source/XPSP1/NT/base/cluster/mgmt/clusocm/dll.cpp

266 lines
7.8 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999 Microsoft Corporation
//
// Module Name:
// Dll.cpp
//
// Description:
// DLL services/entry points.
//
// Maintained By:
// Geoff Pease (GPease) 18-OCT-1999
// Vij Vasu (Vvasu) 25-JAN-2001
//
// Notes:
// The file Mgmt\Inc\DllSrc.cpp is not included in this file
// because the inclusion of that file requires that the library
// Mgmt\ClusCfg\Common\$(O)\Common.lib be linked with this DLL. Also,
// the header file Guids.h from Mgmt\ClusCfg\Inc will be needed.
// (DllSrc.cpp requires CFactorySrc.cpp which requires CITrackerSrc.cpp
// which requires InterfaceTableSrc.cpp which needs Guids.h)
//
// Since I didn't wan't to "reach across" to the ClusCfg directory (and
// since this DLL does not need class factories, interface tracking, etc.)
// ClusOCM has it's own Dll.cpp.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
// Precompiled header for this DLL
#include "pch.h"
//////////////////////////////////////////////////////////////////////////////
// Macro Definitions
//////////////////////////////////////////////////////////////////////////////
// For tracing
DEFINE_MODULE("CLUSOCM")
//////////////////////////////////////////////////////////////////////////////
// Global Variables
//////////////////////////////////////////////////////////////////////////////
// Handle to the instance of this DLL.
HINSTANCE g_hInstance = NULL;
LPVOID g_GlobalMemoryList = NULL;
// Name of the DLL
WCHAR g_szDllFilename[ MAX_PATH ] = { 0 };
#if !defined(NO_DLL_MAIN) || defined(ENTRY_PREFIX) || defined(DEBUG)
//////////////////////////////////////////////////////////////////////////////
//
// __declspec( dllexport )
// BOOL
// WINAPI
// DLLMain(
// HANDLE hInstIn,
// ULONG ulReasonIn,
// LPVOID lpReservedIn
// )
//
// Description:
// Dll entry point.
//
// Arguments:
// hInstIn - DLL instance handle.
// ulReasonIn - DLL reason code for entrance.
// lpReservedIn - Not used.
//
//////////////////////////////////////////////////////////////////////////////
__declspec( dllexport ) BOOL WINAPI
DllMain(
HANDLE hInstIn,
ULONG ulReasonIn,
LPVOID // lpReservedIn
)
{
BOOL fReturnValue = TRUE;
//
// KB: NO_THREAD_OPTIMIZATIONS gpease 19-OCT-1999
//
// By not defining this you can prvent the linker
// from calling you DllEntry for every new thread.
// This makes creating new thread significantly
// faster if every DLL in a process does it.
// Unfortunately, not all DLLs do this.
//
// In CHKed/DEBUG, we keep this on for memory
// tracking.
//
#if defined( DEBUG )
#define NO_THREAD_OPTIMIZATIONS
#endif // DEBUG
#if defined(NO_THREAD_OPTIMIZATIONS)
switch( ulReasonIn )
{
case DLL_PROCESS_ATTACH:
{
#if defined(USE_WMI_TRACING)
TraceInitializeProcess( g_rgTraceControlGuidList, ARRAYSIZE( g_rgTraceControlGuidList ), TRUE );
#else
TraceInitializeProcess( TRUE );
#endif
#if defined( DEBUG )
TraceFunc( "" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_PROCESS_ATTACH - ThreadID = %#x"),
GetCurrentThreadId( )
);
FRETURN( fReturnValue );
#endif // DEBUG
g_hInstance = (HINSTANCE) hInstIn;
#if defined( ENTRY_PREFIX )
hProxyDll = g_hInstance;
#endif
GetModuleFileName( g_hInstance, g_szDllFilename, MAX_PATH );
//
// Create a global memory list so that memory allocated by one
// thread and handed to another can be tracked without causing
// unnecessary trace messages.
//
TraceCreateMemoryList( g_GlobalMemoryList );
} // case: DLL_PROCESS_ATTACH
break;
case DLL_PROCESS_DETACH:
{
#if defined( DEBUG )
TraceFunc( "" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_PROCESS_DETACH - ThreadID = %#x"),
GetCurrentThreadId( )
);
FRETURN( fReturnValue );
#endif // DEBUG
//
// Cleanup the global memory list used to track memory allocated
// in one thread and then handed to another.
//
TraceTerminateMemoryList( g_GlobalMemoryList );
#if defined(USE_WMI_TRACING)
TraceTerminateProcess( g_rgTraceControlGuidList, ARRAYSIZE( g_rgTraceControlGuidList ) );
#else
TraceTerminateProcess();
#endif
} // case: DLL_PROCESS_DETACH
break;
case DLL_THREAD_ATTACH:
{
TraceInitializeThread( NULL );
#if defined( DEBUG )
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("The thread %#x has started."),
GetCurrentThreadId( ) );
TraceFunc( "" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_THREAD_ATTACH - ThreadID = %#x"),
GetCurrentThreadId( )
);
FRETURN( fReturnValue );
#endif // DEBUG
} // case: DLL_THREAD_ATTACH
break;
case DLL_THREAD_DETACH:
{
#if defined( DEBUG )
TraceFunc( "" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: DLL_THREAD_DETACH - ThreadID = %#x"),
GetCurrentThreadId( )
);
FRETURN( fReturnValue );
#endif // DEBUG
TraceThreadRundown( );
} // case: DLL_THREAD_DETACH
break;
default:
{
#if defined( DEBUG )
TraceFunc( "" );
TraceMessage( TEXT(__FILE__),
__LINE__,
__MODULE__,
mtfDLL,
TEXT("DLL: UNKNOWN ENTRANCE REASON - ThreadID = %#x"),
GetCurrentThreadId( )
);
FRETURN( fReturnValue );
#endif // DEBUG
} // case: default
break;
}
return fReturnValue;
#else // !NO_THREAD_OPTIMIZATIONS
Assert( ulReasonIn == DLL_PROCESS_ATTACH || ulReasonIn == DLL_PROCESS_DETACH );
#if defined(DEBUG)
#if defined(USE_WMI_TRACING)
TraceInitializeProcess( g_rgTraceControlGuidList,
ARRAYSIZE( g_rgTraceControlGuidList )
);
#else
TraceInitializeProcess();
#endif
#endif // DEBUG
g_hInstance = (HINSTANCE) hInstIn;
#if defined( ENTRY_PREFIX )
hProxyDll = g_hInstance;
#endif
GetModuleFileName( g_hInstance, g_szDllFilename, MAX_PATH );
fReturnValue = DisableThreadLibraryCalls( g_hInstance );
AssertMsg( fReturnValue, "*ERROR* DisableThreadLibraryCalls( ) failed." );
return fReturnValue;
#endif // NO_THREAD_OPTIMIZATIONS
} //*** DllMain()
#endif // !defined(NO_DLL_MAIN) && !defined(ENTRY_PREFIX) && !defined(DEBUG)