From: Felix Münchhalfenjan.felix.muenchhalfen@rwth-aachen.de
--- dlls/kernelbase/tests/process.c | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
diff --git a/dlls/kernelbase/tests/process.c b/dlls/kernelbase/tests/process.c index 88a527c45d5..6045d04e3bc 100644 --- a/dlls/kernelbase/tests/process.c +++ b/dlls/kernelbase/tests/process.c @@ -38,6 +38,7 @@ static LPVOID (WINAPI *pMapViewOfFile3)(HANDLE, HANDLE, PVOID, ULONG64 offset, S static LPVOID (WINAPI *pVirtualAlloc2)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM_EXTENDED_PARAMETER *, ULONG); static LPVOID (WINAPI *pVirtualAlloc2FromApp)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM_EXTENDED_PARAMETER *, ULONG); static PVOID (WINAPI *pVirtualAllocFromApp)(PVOID, SIZE_T, DWORD, DWORD); +static BOOL (WINAPI *pVirtualFree)(LPVOID,SIZE_T,DWORD); static HANDLE (WINAPI *pOpenFileMappingFromApp)( ULONG, BOOL, LPCWSTR); static HANDLE (WINAPI *pCreateFileMappingFromApp)(HANDLE, PSECURITY_ATTRIBUTES, ULONG, ULONG64, PCWSTR); static LPVOID (WINAPI *pMapViewOfFileFromApp)(HANDLE, ULONG, ULONG64, SIZE_T); @@ -134,6 +135,37 @@ static void test_MapViewOfFile3(void) ok(ret, "Failed to delete a test file.\n"); }
+static void test_MapViewOfFileReplacePlaceholder(void) +{ + SYSTEM_INFO si; + size_t szFile = 1024UL*1024; // 1M + HANDLE hFileMapping; + PVOID pAllocation; + PVOID pMapStart; + PVOID pMapEnd; + BOOL bVirtualFree; + PVOID pMappedFileView; + + GetSystemInfo(&si); + + hFileMapping = CreateFileMappingA(NULL, NULL, PAGE_READWRITE, 0, (DWORD)szFile, NULL); + ok(hFileMapping != NULL, "CreateFileMapping did not return a handle\n"); + + pAllocation = pVirtualAlloc2(GetCurrentProcess(), NULL, szFile, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, NULL, 0); + ok(pAllocation != NULL, "VirtualAlloc2 returned NULL\n"); + + pMapStart = (void*)(((unsigned long long)pAllocation + si.dwPageSize) & ~(si.dwPageSize-1)); // advance forward to align with pagesize + pMapEnd = (void*)(((unsigned long long)pAllocation + 2*si.dwPageSize) & ~(si.dwPageSize-1)); + bVirtualFree = pVirtualFree(pMapStart, si.dwPageSize, MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER); // split the region into two placeholders + ok(bVirtualFree, "VirtualFree failed to split the placeholder\n"); + pMappedFileView = pMapViewOfFile3(hFileMapping, GetCurrentProcess(), pMapStart, si.dwPageSize, si.dwPageSize, MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, NULL, 0); + ok(pMappedFileView != NULL, "MapViewOfFile3 did not map the FileMapping\n"); + + bVirtualFree = pVirtualFree(pMapEnd, szFile - 2*si.dwPageSize, MEM_RELEASE); + ok(bVirtualFree, "VirtualFree failed to free the remaining placeholder\n"); + ok(CloseHandle(hFileMapping), "CloseHandle failed on hFileMapping\n"); +} + #define check_region_size(p, s) check_region_size_(p, s, __LINE__) static void check_region_size_(void *p, SIZE_T s, unsigned int line) { @@ -519,6 +551,7 @@ static void init_funcs(void) X(VirtualAlloc2); X(VirtualAlloc2FromApp); X(VirtualAllocFromApp); + X(VirtualFree); X(UnmapViewOfFile2);
hmod = GetModuleHandleA("ntdll.dll"); @@ -533,6 +566,7 @@ START_TEST(process)
test_CompareObjectHandles(); test_MapViewOfFile3(); + test_MapViewOfFileReplacePlaceholder(); test_VirtualAlloc2(); test_VirtualAllocFromApp(); test_VirtualAlloc2FromApp();