Files
SonicForgeStudio/native_bridge/debug/patch_invalid_param.py

54 lines
1.8 KiB
Python

import io
p = r'C:\Users\locpham\SonicForgeStudio\native_bridge\src\gui_probe.cpp'
s = io.open(p, encoding='utf-8', newline='').read()
def crlf(x): return x.replace('\n', '\r\n')
# 1) add includes + handler helpers after existing includes
old_inc = crlf('#include <thread>')
new_inc = crlf('''#include <thread>
#include <exception>
#ifdef _WIN32
static void probe_invalid_param(const wchar_t* expr, const wchar_t* func, const wchar_t* file,
unsigned int line, uintptr_t reserved) {
printf("[probe] INVALID_PARAMETER expr=%ls func=%ls\\n", expr ? expr : L"null", func ? func : L"null");
fflush(stdout);
}
#endif''')
assert s.count(old_inc) == 1
s = s.replace(old_inc, new_inc)
# 2) pump_for: wrap body with SEH + param handler
old_pf = crlf('''static void pump_for(int secs) {
auto t0 = std::chrono::steady_clock::now();
while (std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::steady_clock::now() - t0).count() < secs) {
MSG msg;
while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
Sleep(5);
}
}''')
new_pf = crlf('''static void pump_for(int secs) {
#ifdef _WIN32
_set_invalid_parameter_handler(probe_invalid_param);
#endif
auto t0 = std::chrono::steady_clock::now();
while (std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::steady_clock::now() - t0).count() < secs) {
MSG msg;
while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
Sleep(5);
}
}''')
assert s.count(old_pf) == 1
s = s.replace(old_pf, new_pf)
io.open(p, 'w', encoding='utf-8', newline='').write(s)
print('patched')