//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1999 ** //********************************************************************* // // DEBUG.CPP - Implementation for CDebug // // HISTORY: // // 05/08/00 dane Created. // #include "precomp.h" #include "msobmain.h" #include "appdefs.h" #include "dispids.h" DISPATCHLIST DebugExternalInterface[] = { {L"Trace", DISPID_DEBUG_TRACE }, {L"get_MsDebugMode", DISPID_DEBUG_ISMSDEBUGMODE }, {L"get_OemDebugMode", DISPID_DEBUG_ISOEMDEBUGMODE } }; ///////////////////////////////////////////////////////////// // CDebug::CDebug CDebug::CDebug() { // Init member vars m_cRef = 0; m_fMsDebugMode = IsMsDebugMode( ); m_fOemDebugMode = IsOEMDebugMode(); } ///////////////////////////////////////////////////////////// // CDebug::~CDebug CDebug::~CDebug() { MYASSERT(m_cRef == 0); } void CDebug::Trace( BSTR bstrVal ) { pSetupDebugPrint( L"OOBE Trace", 0, NULL, bstrVal ); #if 1 if (m_fMsDebugMode) { ::MyTrace(bstrVal); } #endif } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IUnknown implementation /////// /////// ///////////////////////////////////////////////////////////// // CDebug::QueryInterface STDMETHODIMP CDebug::QueryInterface(REFIID riid, LPVOID* ppvObj) { // must set out pointer parameters to NULL *ppvObj = NULL; if ( riid == IID_IUnknown) { AddRef(); *ppvObj = (IUnknown*)this; return ResultFromScode(S_OK); } if (riid == IID_IDispatch) { AddRef(); *ppvObj = (IDispatch*)this; return ResultFromScode(S_OK); } // Not a supported interface return ResultFromScode(E_NOINTERFACE); } ///////////////////////////////////////////////////////////// // CDebug::AddRef STDMETHODIMP_(ULONG) CDebug::AddRef() { return ++m_cRef; } ///////////////////////////////////////////////////////////// // CDebug::Release STDMETHODIMP_(ULONG) CDebug::Release() { return --m_cRef; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IDispatch implementation /////// /////// ///////////////////////////////////////////////////////////// // CDebug::GetTypeInfo STDMETHODIMP CDebug::GetTypeInfo(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CDebug::GetTypeInfoCount STDMETHODIMP CDebug::GetTypeInfoCount(UINT* pcInfo) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CDebug::GetIDsOfNames STDMETHODIMP CDebug::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) { HRESULT hr = DISP_E_UNKNOWNNAME; rgDispId[0] = DISPID_UNKNOWN; for (int iX = 0; iX < sizeof(DebugExternalInterface)/sizeof(DISPATCHLIST); iX ++) { if(lstrcmp(DebugExternalInterface[iX].szName, rgszNames[0]) == 0) { rgDispId[0] = DebugExternalInterface[iX].dwDispID; hr = NOERROR; break; } } // Set the disid's for the parameters if (cNames > 1) { // Set a DISPID for function parameters for (UINT i = 1; i < cNames ; i++) rgDispId[i] = DISPID_UNKNOWN; } return hr; } ///////////////////////////////////////////////////////////// // CDebug::Invoke HRESULT CDebug::Invoke ( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr ) { HRESULT hr = S_OK; switch(dispidMember) { case DISPID_DEBUG_TRACE: { if(pdispparams && &pdispparams[0].rgvarg[0]) Trace(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_DEBUG_ISMSDEBUGMODE: { if (pvarResult != NULL) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; V_BOOL(pvarResult) = Bool2VarBool(m_fMsDebugMode); } break; } case DISPID_DEBUG_ISOEMDEBUGMODE: { if ( NULL != pdispparams && 0 < pdispparams->cArgs && pvarResult != NULL) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; V_BOOL(pvarResult) = Bool2VarBool(m_fOemDebugMode); } break; } default: { hr = DISP_E_MEMBERNOTFOUND; break; } } return hr; } ///////////////////////////////////////////////////////////// // CDebug::GetMsDebugMode BOOL CDebug::IsMsDebugMode( ) { // Allow default MsDebugMode to be overridden by // HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE\MsDebug // #ifdef DBG DWORD dwIsDebug = TRUE; #else DWORD dwIsDebug = FALSE; #endif HKEY hKey = NULL; DWORD dwSize = sizeof(DWORD); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { RegQueryValueEx(hKey, OOBE_MSDEBUG_REG_VAL, 0, NULL, (LPBYTE)&dwIsDebug, &dwSize); RegCloseKey(hKey); } return (BOOL) dwIsDebug; }