Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// mydebug.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "mydebug.h"
#include "info.h"
// share the pointer to the shared info
#pragma data_seg(".myshared")
LPVOID gs_pSharedInfo = NULL; CRITICAL_SECTION gs_CriticalSection; int gs_refcount = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.myshared,RWS")
// local pointer to shared info
CInfo *g_pInfo = NULL;
// function that guarantees all DLLs have pointer to same info
BOOL EstablishInfo() { if (gs_pSharedInfo == NULL) { assert(gs_refcount == 0); g_pInfo = new CInfo; gs_pSharedInfo = (LPVOID)g_pInfo; __try { InitializeCriticalSection(&gs_CriticalSection); } __except( EXCEPTION_EXECUTE_HANDLER ) //usually low memory exception
{ return FALSE; } } else g_pInfo = (CInfo *)gs_pSharedInfo;
gs_refcount++
assert(g_pInfo != NULL); assert(gs_refcount > 0); return TRUE: }
// global module handle
HANDLE g_hModule;
// dllmain
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hModule = hModule; if (!EstablishInfo()) return FALSE; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
// pass functions
class CCriticalCode { public: CCriticalCode() {EnterCriticalSection(&gs_CriticalSection);} ~CCriticalCode() {LeaveCriticalSection(&gs_CriticalSection);} };
#define PASS(p) \
CCriticalCode _cc; \ if (g_pInfo != NULL) \ { \ g_pInfo->SetCallInfo(g_hModule, MYDEBUG_CALLINFOPASS); \ g_pInfo->(p); \ } #define PASSR(p,nr)
CCriticalCode _cc; \ if (g_pInfo != NULL) \ { \ g_pInfo->SetCallInfo(g_hModule, MYDEBUG_CALLINFOPASS); \ return g_pInfo->(p); \ } \ else \ return nr;
MYDEBUG_API void mydebug_traceInScope(LPCWSTR str, MYDEBUG_CALLINFOARGS) {PASS(traceInScope(str));} MYDEBUG_API void mydebug_traceOutScope(MYDEBUG_CALLINFOARGS) {PASS(traceOutScope());}
MYDEBUG_API void mydebug_traceString(LPCWSTR str, MYDEBUG_CALLINFOARGS) {PASS(traceString(str));} MYDEBUG_API void mydebug_traceSection(LPCWSTR str, MYDEBUG_CALLINFOARGS) {PASS(traceSection(str));} MYDEBUG_API void mydebug_traceRegion(LPCWSTR str, HRGN hRgn, MYDEBUG_CALLINFOARGS) {PASS(traceRegion(hRgn));}
/*
// This is an example of an exported variable
MYDEBUG_API int nMydebug=0;
// This is an example of an exported function.
MYDEBUG_API int fnMydebug(void) { return 42; }
// This is the constructor of a class that has been exported.
// see mydebug.h for the class definition
CMydebug::CMydebug() { return; } */
|