windows-nt/Source/XPSP1/NT/base/remoteboot/admin/dll.cpp
2020-09-26 16:20:57 +08:00

215 lines
4.3 KiB
C++

//
// 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);
}