Module: wine Branch: master Commit: c69cc5506bd0507c1247311ab58425d97fa21168 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c69cc5506bd0507c1247311ab5...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Tue Jun 25 14:43:49 2013 +0900
kernel32/tests: Add more VirtualAlloc and VirtualProtect tests.
---
dlls/kernel32/tests/virtual.c | 69 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 65 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index c0c1a89..521ce6e 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -1581,7 +1581,7 @@ static void test_VirtualProtect(void) { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ, 0 }, /* 0xe0 */ { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE, 0 } /* 0xf0 */ }; - char *base; + char *base, *ptr; DWORD ret, old_prot, rw_prot, exec_prot, i, j; MEMORY_BASIC_INFORMATION info; SYSTEM_INFO si; @@ -1652,6 +1652,27 @@ static void test_VirtualProtect(void) DWORD prot = exec_prot | rw_prot;
SetLastError(0xdeadbeef); + ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, prot); + if ((rw_prot && exec_prot) || (!rw_prot && !exec_prot)) + { + ok(!ptr, "VirtualAlloc(%02x) should fail\n", prot); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + else + { + if (prot & (PAGE_WRITECOPY | PAGE_EXECUTE_WRITECOPY)) + { + ok(!ptr, "VirtualAlloc(%02x) should fail\n", prot); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + else + { + ok(ptr != NULL, "VirtualAlloc(%02x) error %d\n", prot, GetLastError()); + ok(ptr == base, "expected %p, got %p\n", base, ptr); + } + } + + SetLastError(0xdeadbeef); ret = VirtualProtect(base, si.dwPageSize, prot, &old_prot); if ((rw_prot && exec_prot) || (!rw_prot && !exec_prot)) { @@ -1734,7 +1755,7 @@ static void test_VirtualAlloc_protection(void) { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ, FALSE }, /* 0xe0 */ { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE, FALSE } /* 0xf0 */ }; - char *base; + char *base, *ptr; DWORD ret, i; MEMORY_BASIC_INFORMATION info; SYSTEM_INFO si; @@ -1772,6 +1793,10 @@ static void test_VirtualAlloc_protection(void) ok(info.Protect == td[i].prot, "%d: got %#x != expected %#x\n", i, info.Protect, td[i].prot); }
+ SetLastError(0xdeadbeef); + ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, td[i].prot); + ok(ptr == base, "%d: VirtualAlloc failed %d\n", i, GetLastError()); + VirtualFree(base, 0, MEM_FREE); } else @@ -1824,7 +1849,7 @@ static void test_CreateFileMapping_protection(void) { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ, FALSE, PAGE_NOACCESS }, /* 0xe0 */ { PAGE_EXECUTE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE, FALSE, PAGE_NOACCESS } /* 0xf0 */ }; - char *base; + char *base, *ptr; DWORD ret, i, alloc_prot, prot, old_prot; MEMORY_BASIC_INFORMATION info; SYSTEM_INFO si; @@ -1896,6 +1921,27 @@ static void test_CreateFileMapping_protection(void) ok(info.Protect == td[i].prot, "%d: got %#x != expected %#x\n", i, info.Protect, td[i].prot); }
+ SetLastError(0xdeadbeef); + ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, td[i].prot); + /* FIXME: remove once Wine is fixed */ + if (td[i].prot == PAGE_WRITECOPY || td[i].prot == PAGE_EXECUTE_WRITECOPY) + ok(!ptr, "%d: VirtualAlloc(%02x) should fail\n", i, td[i].prot); + else +todo_wine + ok(!ptr, "%d: VirtualAlloc(%02x) should fail\n", i, td[i].prot); +todo_wine + ok(GetLastError() == ERROR_ACCESS_DENIED, "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError()); + + SetLastError(0xdeadbeef); + ret = VirtualProtect(base, si.dwPageSize, td[i].prot, &old_prot); + if (td[i].prot == PAGE_READONLY || td[i].prot == PAGE_WRITECOPY) + ok(ret, "%d: VirtualProtect(%02x) error %d\n", i, td[i].prot, GetLastError()); + else + { + ok(!ret, "%d: VirtualProtect(%02x) should fail\n", i, td[i].prot); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "%d: expected ERROR_INVALID_PARAMETER, got %d\n", i, GetLastError()); + } + UnmapViewOfFile(base); CloseHandle(hmap); } @@ -2196,7 +2242,7 @@ static void test_mapping(void) { FILE_MAP_EXECUTE | SECTION_MAP_EXECUTE | FILE_MAP_READ | FILE_MAP_WRITE, PAGE_EXECUTE_READWRITE }, /* 0x2e */ { FILE_MAP_EXECUTE | SECTION_MAP_EXECUTE | FILE_MAP_READ | FILE_MAP_WRITE | FILE_MAP_COPY, PAGE_EXECUTE_READWRITE } /* 0x2f */ }; - void *base, *nt_base; + void *base, *nt_base, *ptr; DWORD i, j, k, ret, old_prot, prev_prot; SYSTEM_INFO si; char temp_path[MAX_PATH]; @@ -2376,6 +2422,21 @@ static void test_mapping(void) } }
+ for (k = 0; k < sizeof(page_prot)/sizeof(page_prot[0]); k++) + { + /*trace("map %#x, view %#x, requested prot %#x\n", page_prot[i], view[j].prot, page_prot[k]);*/ + SetLastError(0xdeadbeef); + ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, page_prot[k]); + /* FIXME: remove once Wine is fixed */ + if (page_prot[k] == PAGE_WRITECOPY || page_prot[k] == PAGE_EXECUTE_WRITECOPY) + ok(!ptr, "VirtualAlloc(%02x) should fail\n", page_prot[k]); + else +todo_wine + ok(!ptr, "VirtualAlloc(%02x) should fail\n", page_prot[k]); +todo_wine + ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); + } + UnmapViewOfFile(base); }