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.
 
 
 
 
 
 

132 lines
2.9 KiB

// 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;
}
*/