ntoskrnl.exe: Protect the two relocated pages independently.
They may have different protection flags.
This fixes a regression introduced by 22dfb0df10
.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49198
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
9ddceebe52
commit
c750ae6b9d
|
@ -3413,8 +3413,8 @@ static NTSTATUS perform_relocations( void *module, SIZE_T len, ULONG page_size )
|
|||
|
||||
while (rel < end - 1 && rel->SizeOfBlock)
|
||||
{
|
||||
void *page = get_rva( module, rel->VirtualAddress );
|
||||
DWORD old_prot;
|
||||
char *page = get_rva( module, rel->VirtualAddress );
|
||||
DWORD old_prot1, old_prot2;
|
||||
|
||||
if (rel->VirtualAddress >= len)
|
||||
{
|
||||
|
@ -3424,10 +3424,12 @@ static NTSTATUS perform_relocations( void *module, SIZE_T len, ULONG page_size )
|
|||
|
||||
/* Relocation entries may hang over the end of the page, so we need to
|
||||
* protect two pages. */
|
||||
VirtualProtect( page, page_size * 2, PAGE_READWRITE, &old_prot );
|
||||
VirtualProtect( page, page_size, PAGE_READWRITE, &old_prot1 );
|
||||
VirtualProtect( page + page_size, page_size, PAGE_READWRITE, &old_prot2 );
|
||||
rel = LdrProcessRelocationBlock( page, (rel->SizeOfBlock - sizeof(*rel)) / sizeof(USHORT),
|
||||
(USHORT *)(rel + 1), delta );
|
||||
VirtualProtect( page, page_size * 2, old_prot, &old_prot );
|
||||
VirtualProtect( page, page_size, old_prot1, &old_prot1 );
|
||||
VirtualProtect( page + page_size, page_size, old_prot2, &old_prot2 );
|
||||
if (!rel) return STATUS_INVALID_IMAGE_FORMAT;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue