Alexandre Julliard : kernel32: Store synchronization objects under the session directory.

Alexandre Julliard julliard at winehq.org
Mon Jul 18 09:22:34 CDT 2016


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jul 18 15:38:30 2016 +0900

kernel32: Store synchronization objects under the session directory.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/sync.c  |  8 +++++---
 dlls/ntdll/tests/om.c | 27 ++++++++++++---------------
 2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index 13fb0f0..c10fd01 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -57,8 +57,9 @@ static inline BOOL is_version_nt(void)
 HANDLE get_BaseNamedObjects_handle(void)
 {
     static HANDLE handle = NULL;
-    static const WCHAR basenameW[] =
-        {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s',0};
+    static const WCHAR basenameW[] = {'\\','S','e','s','s','i','o','n','s','\\','%','u',
+                                      '\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s',0};
+    WCHAR buffer[64];
     UNICODE_STRING str;
     OBJECT_ATTRIBUTES attr;
 
@@ -66,7 +67,8 @@ HANDLE get_BaseNamedObjects_handle(void)
     {
         HANDLE dir;
 
-        RtlInitUnicodeString(&str, basenameW);
+        sprintfW( buffer, basenameW, NtCurrentTeb()->Peb->SessionId );
+        RtlInitUnicodeString( &str, buffer );
         InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
         NtOpenDirectoryObject(&dir, DIRECTORY_CREATE_OBJECT|DIRECTORY_TRAVERSE,
                               &attr);
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 64a16ab..43c5ee4 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -231,13 +231,14 @@ static HANDLE get_base_dir(void)
     UNICODE_STRING str;
     OBJECT_ATTRIBUTES attr;
     HANDLE dir, h;
-    unsigned int i;
+    char name[40];
 
     h = CreateMutexA(NULL, FALSE, objname);
     ok(h != 0, "CreateMutexA failed got ret=%p (%d)\n", h, GetLastError());
     InitializeObjectAttributes(&attr, &str, OBJ_OPENIF, 0, NULL);
 
-    pRtlCreateUnicodeStringFromAsciiz(&str, "\\BaseNamedObjects\\Local");
+    sprintf( name, "\\BaseNamedObjects\\Session\\%u", NtCurrentTeb()->Peb->SessionId );
+    pRtlCreateUnicodeStringFromAsciiz(&str, name );
     status = pNtOpenDirectoryObject(&dir, DIRECTORY_QUERY, &attr);
     pRtlFreeUnicodeString(&str);
     if (!status && is_correct_dir( dir, objname )) goto done;
@@ -249,16 +250,6 @@ static HANDLE get_base_dir(void)
     if (!status && is_correct_dir( dir, objname )) goto done;
     if (!status) pNtClose( dir );
 
-    for (i = 0; i < 20; i++)
-    {
-        char name[40];
-        sprintf( name, "\\BaseNamedObjects\\Session\\%u", i );
-        pRtlCreateUnicodeStringFromAsciiz(&str, name );
-        status = pNtOpenDirectoryObject(&dir, DIRECTORY_QUERY, &attr);
-        pRtlFreeUnicodeString(&str);
-        if (!status && is_correct_dir( dir, objname )) goto done;
-        if (!status) pNtClose( dir );
-    }
     dir = 0;
 
 done:
@@ -1293,10 +1284,12 @@ static void test_query_object(void)
     NTSTATUS status;
     ULONG len, expected_len;
     OBJECT_ATTRIBUTES attr;
-    UNICODE_STRING path, *str;
+    UNICODE_STRING path, session, *str;
     char dir[MAX_PATH], tmp_path[MAX_PATH], file1[MAX_PATH + 16];
     LARGE_INTEGER size;
 
+    sprintf( tmp_path, "\\Sessions\\%u", NtCurrentTeb()->Peb->SessionId );
+    pRtlCreateUnicodeStringFromAsciiz( &session, tmp_path );
     InitializeObjectAttributes( &attr, &path, 0, 0, 0 );
 
     handle = CreateEventA( NULL, FALSE, FALSE, "test_event" );
@@ -1330,8 +1323,11 @@ static void test_query_object(void)
     ok( str->Length >= sizeof(name), "unexpected len %u\n", str->Length );
     ok( len > sizeof(UNICODE_STRING) + sizeof("\\test_event") * sizeof(WCHAR),
         "name too short %s\n", wine_dbgstr_w(str->Buffer) );
-    /* there can be a \\Sessions prefix in the name */
-    ok( !memcmp( str->Buffer + (str->Length - sizeof(name)) / sizeof(WCHAR), name, sizeof(name) ),
+    /* check for \\Sessions prefix in the name */
+    ok( (str->Length > session.Length &&
+         !memcmp( str->Buffer, session.Buffer, session.Length ) &&
+         !memcmp( str->Buffer + session.Length / sizeof(WCHAR), name, sizeof(name) )) ||
+        broken( !memcmp( str->Buffer, name, sizeof(name) )), /* winxp */
         "wrong name %s\n", wine_dbgstr_w(str->Buffer) );
     trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
 
@@ -1528,6 +1524,7 @@ static void test_query_object(void)
         trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
         pNtClose( handle );
     }
+    pRtlFreeUnicodeString( &session );
 }
 
 static void test_type_mismatch(void)




More information about the wine-cvs mailing list