270 lines
11 KiB
C++
270 lines
11 KiB
C++
/*++
|
|
|
|
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)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
|