static void mark_section_writable (LPVOID addr) { MEMORY_BASIC_INFORMATION b; PIMAGE_SECTION_HEADER h; int i; for (i = 0; i < maxSections; i++) { if (the_secs[i].sec_start <= ((LPBYTE) addr) && ((LPBYTE) addr) < (the_secs[i].sec_start + the_secs[i].hash->Misc.VirtualSize)) return; } h = __mingw_GetSectionForAddress (addr); if (!h) { __report_error ("Address %p has no image-section", addr); return; } the_secs[i].hash = h; the_secs[i].old_protect = 0; the_secs[i].sec_start = _GetPEImageBase () + h->VirtualAddress; if (!VirtualQuery (the_secs[i].sec_start, &b, sizeof(b))) { __report_error (" VirtualQuery failed for %d bytes at address %p", (int) h->Misc.VirtualSize, the_secs[i].sec_start); return; } if (b.Protect != PAGE_EXECUTE_READWRITE && b.Protect != PAGE_READWRITE) { if (!VirtualProtect (b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, &the_secs[i].old_protect)) __report_error (" VirtualProtect failed with code 0x%x", (int) GetLastError ()); } ++maxSections; return; }
int __mingw_init_ehandler (void) { static int was_here = 0; size_t e = 0; PIMAGE_SECTION_HEADER pSec; PBYTE _ImageBase = _GetPEImageBase (); if (was_here || !_ImageBase) return was_here; was_here = 1; if (_FindPESectionByName (".pdata") != NULL) return 1; /* Allocate # of e tables and entries. */ memset (emu_pdata, 0, sizeof (RUNTIME_FUNCTION) * MAX_PDATA_ENTRIES); memset (emu_xdata, 0, sizeof (UNWIND_INFO) * MAX_PDATA_ENTRIES); e = 0; /* Fill tables and entries. */ while (e < MAX_PDATA_ENTRIES && (pSec = _FindPESectionExec (e)) != NULL) { emu_xdata[e].VersionAndFlags = 9; /* UNW_FLAG_EHANDLER | UNW_VERSION */ emu_xdata[e].AddressOfExceptionHandler = (DWORD)(size_t) ((LPBYTE)__mingw_SEH_error_handler - _ImageBase); emu_pdata[e].BeginAddress = pSec->VirtualAddress; emu_pdata[e].EndAddress = pSec->VirtualAddress + pSec->Misc.VirtualSize; emu_pdata[e].UnwindData = (DWORD)(size_t)((LPBYTE)&emu_xdata[e] - _ImageBase); ++e; } #ifdef _DEBUG_CRT if (!e || e > MAX_PDATA_ENTRIES) abort (); #endif /* RtlAddFunctionTable. */ if (e != 0) RtlAddFunctionTable (emu_pdata, e, (DWORD64)_ImageBase); return 1; }