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