Alexandre Julliard : kernel32/tests: Add tests for file sharing with file-specific access bits.

Alexandre Julliard julliard at winehq.org
Fri Jul 1 14:11:06 CDT 2011


Module: wine
Branch: master
Commit: 76546888868efe47960993a5609e524cc76f4597
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=76546888868efe47960993a5609e524cc76f4597

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul  1 18:14:06 2011 +0200

kernel32/tests: Add tests for file sharing with file-specific access bits.

---

 dlls/kernel32/tests/file.c |   32 ++++++++++++++++++++++++++------
 1 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index c2523ae..59803c6 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -1768,16 +1768,30 @@ static BOOL create_fake_dll( LPCSTR filename )
     return ret;
 }
 
+static unsigned int map_file_access( unsigned int access )
+{
+    if (access & GENERIC_READ)    access |= FILE_GENERIC_READ;
+    if (access & GENERIC_WRITE)   access |= FILE_GENERIC_WRITE;
+    if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
+    if (access & GENERIC_ALL)     access |= FILE_ALL_ACCESS;
+    return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
+}
+
 static int is_sharing_compatible( DWORD access1, DWORD sharing1, DWORD access2, DWORD sharing2 )
 {
+    access1 = map_file_access( access1 );
+    access2 = map_file_access( access2 );
+    access1 &= FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_EXECUTE | DELETE;
+    access2 &= FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_EXECUTE | DELETE;
+
     if (!access1) sharing1 = FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE;
     if (!access2) sharing2 = FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE;
 
-    if ((access1 & GENERIC_READ) && !(sharing2 & FILE_SHARE_READ)) return 0;
-    if ((access1 & GENERIC_WRITE) && !(sharing2 & FILE_SHARE_WRITE)) return 0;
+    if ((access1 & (FILE_READ_DATA|FILE_EXECUTE)) && !(sharing2 & FILE_SHARE_READ)) return 0;
+    if ((access1 & (FILE_WRITE_DATA|FILE_APPEND_DATA)) && !(sharing2 & FILE_SHARE_WRITE)) return 0;
     if ((access1 & DELETE) && !(sharing2 & FILE_SHARE_DELETE)) return 0;
-    if ((access2 & GENERIC_READ) && !(sharing1 & FILE_SHARE_READ)) return 0;
-    if ((access2 & GENERIC_WRITE) && !(sharing1 & FILE_SHARE_WRITE)) return 0;
+    if ((access2 & (FILE_READ_DATA|FILE_EXECUTE)) && !(sharing1 & FILE_SHARE_READ)) return 0;
+    if ((access2 & (FILE_WRITE_DATA|FILE_APPEND_DATA)) && !(sharing1 & FILE_SHARE_WRITE)) return 0;
     if ((access2 & DELETE) && !(sharing1 & FILE_SHARE_DELETE)) return 0;
     return 1;
 }
@@ -1786,7 +1800,8 @@ static int is_sharing_map_compatible( DWORD map_access, DWORD access2, DWORD sha
 {
     if ((map_access == PAGE_READWRITE || map_access == PAGE_EXECUTE_READWRITE) &&
         !(sharing2 & FILE_SHARE_WRITE)) return 0;
-    if ((map_access & SEC_IMAGE) && (access2 & GENERIC_WRITE)) return 0;
+    access2 = map_file_access( access2 );
+    if ((map_access & SEC_IMAGE) && (access2 & FILE_WRITE_DATA)) return 0;
     return 1;
 }
 
@@ -1794,7 +1809,12 @@ static void test_file_sharing(void)
 {
     static const DWORD access_modes[] =
         { 0, GENERIC_READ, GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE,
-          DELETE, GENERIC_READ|DELETE, GENERIC_WRITE|DELETE, GENERIC_READ|GENERIC_WRITE|DELETE };
+          DELETE, GENERIC_READ|DELETE, GENERIC_WRITE|DELETE, GENERIC_READ|GENERIC_WRITE|DELETE,
+          GENERIC_EXECUTE, GENERIC_EXECUTE | DELETE,
+          FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA, FILE_READ_EA, FILE_WRITE_EA,
+          FILE_READ_DATA | FILE_EXECUTE, FILE_WRITE_DATA | FILE_EXECUTE, FILE_APPEND_DATA | FILE_EXECUTE,
+          FILE_READ_EA | FILE_EXECUTE, FILE_WRITE_EA | FILE_EXECUTE, FILE_EXECUTE,
+          FILE_DELETE_CHILD, FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES };
     static const DWORD sharing_modes[] =
         { 0, FILE_SHARE_READ,
           FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,




More information about the wine-cvs mailing list