diff --git a/MemoryModule.c b/MemoryModule.c index 9f95a70..f77deb5 100644 --- a/MemoryModule.c +++ b/MemoryModule.c @@ -435,6 +435,15 @@ PerformBaseRelocation(PMEMORYMODULE module, ptrdiff_t delta) return TRUE; } +static BOOL +RegisterExceptionHandling(PMEMORYMODULE module) +{ + PIMAGE_DATA_DIRECTORY pDir = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION); + PIMAGE_RUNTIME_FUNCTION_ENTRY pEntry = (PIMAGE_RUNTIME_FUNCTION_ENTRY)(module->codeBase + pDir->VirtualAddress); + UINT count = (pDir->Size / sizeof(IMAGE_RUNTIME_FUNCTION_ENTRY)) - 1; + return RtlAddFunctionTable(pEntry, count, (DWORD64)module->codeBase); +} + static BOOL BuildImportTable(PMEMORYMODULE module) { @@ -609,9 +618,8 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *data, size_t size, } } - GetNativeSystemInfo(&sysInfo); - alignedImageSize = AlignValueUp(old_header->OptionalHeader.SizeOfImage, sysInfo.dwPageSize); - if (alignedImageSize != AlignValueUp(lastSectionEnd, sysInfo.dwPageSize)) { + alignedImageSize = AlignValueUp(old_header->OptionalHeader.SizeOfImage, old_header->OptionalHeader.SectionAlignment); + if (alignedImageSize != AlignValueUp(lastSectionEnd, old_header->OptionalHeader.SectionAlignment)) { SetLastError(ERROR_BAD_EXE_FORMAT); return NULL; } @@ -725,6 +733,11 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *data, size_t size, goto error; } + + if (!RegisterExceptionHandling(result)) { + goto error; + } + // mark memory pages depending on section headers and release // sections that are marked as "discardable" if (!FinalizeSections(result)) {