callbacks

This commit is contained in:
Mr. eXoDia 2015-03-25 03:19:35 +01:00
parent 187bdeff1d
commit 1ae8b5633a
6 changed files with 119 additions and 40 deletions

View File

@ -2,53 +2,53 @@
namespace GleeBug namespace GleeBug
{ {
void Debugger::createProcessEvent(CREATE_PROCESS_DEBUG_INFO* CreateProcess) void Debugger::createProcessEvent(CREATE_PROCESS_DEBUG_INFO* createProcess)
{ {
log("Debugger::createProcessEvent"); cbCreateProcessEvent(createProcess);
} }
void Debugger::exitProcessEvent(EXIT_PROCESS_DEBUG_INFO* ExitProcess) void Debugger::exitProcessEvent(EXIT_PROCESS_DEBUG_INFO* exitProcess)
{ {
log("Debugger::exitProcessEvent");
if (_debugEvent.dwProcessId == _mainProcess.ProcessId) if (_debugEvent.dwProcessId == _mainProcess.ProcessId)
{ {
_breakDebugger = true; _breakDebugger = true;
} }
cbExitProcessEvent(exitProcess);
} }
void Debugger::createThreadEvent(CREATE_THREAD_DEBUG_INFO* CreateThread) void Debugger::createThreadEvent(CREATE_THREAD_DEBUG_INFO* createThread)
{ {
log("Debugger::createThreadEvent"); cbCreateThreadEvent(createThread);
} }
void Debugger::exitThreadEvent(EXIT_THREAD_DEBUG_INFO* ExitThread) void Debugger::exitThreadEvent(EXIT_THREAD_DEBUG_INFO* exitThread)
{ {
log("Debugger::exitThreadEvent"); cbExitThreadEvent(exitThread);
} }
void Debugger::loadDllEvent(LOAD_DLL_DEBUG_INFO* LoadDll) void Debugger::loadDllEvent(LOAD_DLL_DEBUG_INFO* loadDll)
{ {
log("Debugger::loadDllEvent"); cbLoadDllEvent(loadDll);
} }
void Debugger::unloadDllEvent(UNLOAD_DLL_DEBUG_INFO* UnloadDll) void Debugger::unloadDllEvent(UNLOAD_DLL_DEBUG_INFO* unloadDll)
{ {
log("Debugger::unloadDllEvent"); cbUnloadDllEvent(unloadDll);
} }
void Debugger::exceptionEvent(EXCEPTION_DEBUG_INFO* Exception) void Debugger::exceptionEvent(EXCEPTION_DEBUG_INFO* exceptionInfo)
{ {
log("Debugger::exceptionEvent"); cbExceptionEvent(exceptionInfo);
} }
void Debugger::debugStringEvent(OUTPUT_DEBUG_STRING_INFO* DebugString) void Debugger::debugStringEvent(OUTPUT_DEBUG_STRING_INFO* debugString)
{ {
log("Debugger::debugStringEvent"); cbDebugStringEvent(debugString);
} }
void Debugger::ripEvent(RIP_INFO* Rip) void Debugger::ripEvent(RIP_INFO* rip)
{ {
log("Debugger::ripEvent"); cbRipEvent(rip);
} }
void Debugger::Start() void Debugger::Start()

View File

@ -52,18 +52,27 @@ namespace GleeBug
const ProcessInfo & GetMainProcess(); const ProcessInfo & GetMainProcess();
protected: protected:
void createProcessEvent(CREATE_PROCESS_DEBUG_INFO* CreateProcess); virtual void cbCreateProcessEvent(CREATE_PROCESS_DEBUG_INFO* createProcess) {};
void exitProcessEvent(EXIT_PROCESS_DEBUG_INFO* ExitProcess); virtual void cbExitProcessEvent(EXIT_PROCESS_DEBUG_INFO* exitProcess) {};
void createThreadEvent(CREATE_THREAD_DEBUG_INFO* CreateThread); virtual void cbCreateThreadEvent(CREATE_THREAD_DEBUG_INFO* createThread) {};
void exitThreadEvent(EXIT_THREAD_DEBUG_INFO* ExitThread); virtual void cbExitThreadEvent(EXIT_THREAD_DEBUG_INFO* exitThread) {};
void loadDllEvent(LOAD_DLL_DEBUG_INFO* LoadDll); virtual void cbLoadDllEvent(LOAD_DLL_DEBUG_INFO* loadDll) {};
void unloadDllEvent(UNLOAD_DLL_DEBUG_INFO* UnloadDll); virtual void cbUnloadDllEvent(UNLOAD_DLL_DEBUG_INFO* unloadDll) {};
void exceptionEvent(EXCEPTION_DEBUG_INFO* Exception); virtual void cbExceptionEvent(EXCEPTION_DEBUG_INFO* exceptionInfo) {};
void debugStringEvent(OUTPUT_DEBUG_STRING_INFO* DebugString); virtual void cbDebugStringEvent(OUTPUT_DEBUG_STRING_INFO* debugString) {};
void ripEvent(RIP_INFO* Rip); virtual void cbRipEvent(RIP_INFO* rip) {};
void log(std::string msg);
virtual void createProcessEvent(CREATE_PROCESS_DEBUG_INFO* createProcess);
virtual void exitProcessEvent(EXIT_PROCESS_DEBUG_INFO* exitProcess);
virtual void createThreadEvent(CREATE_THREAD_DEBUG_INFO* createThread);
virtual void exitThreadEvent(EXIT_THREAD_DEBUG_INFO* exitThread);
virtual void loadDllEvent(LOAD_DLL_DEBUG_INFO* loadDll);
virtual void unloadDllEvent(UNLOAD_DLL_DEBUG_INFO* unloadDll);
virtual void exceptionEvent(EXCEPTION_DEBUG_INFO* exceptionInfo);
virtual void debugStringEvent(OUTPUT_DEBUG_STRING_INFO* debugString);
virtual void ripEvent(RIP_INFO* rip);
virtual void log(std::string msg);
private:
ProcessInfo _mainProcess; ProcessInfo _mainProcess;
DWORD _continueStatus; DWORD _continueStatus;
bool _breakDebugger; bool _breakDebugger;

View File

@ -104,6 +104,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
@ -118,6 +119,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
@ -135,6 +137,7 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="Debugger.Data.h" /> <ClInclude Include="Debugger.Data.h" />
<ClInclude Include="Debugger.h" /> <ClInclude Include="Debugger.h" />
<ClInclude Include="MyDebugger.h" />
<ClInclude Include="_global.h" /> <ClInclude Include="_global.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@ -13,32 +13,41 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter> </Filter>
<Filter Include="Header Files\GleeBug">
<UniqueIdentifier>{20ccba34-8c87-490a-8bd3-5195e625d009}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\GleeBug">
<UniqueIdentifier>{91ea9bea-4704-4816-a885-8afd0e3ff974}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="main.cpp"> <ClCompile Include="main.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="_global.cpp"> <ClCompile Include="_global.cpp">
<Filter>Source Files</Filter> <Filter>Source Files\GleeBug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Debugger.cpp"> <ClCompile Include="Debugger.cpp">
<Filter>Source Files</Filter> <Filter>Source Files\GleeBug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Debugger.Loop.cpp"> <ClCompile Include="Debugger.Loop.cpp">
<Filter>Source Files</Filter> <Filter>Source Files\GleeBug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Debugger.Misc.cpp"> <ClCompile Include="Debugger.Misc.cpp">
<Filter>Source Files</Filter> <Filter>Source Files\GleeBug</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="_global.h"> <ClInclude Include="_global.h">
<Filter>Header Files</Filter> <Filter>Header Files\GleeBug</Filter>
</ClInclude>
<ClInclude Include="Debugger.h">
<Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Debugger.Data.h"> <ClInclude Include="Debugger.Data.h">
<Filter>Header Files\GleeBug</Filter>
</ClInclude>
<ClInclude Include="Debugger.h">
<Filter>Header Files\GleeBug</Filter>
</ClInclude>
<ClInclude Include="MyDebugger.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>

55
GleeBug/MyDebugger.h Normal file
View File

@ -0,0 +1,55 @@
#ifndef _MYDEBUGGER_H
#define _MYDEBUGGER_H
#include "Debugger.h"
class MyDebugger : public GleeBug::Debugger
{
protected:
virtual void cbCreateProcessEvent(CREATE_PROCESS_DEBUG_INFO* createProcess)
{
printf("Process %d created with entry 0x%p\n", _debugEvent.dwProcessId, createProcess->lpStartAddress);
};
virtual void cbExitProcessEvent(EXIT_PROCESS_DEBUG_INFO* exitProcess)
{
printf("Process %d terminated with exit code 0x%08X\n", _debugEvent.dwProcessId, exitProcess->dwExitCode);
}
virtual void cbCreateThreadEvent(CREATE_THREAD_DEBUG_INFO* createThread)
{
printf("Thread %d created with entry 0x%p\n", _debugEvent.dwThreadId, createThread->lpStartAddress);
};
virtual void cbExitThreadEvent(EXIT_THREAD_DEBUG_INFO* exitThread)
{
printf("Thread %d terminated with exit code 0x%08X\n", _debugEvent.dwThreadId, exitThread->dwExitCode);
};
virtual void cbLoadDllEvent(LOAD_DLL_DEBUG_INFO* loadDll)
{
printf("DLL loaded at 0x%p\n", loadDll->lpBaseOfDll);
};
virtual void cbUnloadDllEvent(UNLOAD_DLL_DEBUG_INFO* unloadDll)
{
printf("DLL 0x%p unloaded\n", unloadDll->lpBaseOfDll);
};
virtual void cbExceptionEvent(EXCEPTION_DEBUG_INFO* exceptionInfo)
{
printf("Exception with code 0x%08X\n", exceptionInfo->ExceptionRecord);
};
virtual void cbDebugStringEvent(OUTPUT_DEBUG_STRING_INFO* debugString)
{
printf("Debug string at 0x%p with length %d\n", debugString->lpDebugStringData, debugString->nDebugStringLength);
};
virtual void cbRipEvent(RIP_INFO* rip)
{
printf("RIP event type 0x%X, error 0x%X", rip->dwType, rip->dwError);
};
};
#endif //_MYDEBUGGER_H

View File

@ -1,17 +1,20 @@
#include <cstdio> #include <cstdio>
#include "Debugger.h" #include "Debugger.h"
#include "MyDebugger.h"
using namespace GleeBug;
int main() int main()
{ {
wchar_t szFilePath[256] = L"c:\\CodeBlocks\\arma_cert_bin_info\\bin\\arma_cert_bin_info.exe"; wchar_t szFilePath[256] = L"c:\\CodeBlocks\\arma_cert_bin_info\\bin\\arma_cert_bin_info.exe";
wchar_t szCommandLine[256] = L""; wchar_t szCommandLine[256] = L"";
wchar_t szCurrentDir[256] = L"c:\\CodeBlocks\\arma_cert_bin_info\\bin"; wchar_t szCurrentDir[256] = L"c:\\CodeBlocks\\arma_cert_bin_info\\bin";
GleeBug::Debugger dbg; MyDebugger dbg;
if (dbg.Init(szFilePath, szCommandLine, szCurrentDir)) if (dbg.Init(szFilePath, szCommandLine, szCurrentDir))
{ {
printf("Debugger::Init success! PID: %X\n", dbg.GetMainProcess().ProcessId); puts("Debugger::Init success!");
dbg.Start(); dbg.Start();
printf("Debugger::Start finished!"); puts("Debugger::Start finished!");
} }
else else
{ {