|
|
//
// Copyright 1997 - Microsoft
//
//
// DLL.CPP - DLL entry points
//
#include "pch.h"
#include "register.h"
#include "ccomputr.h"
#include "cservice.h"
#include "cgroup.h"
DEFINE_MODULE("IMADMUI")
// DLL Globals
HINSTANCE g_hInstance = NULL; DWORD g_cObjects = 0; DWORD g_cLock = 0; TCHAR g_szDllFilename[ MAX_PATH ] = { 0 }; UINT g_cfDsObjectNames; UINT g_cfDsDisplaySpecOptions; UINT g_cfDsPropetyPageInfo; UINT g_cfMMCGetNodeType; WCHAR g_cszHelpFile[] = L"rbadmin.hlp";
CRITICAL_SECTION g_InterlockCS;
//
// DLLMain()
//
BOOL WINAPI DllMain( HANDLE hInst, ULONG uReason, LPVOID lpReserved) { if ( uReason == DLL_PROCESS_ATTACH ) { InitializeCriticalSection( &g_InterlockCS ); }
// keep down the noise
#ifdef DEBUG
if ( g_dwTraceFlags & TF_DLL ) { TraceFunc( "DllMain() - " ); } #endif // DEBUG
switch( uReason ) { case DLL_PROCESS_ATTACH: TraceMsg( TF_DLL, "DLL_PROCESS_ATTACH - ThreadID = 0x%08x\n", GetCurrentThreadId( ) );
INITIALIZE_TRACE_MEMORY_PROCESS;
g_hInstance = (HINSTANCE) hInst;
TraceAssertIfZero( GetModuleFileName( g_hInstance, g_szDllFilename, ARRAYSIZE( g_szDllFilename ) ) ); break;
case DLL_PROCESS_DETACH: TraceMsg( TF_DLL, "DLL_PROCESS_DETACH - ThreadID = 0x%08x ", GetCurrentThreadId( ) );
TraceMsg( TF_DLL, "[ g_cLock=%u, g_cObjects=%u ]\n", g_cLock, g_cObjects ); UNINITIALIZE_TRACE_MEMORY; #ifdef DEBUG
if (g_fDebugInitialized) { DeleteCriticalSection(&g_DebugCS); g_fDebugInitialized = FALSE; } #endif
DeleteCriticalSection( &g_InterlockCS ); break;
case DLL_THREAD_ATTACH: TraceMsg( TF_DLL, "DLL_THREAD_ATTACH - ThreadID = 0x%08x ", GetCurrentThreadId( ) );
TraceMsg( TF_DLL, "[ g_cLock=%u, g_cObjects=%u ]\n", g_cLock, g_cObjects ); INITIALIZE_TRACE_MEMORY_THREAD; break;
case DLL_THREAD_DETACH: TraceMsg( TF_DLL, "DLL_THREAD_DETACH - ThreadID = 0x%08x ", GetCurrentThreadId( ) );
TraceMsg( TF_DLL, "[ g_cLock=%u, g_cObjects=%u ]\n", g_cLock, g_cObjects ); UNINITIALIZE_TRACE_MEMORY; break; }
#ifdef DEBUG
if ( g_dwTraceFlags & TF_DLL ) { RETURN(TRUE); } #endif // DEBUG
return TRUE; } // DLLMain()
//
// DllGetClassObject()
//
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv ) { TraceFunc( "DllGetClassObject( ");
if ( !ppv ) { TraceMsg( TF_FUNC, "ppv == NULL! )\n" ); RRETURN(E_POINTER); }
LPCFACTORY lpClassFactory; HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
int i = 0; while( g_DllClasses[ i ].rclsid ) { if ( *g_DllClasses[ i ].rclsid == rclsid ) { TraceMsg( TF_FUNC, TEXT("rclsid= %s, riid, ppv )\n"), g_DllClasses[ i ].pszName ); hr = S_OK; break; }
i++; }
if ( hr == CLASS_E_CLASSNOTAVAILABLE ) { TraceMsg( TF_FUNC, "rclsid= " ); TraceMsgGUID( TF_FUNC, rclsid ); TraceMsg( TF_FUNC, ", riid, ppv )\n" ); goto Cleanup; }
Assert( g_DllClasses[ i ].pfnCreateInstance != NULL ); lpClassFactory = new CFactory( g_DllClasses[ i ].pfnCreateInstance );
if ( !lpClassFactory ) { hr = THR(E_OUTOFMEMORY); goto Cleanup; }
hr = THR( lpClassFactory->Init( ) ); if ( hr ) { TraceDo( delete lpClassFactory ); goto Cleanup; }
hr = lpClassFactory->QueryInterface( riid, ppv ); ((IUnknown *) lpClassFactory )->Release( );
Cleanup: HRETURN(hr); }
//
// DllRegisterServer()
//
STDAPI DllRegisterServer(void) { HRESULT hr;
TraceFunc( "DllRegisterServer()\n" );
hr = RegisterDll( TRUE );
HRETURN(hr); }
//
// DllUnregisterServer()
//
STDAPI DllUnregisterServer(void) { TraceFunc( "DllUnregisterServer()\n" );
HRETURN( RegisterDll( FALSE ) ); }
//
// DllCanUnloadNow()
//
STDAPI DllCanUnloadNow(void) { TraceFunc( "DllCanUnloadNow()\n" );
HRESULT hr = S_OK;
if ( g_cLock || g_cObjects ) { TraceMsg( TF_DLL, "[ g_cLock=%u, g_cObjects=%u ]\n", g_cLock, g_cObjects ); hr = S_FALSE; }
HRETURN(hr); }
|