diff --git a/src/Logger.c b/src/Logger.c index 907356be0..1cff528c7 100644 --- a/src/Logger.c +++ b/src/Logger.c @@ -14,10 +14,11 @@ #define NOSERVICE #define NOMCX #define NOIME +#define CUR_PROCESS_HANDLE ((HANDLE)-1) /* GetCurrentProcess() always returns -1 */ #include #include -static HANDLE curProcess = (HANDLE)-1; /* GetCurrentProcess() always returns -1 */ +static HANDLE curProcess = CUR_PROCESS_HANDLE; #elif defined CC_BUILD_OPENBSD || defined CC_BUILD_HAIKU || defined CC_BUILD_SERENITY #include /* These operating systems don't provide sys/ucontext.h */ @@ -280,8 +281,9 @@ static void DumpFrame(cc_string* trace, void* addr) { /* - however, ReadProcessMemory expects a process handle, and so that will fail since it's given a process ID */ /* So to work around this, instead manually call ReadProcessMemory with the current process handle */ static BOOL __stdcall ReadMemCallback(HANDLE process, DWORD_PTR baseAddress, PVOID buffer, DWORD size, PDWORD numBytesRead) { - return ReadProcessMemory(GetCurrentProcess(), (LPCVOID)baseAddress, buffer, size, numBytesRead); + return ReadProcessMemory(CUR_PROCESS_HANDLE, (LPCVOID)baseAddress, buffer, size, numBytesRead); } +static cc_uintptr spRegister; static int GetFrames(CONTEXT* ctx, cc_uintptr* addrs, int max) { STACKFRAME frame = { 0 }; @@ -297,11 +299,13 @@ static int GetFrames(CONTEXT* ctx, cc_uintptr* addrs, int max) { frame.AddrPC.Offset = ctx->Eip; frame.AddrFrame.Offset = ctx->Ebp; frame.AddrStack.Offset = ctx->Esp; + spRegister = ctx->Esp; #elif defined _M_X64 type = IMAGE_FILE_MACHINE_AMD64; frame.AddrPC.Offset = ctx->Rip; frame.AddrFrame.Offset = ctx->Rsp; frame.AddrStack.Offset = ctx->Rsp; + spRegister = ctx->Rsp; #else /* Always available after XP, so use that */ return RtlCaptureStackBackTrace(0, max, (void**)addrs, NULL); @@ -857,6 +861,35 @@ static void DumpRegisters(void* ctx) { *------------------------------------------------Module/Memory map handling-----------------------------------------------* *#########################################################################################################################*/ #if defined CC_BUILD_WIN +static void DumpStack(void) { + static const cc_string stack = String_FromConst("-- stack --\r\n"); + cc_string str; char strBuffer[128]; + cc_uint8 buffer[0x10]; + SIZE_T numRead; + int i, j; + + Logger_Log(&stack); + spRegister &= ~0x0F; + spRegister -= 0x40; + + /* Dump 128 bytes near stack pointer */ + for (i = 0; i < 8; i++, spRegister += 0x10) + { + String_InitArray(str, strBuffer); + String_Format1(&str, "0x%x)", &spRegister); + ReadProcessMemory(CUR_PROCESS_HANDLE, (LPCVOID)spRegister, buffer, 0x10, &numRead); + + for (j = 0; j < 0x10; j++) + { + if ((j & 0x03) == 0) String_Append(&str, ' '); + String_AppendHex(&str, buffer[j]); + String_Append(&str, ' '); + } + String_AppendConst(&str, "\r\n"); + Logger_Log(&str); + } +} + static BOOL CALLBACK DumpModule(const char* name, ULONG_PTR base, ULONG size, void* userCtx) { cc_string str; char strBuffer[256]; cc_uintptr beg, end; @@ -872,6 +905,7 @@ static BOOL CALLBACK DumpModule(const char* name, ULONG_PTR base, ULONG size, vo static BOOL (WINAPI *_EnumerateLoadedModules)(HANDLE process, PENUMLOADED_MODULES_CALLBACK callback, PVOID userContext); static void DumpMisc(void) { static const cc_string modules = String_FromConst("-- modules --\r\n"); + if (spRegister >= 0xFFFF) DumpStack(); if (!_EnumerateLoadedModules) return; Logger_Log(&modules);