Dmitry Timoshkov : kernel32/tests: Add more VirtualAlloc and VirtualProtect tests.
Alexandre Julliard
julliard at winehq.org
Tue Jun 25 14:41:24 CDT 2013
Module: wine
Branch: master
Commit: c69cc5506bd0507c1247311ab58425d97fa21168
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c69cc5506bd0507c1247311ab58425d97fa21168
Author: Dmitry Timoshkov <dmitry at 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);
}
More information about the wine-cvs
mailing list