import io, sys p = r"C:/Users/locpham/SonicForgeStudio/native_bridge/src/main.cpp" data = open(p, "rb").read() def rep(old, new, count=1): global data old = old.encode() new = new.encode() assert data.count(old) >= count, "pattern not found: %r" % old data = data.replace(old, new, count) # 1. includes: cstdio + dbghelp.h into the _WIN32 block rep("#include \n#include \n", "#include \n#include \n#include \n#include \n") # 2. handler + registration at main entry handler = r""" // --- crash minidump handler (temp diagnostics) ------------------------------- // WER LocalDumps produces NO dump for 0xC0000374 (heap corruption) — write our // own minidump via dbghelp.dll when an unhandled exception reaches this filter. #ifdef _WIN32 static LONG WINAPI CrashDumpHandler(EXCEPTION_POINTERS* ep) { static LONG once = 0; if (InterlockedCompareExchange(&once, 1, 0)) return EXCEPTION_CONTINUE_SEARCH; PEXCEPTION_RECORD er = ep ? ep->ExceptionRecord : nullptr; std::cerr << "[CRASH] exception code=0x" << std::hex << (er ? er->ExceptionCode : 0) << " addr=0x" << (er ? (void*)er->ExceptionAddress : nullptr) << std::dec << std::endl; if (er) { HMODULE hMod = nullptr; char modPath[MAX_PATH] = {0}; if (GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)er->ExceptionAddress, &hMod) && hMod) { GetModuleFileNameA(hMod, modPath, MAX_PATH); std::cerr << "[CRASH] faulting module: " << modPath << std::endl; } } const char* dumpDir = "C:/Users/locpham/AppData/Local/Temp/sf_dumps"; CreateDirectoryA(dumpDir, nullptr); char dumpPath[MAX_PATH]; snprintf(dumpPath, sizeof(dumpPath), "%s/bridge_crash_%lu.dmp", dumpDir, GetCurrentProcessId()); HMODULE hDbg = LoadLibraryA("dbghelp.dll"); if (hDbg) { typedef BOOL(WINAPI* MiniDumpWriteDumpFn)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); auto pMiniDumpWriteDump = (MiniDumpWriteDumpFn)GetProcAddress(hDbg, "MiniDumpWriteDump"); if (pMiniDumpWriteDump) { HANDLE hFile = CreateFileA(dumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION mei = {}; mei.ThreadId = GetCurrentThreadId(); mei.ExceptionPointers = ep; mei.ClientPointers = TRUE; BOOL ok = pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mei, nullptr, nullptr); CloseHandle(hFile); std::cerr << "[CRASH] minidump " << (ok ? "written: " : "FAILED: ") << dumpPath << std::endl; } else { std::cerr << "[CRASH] cannot open dump file" << std::endl; } } else { std::cerr << "[CRASH] MiniDumpWriteDump not found in dbghelp.dll" << std::endl; } } else { std::cerr << "[CRASH] cannot load dbghelp.dll" << std::endl; } return EXCEPTION_CONTINUE_SEARCH; // let WER proceed, process dies normally } #endif """ rep("int main(int argc, char* argv[]) {\n", handler + "\nint main(int argc, char* argv[]) {\n SetUnhandledExceptionFilter(CrashDumpHandler);\n") open(p, "wb").write(data) print("patched OK, size=", len(data))