2025-04-27 07:49:33 -04:00

139 lines
3.7 KiB
C++

#include "precomp.h"
#include "winmgmt.h"
#include "backuprestore.h"
//***************************************************************************
//
// CForwardFactory::AddRef()
// CForwardFactory::Release()
// CForwardFactory::QueryInterface()
// CForwardFactory::CreateInstance()
//
// DESCRIPTION:
//
// Class factory for the exported WbemNTLMLogin interface. Note that this
// just serves as a wrapper to the factory inside the core. The reason for
// having a wrapper is that the core may not always be loaded.
//
//***************************************************************************
ULONG STDMETHODCALLTYPE CForwardFactory::AddRef()
{
return InterlockedIncrement(&m_lRef);
}
ULONG STDMETHODCALLTYPE CForwardFactory::Release()
{
long lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0)
delete this;
return lRef;
}
HRESULT STDMETHODCALLTYPE CForwardFactory::QueryInterface(REFIID riid,
void** ppv)
{
if(riid == IID_IUnknown || riid == IID_IClassFactory)
{
*ppv = (IClassFactory*)this;
AddRef();
return S_OK;
}
else return E_NOINTERFACE;
}
#ifdef INSTRUMENTED_BUILD
#ifdef _X86_
extern BOOL g_FaultHeapEnabled;
extern BOOL g_FaultFileEnabled;
extern LONG g_nSuccConn;
#endif
#endif
HRESULT STDMETHODCALLTYPE CForwardFactory::CreateInstance(IUnknown* pUnkOuter,
REFIID riid, void** ppv)
{
DEBUGTRACE((LOG_WINMGMT, "\nCreating an instance!\n"));
SCODE sc = S_OK;
CInMutex im(g_ProgRes.hMainMutex);
try {
if(g_ProgRes.bShuttingDownWinMgmt)
{
DEBUGTRACE((LOG_WINMGMT, "\nCreateInstance returned CO_E_SERVER_STOPPING"));
return CO_E_SERVER_STOPPING;
}
DWORD dwRes = WaitForSingleObject(g_ProgRes.ghHoldOffNewClients, 1000);
if(dwRes != WAIT_OBJECT_0 && dwRes != WAIT_ABANDONED)
return CO_E_SERVER_STOPPING;
ReleaseMutex(g_ProgRes.ghHoldOffNewClients);
if(m_ForwardClsid == CLSID_WbemBackupRestore)
{
CWbemBackupRestore * pObj = new CWbemBackupRestore(g_hInstance);
if (!pObj)
return WBEM_E_OUT_OF_MEMORY;
sc = pObj->QueryInterface(riid, ppv);
if(FAILED(sc))
delete pObj;
}
else
{
HMODULE hCoreModule = LoadLibraryEx(__TEXT("wbemcore.dll"),NULL,0);
if(hCoreModule)
{
HRESULT (STDAPICALLTYPE *pfn)(DWORD);
pfn = (long (__stdcall *)(DWORD))GetProcAddress(hCoreModule, "Reinitialize");
if(pfn == NULL)
sc = WBEM_E_CRITICAL_ERROR;
else
{
pfn(0);
sc = CoCreateInstance(CLSID_InProcWbemLevel1Login, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown,
(void**)ppv);
DEBUGTRACE((LOG_WINMGMT, "\nInner create returned: 0x%X\n", sc));
}
FreeLibrary(hCoreModule);
}
else
sc = WBEM_E_CRITICAL_ERROR;
#ifdef INSTRUMENTED_BUILD
#ifdef _X86_
/*
if (++g_nSuccConn > 500)
{
g_FaultHeapEnabled = TRUE;
g_FaultFileEnabled = TRUE;
};
*/
#endif
#endif
}
}
catch (...)
{
ERRORTRACE((LOG_WINMGMT,"---------------\nException thrown from CreateInstance\n-------------\n"));
sc = E_NOINTERFACE;
}
return sc;
}
HRESULT STDMETHODCALLTYPE CForwardFactory::LockServer(BOOL fLock)
{
//return CoLockObjectExternal(this,fLock,FALSE);
return S_OK;
}
CForwardFactory::~CForwardFactory()
{
}