266 lines
7.8 KiB
C++
266 lines
7.8 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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)
|
|
|