133 lines
2.9 KiB
C++
133 lines
2.9 KiB
C++
// 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;
|
|
}
|
|
*/
|