From 7afb72e9a2d5aa2271fb4ab2efe0c72bea5cd5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Wed, 24 Dec 2014 15:48:37 +0000 Subject: [PATCH] [WIN32K] Fix NtUserProcessConnect to use the process handle we give to it, instead of the "current process"... This should fix the user32 CSR connection that I was failing to fix in previous revisions... CORE-8949 svn path=/trunk/; revision=65820 --- reactos/win32ss/include/ntuser.h | 4 ++-- reactos/win32ss/user/ntuser/ntstubs.c | 28 ++++++++++++++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/reactos/win32ss/include/ntuser.h b/reactos/win32ss/include/ntuser.h index ccff07bfc1c..ad87fbd884d 100644 --- a/reactos/win32ss/include/ntuser.h +++ b/reactos/win32ss/include/ntuser.h @@ -2607,9 +2607,9 @@ NtUserPrintWindow( NTSTATUS NTAPI NtUserProcessConnect( - IN HANDLE Process, + IN HANDLE ProcessHandle, OUT PUSERCONNECT pUserConnect, - IN DWORD dwSize); // sizeof(USERCONNECT) + IN ULONG Size); // sizeof(USERCONNECT) NTSTATUS NTAPI diff --git a/reactos/win32ss/user/ntuser/ntstubs.c b/reactos/win32ss/user/ntuser/ntstubs.c index ae3ab4119c5..d4eccd1bf6e 100644 --- a/reactos/win32ss/user/ntuser/ntstubs.c +++ b/reactos/win32ss/user/ntuser/ntstubs.c @@ -720,11 +720,12 @@ NtUserNotifyProcessCreate( NTSTATUS APIENTRY NtUserProcessConnect( - HANDLE Process, - PUSERCONNECT pUserConnect, - DWORD Size) + IN HANDLE ProcessHandle, + OUT PUSERCONNECT pUserConnect, + IN ULONG Size) { - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status; + PEPROCESS Process = NULL; PPROCESSINFO W32Process; TRACE("NtUserProcessConnect\n"); @@ -735,9 +736,20 @@ NtUserProcessConnect( return STATUS_UNSUCCESSFUL; } + /* Get the process object the user handle was referencing */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + *PsProcessType, + UserMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) return Status; + UserEnterShared(); - W32Process = PsGetCurrentProcessWin32Process(); + /* Get Win32 process information */ + W32Process = PsGetProcessWin32Process(Process); + _SEH2_TRY { // FIXME: Check that pUserConnect->ulVersion == USER_VERSION; @@ -755,11 +767,13 @@ NtUserProcessConnect( _SEH2_END; if (!NT_SUCCESS(Status)) - { SetLastNtError(Status); - } UserLeave(); + + /* Dereference the process object */ + ObDereferenceObject(Process); + return Status; }