=?UTF-8?Q?Michael=20M=C3=BCller=20?=: ntdll: Fix handling of page fault if a guard page and write watch is triggered at the same time.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Oct 7 14:49:55 CDT 2014
Module: wine
Branch: master
Commit: 9e6971590000dcc9d4b7ed9e69d51bb340cf5412
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9e6971590000dcc9d4b7ed9e69d51bb340cf5412
Author: Michael Müller <michael at fds-team.de>
Date: Sat Oct 4 02:48:16 2014 +0200
ntdll: Fix handling of page fault if a guard page and write watch is triggered at the same time.
---
dlls/kernel32/tests/virtual.c | 1 -
dlls/ntdll/virtual.c | 10 +++++-----
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index af0e6b4..0fa2b99 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1728,7 +1728,6 @@ static void test_guard_page(void)
num_guard_page_calls = 0;
*value = 1;
*(value + 1) = 2;
- todo_wine
ok( num_guard_page_calls == 1, "expected one callback of guard page handler, got %d calls\n", num_guard_page_calls );
pNtCurrentTeb()->Tib.ExceptionList = frame.Prev;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 4819d2d..f8a5dd3 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1522,11 +1522,6 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err )
{
void *page = ROUND_ADDR( addr, page_mask );
BYTE *vprot = &view->prot[((const char *)page - (const char *)view->base) >> page_shift];
- if (*vprot & VPROT_GUARD)
- {
- VIRTUAL_SetProt( view, page, page_size, *vprot & ~VPROT_GUARD );
- ret = STATUS_GUARD_PAGE_VIOLATION;
- }
if ((err & EXCEPTION_WRITE_FAULT) && (view->protect & VPROT_WRITEWATCH))
{
if (*vprot & VPROT_WRITEWATCH)
@@ -1537,6 +1532,11 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err )
/* ignore fault if page is writable now */
if (VIRTUAL_GetUnixProt( *vprot ) & PROT_WRITE) ret = STATUS_SUCCESS;
}
+ if (*vprot & VPROT_GUARD)
+ {
+ VIRTUAL_SetProt( view, page, page_size, *vprot & ~VPROT_GUARD );
+ ret = STATUS_GUARD_PAGE_VIOLATION;
+ }
}
server_leave_uninterrupted_section( &csVirtual, &sigset );
return ret;
More information about the wine-cvs
mailing list