From: Jacek Caban <jacek@codeweavers.com>
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 <jacek@codeweavers.com>
---
 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)
     {