|
|
/*++
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 <stdio.h>
#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
|