_U est une structure
uException est un EXCEPTION_DEBUG_INFO
uCreateThread est un CREATE_THREAD_DEBUG_INFO
uCreateProcessInfo est un CREATE_PROCESS_DEBUG_INFO
uExitThread est un EXIT_THREAD_DEBUG_INFO
uExitProcess est un EXIT_PROCESS_DEBUG_INFO
uLoadDll est un LOAD_DLL_DEBUG_INFO
uUnLoadDll est un UNLOAD_DLL_DEBUG_INFO
uRipInfo est un RIP_INFO
FIN
DEBUG_EVENT est une structure
dwDebugEventCode est un entier sans signe sur 4 octets//Type C : DWORD
dwProcessId est un entier sans signe sur 4 octets //Type C : DWORD
dwThreadId est un entier sans signe sur 4 octets //Type C : DWORD
u est un _u
typedef struct _DEBUG_EVENT {
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
union {
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
LOAD_DLL_DEBUG_INFO LoadDll;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
} u;
} DEBUG_EVENT, *LPDEBUG_EVENT;
TANTQUE bBoucle=Faux
API("KERNEL32","WaitForDebugEvent",&dbEvent,DBG_INFINITE)
SI (dbEvent:dwProcessId = lpProcessInformation:dwProcessId) ALORS
SELON dbEvent:dwDebugEventCode
CAS EXCEPTION_DEBUG_EVENT
SELON dbEvent:uException:ExceptionRecord:ExceptionCode
CAS EXCEPTION_BREAKPOINT
//(1) L' evenement passe dans ce cas si uException est mis en 1er dans la structure _U.
//Pour info, dbEvent:uException:ExceptionRecord:ExceptionCode est bien égal à -2147483645 (0x80000003),
//sinon, il est égal à 1 !! (Je ne sais pas pourquoi).
FIN
CAS CREATE_PROCESS_DEBUG_EVENT
ListeAjoute(LIST_LOG,"Process Created: "+dbEvent:dwProcessId)
CAS LOAD_DLL_DEBUG_EVENT
//(2) dbEvent:uLoadDll:hFile est correct si uLoadDll est mis en 1er dans la structure _U,
//sinon, dbEvent:uLoadDll:hFile est incorrect (soit 0, etc ...)
CAS UNLOAD_DLL_DEBUG_EVENT
ListeAjoute(LIST_LOG,"Dll Unload: "+dbEvent:uLoadDll:hFile)
FIN
SINON
FIN
API ("KERNEL32","ContinueDebugEvent",dbEvent:dwProcessId,dbEvent:dwThreadId,DBG_CONTINUE)
FIN
typedef struct _U
{
LOAD_DLL_DEBUG_INFO LoadDll;
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
} U, *LPU;
typedef struct _DEBUG_EVENT
{
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
U u;
} DEBUG_EVENT, *LPDEBUG_EVENT;
Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=14&topic_id=3693&post_id=15615