From: Qian Hong Subject: [PATCH 2/2] user32: Implement OpenInputDesktop. Message-Id: <52683D2B.7080306@codeweavers.com> Date: Thu, 24 Oct 2013 05:18:35 +0800 Hello, This is the simplest one I can think of which doesn't break any existent tests. The patch won't conflict with Dmitry's patch: 99926: [21/23] user32/tests: Fix window station and desktop tests compilation with __WINESRC__ defined. (However, I still rebased with Dmitry's patch applied) - Superseded patch 99900 and patch 99498 Thanks for all the comments from everyone. --- dlls/user32/tests/winstation.c | 22 ---------------------- dlls/user32/winstation.c | 20 +++++++++++++++++--- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/dlls/user32/tests/winstation.c b/dlls/user32/tests/winstation.c index d7825a1..4f664dd 100644 --- a/dlls/user32/tests/winstation.c +++ b/dlls/user32/tests/winstation.c @@ -492,29 +492,21 @@ static void test_inputdesktop(void) /* OpenInputDesktop creates new handles for each calls */ old_input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); -todo_wine ok(old_input_desk != NULL, "OpenInputDesktop failed!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(old_input_desk, UOI_NAME, name, 1024, NULL); -todo_wine ok(ret, "GetUserObjectInformation failed!\n"); -todo_wine ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); -todo_wine ok(input_desk != NULL, "OpenInputDesktop failed!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); -todo_wine ok(ret, "GetUserObjectInformation failed!\n"); -todo_wine ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); -todo_wine ok(old_input_desk != input_desk, "returned the same handle!\n"); ret = CloseDesktop(input_desk); -todo_wine ok(ret, "CloseDesktop failed!\n"); /* by default, GetThreadDesktop is the input desktop, SendInput should success. */ @@ -571,10 +563,8 @@ todo_wine /* Set thread desktop to the input desktop, SendInput should success. */ ret = SetThreadDesktop(old_input_desk); -todo_wine ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); -todo_wine ok(thread_desk == old_input_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); @@ -589,17 +579,14 @@ todo_wine ret = SwitchDesktop(new_desk); ok(ret, "SwitchDesktop failed!\n"); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); -todo_wine ok(input_desk != NULL, "OpenInputDesktop failed!\n"); ok(input_desk != new_desk, "returned the same handle!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); -todo_wine ok(ret, "GetUserObjectInformation failed!\n"); todo_wine ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name); ret = CloseDesktop(input_desk); -todo_wine ok(ret, "CloseDesktop failed!\n"); SetLastError(0xdeadbeef); @@ -626,15 +613,11 @@ todo_wine * thread desktop, clean side effects. SendInput should success. */ ret = SwitchDesktop(old_input_desk); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); -todo_wine ok(input_desk != NULL, "OpenInputDesktop failed!\n"); -todo_wine ok(input_desk != old_input_desk, "returned the same handle!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); -todo_wine ok(ret, "GetUserObjectInformation failed!\n"); -todo_wine ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); ret = SetThreadDesktop(old_thread_desk); @@ -652,10 +635,8 @@ todo_wine /* free resources */ ret = CloseDesktop(input_desk); -todo_wine ok(ret, "CloseDesktop failed!\n"); ret = CloseDesktop(old_input_desk); -todo_wine ok(ret, "CloseDesktop failed!\n"); ret = CloseDesktop(new_desk); ok(ret, "CloseDesktop failed!\n"); @@ -684,10 +665,8 @@ static void test_inputdesktop2(void) ret = EnumDesktopsA(GetProcessWindowStation(), desktop_callbackA, 0); ok(!ret, "EnumDesktopsA failed!\n"); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); -todo_wine ok(input_desk != NULL, "OpenInputDesktop failed!\n"); ret = CloseDesktop(input_desk); -todo_wine ok(ret, "CloseDesktop failed!\n"); ret = SetProcessWindowStation(w2); @@ -704,7 +683,6 @@ todo_wine SetLastError(0xdeadbeef); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); ok(input_desk == NULL, "OpenInputDesktop should fail on non default winstation!\n"); -todo_wine ok(GetLastError() == ERROR_INVALID_FUNCTION || broken(GetLastError() == 0xdeadbeef), "last error %08x\n", GetLastError()); hdesk = OpenDesktopA("desk_test", 0, TRUE, DESKTOP_ALL_ACCESS); diff --git a/dlls/user32/winstation.c b/dlls/user32/winstation.c index 96b51179..12b9edc 100644 --- a/dlls/user32/winstation.c +++ b/dlls/user32/winstation.c @@ -462,9 +462,23 @@ BOOL WINAPI EnumDesktopsW( HWINSTA winsta, DESKTOPENUMPROCW func, LPARAM lparam */ HDESK WINAPI OpenInputDesktop( DWORD flags, BOOL inherit, ACCESS_MASK access ) { - FIXME( "(%x,%i,%x): stub\n", flags, inherit, access ); - SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); - return 0; + HANDLE ret = 0; + + TRACE( "(%x,%i,%x)\n", flags, inherit, access ); + + if (flags) + FIXME( "partial stub flags %08x\n", flags ); + + SERVER_START_REQ( open_input_desktop ) + { + req->flags = flags; + req->access = access; + req->attributes = inherit ? OBJ_INHERIT : 0; + if (!wine_server_call_err( req )) ret = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + + return ret; }