From: Jacek Caban Subject: kernel32: Don't set unconditionally SECTION_QUERY flag in OpenFileMapping. Message-Id: <56E2B8C4.9060208@codeweavers.com> Date: Fri, 11 Mar 2016 13:23:32 +0100 Signed-off-by: Jacek Caban --- dlls/kernel32/tests/virtual.c | 50 +++++++++++++++++++++++++++++++++++++++++++ dlls/kernel32/virtual.c | 1 - 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index a3ae5e6..ce7e922 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -51,6 +51,7 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static NTSTATUS (WINAPI *pNtProtectVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG, ULONG *); static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG); static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG); +static NTSTATUS (WINAPI *pNtQueryObject)(HANDLE,OBJECT_INFORMATION_CLASS,PVOID,ULONG,PULONG); /* ############################### */ @@ -72,6 +73,17 @@ static HANDLE create_target_process(const char *arg) return pi.hProcess; } +static ACCESS_MASK get_obj_access(HANDLE obj) +{ + OBJECT_BASIC_INFORMATION info; + NTSTATUS status; + + status = pNtQueryObject(obj, ObjectBasicInformation, &info, sizeof(info), NULL); + ok(!status, "NtQueryObject error %#x\n", status); + + return info.GrantedAccess; +} + static void test_VirtualAllocEx(void) { const unsigned int alloc_size = 1<<15; @@ -1377,6 +1389,42 @@ static void test_CreateFileMapping(void) CloseHandle( handle ); } +static void test_OpenFileMapping(void) +{ + HANDLE created_handle, handle; + DWORD access; + int i; + + static const struct { + DWORD open_access; + DWORD handle_access; + } access_tests[] = { + { FILE_MAP_ALL_ACCESS, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_EXTEND_SIZE | SECTION_MAP_EXECUTE | SECTION_MAP_READ | SECTION_MAP_WRITE }, + { SECTION_MAP_READ | SECTION_MAP_WRITE, SECTION_MAP_READ | SECTION_MAP_WRITE}, + { SECTION_MAP_WRITE, SECTION_MAP_WRITE}, + { SECTION_MAP_READ | SECTION_QUERY, SECTION_MAP_READ | SECTION_QUERY}, + { SECTION_QUERY, SECTION_MAP_READ }, + { SECTION_QUERY | SECTION_MAP_READ, SECTION_QUERY | SECTION_MAP_READ }, + { GENERIC_READ, READ_CONTROL | SECTION_MAP_READ | SECTION_QUERY } + }; + + created_handle = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, + "Wine Test Open Mapping"); + ok( created_handle != NULL, "CreateFileMapping failed with error %u\n", GetLastError()); + + for(i=0; i < sizeof(access_tests)/sizeof(*access_tests); i++) + { + handle = OpenFileMappingA( access_tests[i].open_access, FALSE, "Wine Test Open Mapping"); + ok( handle != NULL, "OpenFileMapping failed with error %d\n", GetLastError()); + access = get_obj_access( handle ); + ok( access == access_tests[i].handle_access, "[%d] unexpected access flags %x, expected %x\n", + i, access, access_tests[i].handle_access ); + CloseHandle( handle ); + } + + CloseHandle( created_handle ); + } + static void test_IsBadReadPtr(void) { BOOL ret; @@ -3823,6 +3871,7 @@ START_TEST(virtual) pNtProtectVirtualMemory = (void *)GetProcAddress( hntdll, "NtProtectVirtualMemory" ); pNtAllocateVirtualMemory = (void *)GetProcAddress( hntdll, "NtAllocateVirtualMemory" ); pNtFreeVirtualMemory = (void *)GetProcAddress( hntdll, "NtFreeVirtualMemory" ); + pNtQueryObject = (void *)GetProcAddress( hntdll, "NtQueryObject" ); test_shared_memory(FALSE); test_shared_memory_ro(FALSE, FILE_MAP_READ|FILE_MAP_WRITE); @@ -3838,6 +3887,7 @@ START_TEST(virtual) test_NtMapViewOfSection(); test_NtAreMappedFilesTheSame(); test_CreateFileMapping(); + test_OpenFileMapping(); test_IsBadReadPtr(); test_IsBadWritePtr(); test_IsBadCodePtr(); diff --git a/dlls/kernel32/virtual.c b/dlls/kernel32/virtual.c index cce707b..32f2d65 100644 --- a/dlls/kernel32/virtual.c +++ b/dlls/kernel32/virtual.c @@ -472,7 +472,6 @@ HANDLE WINAPI OpenFileMappingW( DWORD access, BOOL inherit, LPCWSTR name) RtlInitUnicodeString( &nameW, name ); if (access == FILE_MAP_COPY) access = SECTION_MAP_READ; - access |= SECTION_QUERY; if (GetVersion() & 0x80000000) {