/*++ Copyright (c) 2001 Microsoft Corporation Module Name: VerifLog.h Abstract: Headers for the AppVerifier log file. Revision History: 04/26/2001 dmunsil Created. 08/14/2001 robkenny Inserted inside the ShimLib namespace. --*/ #pragma once #include #include "ShimCString.h" #include "shimdb.h" #include "avrfutil.h" namespace ShimLib { extern BOOL g_bVerifierLogEnabled; // enable/disable file logging class CVerifierLog { public: CString m_strShimName; DWORD m_dwEntries; BOOL m_bHeaderDumped; CVerifierLog(LPCSTR szShimName, DWORD dwEntries) { m_strShimName = szShimName; m_dwEntries = dwEntries; m_bHeaderDumped = FALSE; } void __cdecl VLog( VLOG_LEVEL eLevel, DWORD dwLogNum, LPCSTR pszFmt, ... ); void DumpLogEntry( DWORD dwLogNum, UINT unResTitle, UINT unResDescription, UINT unResURL ); void DumpShimHeader(void); }; // // helper functions // BOOL InitVerifierLogSupport( void); void ReleaseVerifierLogSupport( void); void WriteToSessionLog( LPCSTR szLine ); void WriteToProcessLog( LPCSTR szLine ); int VLogLoadString( HMODULE hModule, UINT wID, LPWSTR lpBuffer, // Unicode buffer int cchBufferMax); // // Goes at top of shim cpp file, or in shared header file for shim // #define BEGIN_DEFINE_VERIFIER_LOG(shim) enum { #define VERIFIER_LOG_ENTRY(entry) entry, #define END_DEFINE_VERIFIER_LOG(shim) VLOG_ENTRIES_##shim }; // // goes at top of shim file, after includes and above defines and before any code // #define INIT_VERIFIER_LOG(shim) static CVerifierLog g_VLog(#shim, VLOG_ENTRIES_##shim) // // goes in shim init section // // once for each log entry #define DUMP_VERIFIER_LOG_ENTRY(entry, title, desc, url) \ if (fdwReason == DLL_PROCESS_ATTACH) { \ g_VLog.DumpLogEntry(entry, title, desc, url); \ } // // for each log entry required // #define VLOG g_VLog.VLog #define VLOG_MAX_DESC 4096 #define VLOG_MAX_FRIENDLY_NAME 256 // // goes in each shim module // #define SHIM_INFO_BEGIN() \ BOOL \ QueryShimInfo(AVRF_INFO_ID eInfo, PVOID pInfo) \ { #define SHIM_INFO_DESCRIPTION(res_desc) \ if (eInfo == AVRF_INFO_DESCRIPTION) { \ LPWSTR *pszTemp = (LPWSTR*)pInfo; \ *pszTemp = \ (LPWSTR)ShimMalloc(VLOG_MAX_DESC * sizeof(WCHAR)); \ if (*pszTemp) { \ VLogLoadString(g_hinstDll, \ res_desc, \ (LPWSTR)*pszTemp, \ VLOG_MAX_DESC); \ return TRUE; \ } \ } #define SHIM_INFO_FRIENDLY_NAME(res_name) \ if (eInfo == AVRF_INFO_FRIENDLY_NAME) { \ LPWSTR *pszTemp = (LPWSTR*)pInfo; \ *pszTemp = \ (LPWSTR)ShimMalloc(VLOG_MAX_FRIENDLY_NAME * sizeof(WCHAR)); \ if (*pszTemp) { \ VLogLoadString(g_hinstDll, \ res_name, \ (LPWSTR)*pszTemp, \ VLOG_MAX_FRIENDLY_NAME); \ return TRUE; \ } \ } #define SHIM_INFO_FLAGS(flags) \ if (eInfo == AVRF_INFO_FLAGS) { \ *((DWORD*)pInfo) = flags; \ return TRUE; \ } #define SHIM_INFO_GROUPS(groups) \ if (eInfo == AVRF_INFO_GROUPS) { \ *((DWORD*)pInfo) = groups; \ return TRUE; \ } #define SHIM_INFO_VERSION(major, minor) \ if (eInfo == AVRF_INFO_VERSION) { \ *((DWORD*)pInfo) = (((DWORD)major) << 16) | minor; \ return TRUE; \ } #define SHIM_INFO_INCLUDE_EXCLUDE(string) \ if (eInfo == AVRF_INFO_INCLUDE_EXCLUDE) { \ *((LPWSTR*)pInfo) = L##string; \ return TRUE; \ } #define SHIM_INFO_OPTIONS_PAGE(res_template, dlgproc) \ if (eInfo == AVRF_INFO_OPTIONS_PAGE) { \ LPPROPSHEETPAGE lpSheet = (LPPROPSHEETPAGE)pInfo; \ \ lpSheet->hInstance = g_hinstDll; \ lpSheet->pszTemplate = (LPCWSTR)res_template; \ lpSheet->pfnDlgProc = dlgproc; \ \ return TRUE; \ } #define SHIM_INFO_END() \ return FALSE; \ } // // goes in Main.cpp // #define DECLARE_VERIFIER_SHIM(name) \ namespace NS_##name \ { \ extern BOOL QueryShimInfo(AVRF_INFO_ID eInfo, PVOID pInfo); \ }; // in multi-shim init #define INIT_VLOG_SUPPORT() \ if (fdwReason == DLL_PROCESS_ATTACH) { \ InitVerifierLogSupport(); \ } #define DECLARE_VERIFIER_DLL() \ extern "C" DWORD \ GetVerifierMagic(void) \ { \ return VERIFIER_SHIMS_MAGIC; \ } \ /* \ * Cause a compile error if the prototype in shimdb.w is out of sync with call \ */ \ static _pfnGetVerifierMagic __TEST_GetVerifierMagic_PROTO = GetVerifierMagic; #define ENUM_VERIFIER_SHIMS_BEGIN() \ extern "C" BOOL \ QueryShimInfo(LPCWSTR szName, AVRF_INFO_ID eInfo, PVOID pInfo) \ { \ DWORD dwCount = 0; #define ENUM_VERIFIER_SHIMS_ENTRY(name) \ if (eInfo == AVRF_INFO_NUM_SHIMS) { \ dwCount++; \ } else if (eInfo == AVRF_INFO_SHIM_NAMES) { \ ((LPWSTR*)pInfo)[dwCount] = L#name; \ dwCount++; \ } else if (szName && _wcsicmp(szName, L#name) == 0) { \ return NS_##name::QueryShimInfo(eInfo, pInfo); \ } #define ENUM_VERIFIER_SHIMS_END() \ if (eInfo == AVRF_INFO_NUM_SHIMS) { \ *((DWORD*)pInfo) = dwCount; \ return TRUE; \ } \ if (eInfo == AVRF_INFO_SHIM_NAMES) { \ return TRUE; \ } \ \ return FALSE; \ } \ /* \ * Cause a compile error if the prototype in shimdb.w is out of sync with call \ */ \ static _pfnQueryShimInfo __TEST_QueryShimInfo_PROTO = QueryShimInfo; }; // end of namespace ShimLib