//////////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2000-2002, Microsoft Corporation. // // All rights reserved. // // Module Name: // // WMIAdapter_App.cpp // // Abstract: // // module for application // // History: // // initial a-marius // //////////////////////////////////////////////////////////////////////////////////// #include "PreComp.h" #include "RefresherUtils.h" // debuging features #ifndef _INC_CRTDBG #include #endif _INC_CRTDBG // new stores file/line info #ifdef _DEBUG #ifndef NEW #define NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ ) #define new NEW #endif NEW #endif _DEBUG // application #include "WMIAdapter_App.h" extern WmiAdapterApp _App; /////////////////////////////////////////////////////////////////////////// // GLOBAL STUFF /////////////////////////////////////////////////////////////////////////// extern LPCWSTR g_szRefreshMutex; // name of mutex for refresh extern __SmartHANDLE g_hRefreshMutex; // mutex to find out refersh request extern LPCWSTR g_szRefreshMutexLib;// name of mutex for refresh extern __SmartHANDLE g_hRefreshMutexLib; // mutex to find out refersh request extern LPCWSTR g_szRefreshFlag; extern __SmartHANDLE g_hRefreshFlag; extern __SmartHANDLE g_hDoneWorkEvt; // event for COM init/uninit ( nonsignaled ) extern __SmartHANDLE g_hDoneWorkEvtCIM; // event for CIM connect/release ( nonsignaled ) extern __SmartHANDLE g_hDoneWorkEvtWMI; // event for WMI connect/release ( nonsignaled ) extern __SmartHANDLE g_hDoneLibEvt; // event for lib connect/disconnect ( nonsignaled ) extern __SmartHANDLE g_hDoneInitEvt; // event for init is finished ( nonsignaled ) extern LPCWSTR g_szAppName; extern LPCWSTR g_szAppNameGlobal; /////////////////////////////////////////////////////////////////////////// // construction & destruction /////////////////////////////////////////////////////////////////////////// WmiAdapterApp::WmiAdapterApp( ): #ifdef __SUPPORT_EVENTVWR m_hResources ( NULL ), #endif __SUPPORT_EVENTVWR m_bInUse ( FALSE ), m_bManual ( FALSE ) { ATLTRACE ( L"*************************************************************\n" L"WmiAdapterApp construction\n" L"*************************************************************\n" ); ::InitializeCriticalSection ( &m_cs ); } WmiAdapterApp::~WmiAdapterApp() { ATLTRACE ( L"*************************************************************\n" L"WmiAdapterApp destruction\n" L"*************************************************************\n" ); //////////////////////////////////////////////////////////////////////// // release mutex ( previous instance checker :)) ) //////////////////////////////////////////////////////////////////////// if ( m_hInstance.GetHANDLE() ) { ::ReleaseMutex ( m_hInstance ); m_hInstance.CloseHandle(); } //////////////////////////////////////////////////////////////////////// // release security attributtes //////////////////////////////////////////////////////////////////////// try { if ( ! pStuff.IsEmpty() ) { delete pStuff.Detach(); } } catch ( ... ) { pStuff.Detach(); } #ifdef __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // release event log //////////////////////////////////////////////////////////////////////// try { if ( ! pEventLog.IsEmpty() ) { delete pEventLog.Detach(); } } catch ( ... ) { pEventLog.Detach(); } #endif __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // release security attributtes //////////////////////////////////////////////////////////////////////// try { if ( ! pSA.IsEmpty() ) { delete pSA.Detach(); } } catch ( ... ) { pSA.Detach(); } #ifdef __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // close resources //////////////////////////////////////////////////////////////////////// if ( m_hResources ) { ::FreeLibrary ( m_hResources ); m_hResources = NULL; } #endif __SUPPORT_EVENTVWR ::DeleteCriticalSection ( &m_cs ); #ifdef _DEBUG _CrtDumpMemoryLeaks(); #endif _DEBUG } /////////////////////////////////////////////////////////////////////////// // exists instance ? /////////////////////////////////////////////////////////////////////////// BOOL WmiAdapterApp::Exists ( void ) { ATLTRACE ( L"*************************************************************\n" L"WmiAdapterApp exists application\n" L"*************************************************************\n" ); //////////////////////////////////////////////////////////////////////// // smart locking/unlocking //////////////////////////////////////////////////////////////////////// __Smart_CRITICAL_SECTION scs ( const_cast < LPCRITICAL_SECTION> ( &m_cs ) ); // check instance if ( m_hInstance.GetHANDLE() == NULL ) { if ( !pSA.IsEmpty() ) { if ( m_hInstance.SetHANDLE ( ::CreateMutexW ( pSA->GetSecurityAttributtes(), FALSE, g_szAppNameGlobal ) ), m_hInstance.GetHANDLE() != NULL ) { if ( ::GetLastError () == ERROR_ALREADY_EXISTS ) { return TRUE; } } else { // m_hInstance.GetHANDLE() == NULL // something's is very bad // return we already exists :)) return TRUE; } } else { // security is not initialized // something's is very bad // return we already exists :)) return TRUE; } } else { // something's is very bad // we should not really be here return TRUE; } return FALSE; } /////////////////////////////////////////////////////////////////////////// // INITIALIZATION /////////////////////////////////////////////////////////////////////////// HRESULT WmiAdapterApp::InitKill ( void ) { HRESULT hRes = S_FALSE; try { if (_App.m_hKill.GetHANDLE() == NULL) { if ( ( _App.m_hKill = ::CreateEvent ( ((WmiSecurityAttributes*)_App)->GetSecurityAttributtes(), TRUE, FALSE, NULL ) ) == NULL ) { // get error HRESULT hr = HRESULT_FROM_WIN32 ( ::GetLastError() ); if FAILED ( hr ) { hRes = hr; } else { hRes = E_OUTOFMEMORY; } } else { hRes = S_OK; } } } catch ( ... ) { hRes = HRESULT_FROM_WIN32 ( ERROR_NOT_READY ); } return hRes; } HRESULT WmiAdapterApp::InitAttributes ( void ) { ATLTRACE ( L"*************************************************************\n" L"WmiAdapterApp initialization of neccessary attributes\n" L"*************************************************************\n" ); //////////////////////////////////////////////////////////////////////// // smart locking/unlocking //////////////////////////////////////////////////////////////////////// __Smart_CRITICAL_SECTION scs ( &m_cs ); #ifdef __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // load resource library //////////////////////////////////////////////////////////////////////// if ( ! m_hResources ) { m_hResources = GetResourceDll(); } #endif __SUPPORT_EVENTVWR try { //////////////////////////////////////////////////////////////////////// // create Security descriptor //////////////////////////////////////////////////////////////////////// if ( pSA.IsEmpty() && ( pSA.SetData ( new WmiSecurityAttributes() ), pSA.IsEmpty() ) ) { return E_OUTOFMEMORY; } // // check to see if security is initialized // if ( FALSE == pSA->m_bInitialized ) { return E_FAIL; } #ifdef __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // create event log //////////////////////////////////////////////////////////////////////// if ( pEventLog.IsEmpty() && ( pEventLog.SetData( new CPerformanceEventLogBase( L"WMIAdapter" ) ), pEventLog.IsEmpty() ) ) { return E_OUTOFMEMORY; } #endif __SUPPORT_EVENTVWR } catch ( ... ) { return E_FAIL; } return S_OK; } HRESULT WmiAdapterApp::Init ( void ) { ATLTRACE ( L"*************************************************************\n" L"WmiAdapterApp initialization\n" L"*************************************************************\n" ); //////////////////////////////////////////////////////////////////////// // smart locking/unlocking //////////////////////////////////////////////////////////////////////// __Smart_CRITICAL_SECTION scs ( &m_cs ); #ifdef __SUPPORT_EVENTVWR //////////////////////////////////////////////////////////////////////// // load resource library //////////////////////////////////////////////////////////////////////// if ( ! m_hResources ) { m_hResources = GetResourceDll(); } #endif __SUPPORT_EVENTVWR try { //////////////////////////////////////////////////////////////////////// // create stuff //////////////////////////////////////////////////////////////////////// if ( pStuff.IsEmpty() && ( pStuff.SetData( new WmiAdapterStuff( ) ), pStuff.IsEmpty() ) ) { return E_OUTOFMEMORY; } } catch ( ... ) { return E_FAIL; } #ifdef __SUPPORT_WAIT m_hData = ::CreateEventW( pSA->GetSecurityAttributtes(), TRUE, FALSE, L"Global\\WmiAdapterDataReady" ); #endif __SUPPORT_WAIT if ( ( m_hInit = ::CreateSemaphoreW( pSA->GetSecurityAttributtes(), 0L, 100L, L"Global\\WmiAdapterInit" ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } if ( ( m_hUninit= ::CreateSemaphoreW( pSA->GetSecurityAttributtes(), 0L, 100L, L"Global\\WmiAdapterUninit" ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } /////////////////////////////////////////////////////////////////////////// // GLOBAL STUFF /////////////////////////////////////////////////////////////////////////// if ( ! g_hRefreshMutex ) { if ( ( g_hRefreshMutex = ::CreateMutex ( pSA->GetSecurityAttributtes(), FALSE, g_szRefreshMutex ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hRefreshMutexLib ) { if ( ( g_hRefreshMutexLib = ::CreateMutex ( pSA->GetSecurityAttributtes(), FALSE, g_szRefreshMutexLib ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hRefreshFlag ) { if ( ( g_hRefreshFlag = ::CreateMutex ( pSA->GetSecurityAttributtes(), FALSE, g_szRefreshFlag ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hDoneWorkEvt ) { if ( ( g_hDoneWorkEvt = ::CreateEvent ( NULL, TRUE, FALSE, NULL ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hDoneWorkEvtCIM ) { if ( ( g_hDoneWorkEvtCIM = ::CreateEvent ( NULL, TRUE, FALSE, NULL ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hDoneWorkEvtWMI ) { if ( ( g_hDoneWorkEvtWMI = ::CreateEvent ( NULL, TRUE, FALSE, NULL ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hDoneInitEvt ) { if ( ( g_hDoneInitEvt = ::CreateEvent ( NULL, TRUE, FALSE, NULL ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } if ( ! g_hDoneLibEvt ) { if ( ( g_hDoneLibEvt = ::CreateEvent ( NULL, TRUE, FALSE, NULL ) ) == NULL ) { // this is really important to have return E_OUTOFMEMORY; } } return S_OK; } void WmiAdapterApp::Term ( void ) { }