mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 01:12:06 +00:00
[Win32k]
- Thread ID to Thread Information. svn path=/trunk/; revision=59000
This commit is contained in:
parent
6ca4c20d1b
commit
b256611e05
|
@ -1456,7 +1456,6 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
|||
UNICODE_STRING ModuleName;
|
||||
NTSTATUS Status;
|
||||
HHOOK Handle;
|
||||
PETHREAD Thread = NULL;
|
||||
PTHREADINFO pti, ptiHook = NULL;
|
||||
DECLARE_RETURN(HHOOK);
|
||||
|
||||
|
@ -1491,15 +1490,13 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
|||
RETURN( NULL);
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(PsLookupThreadByThreadId((HANDLE)(DWORD_PTR) ThreadId, &Thread)))
|
||||
if ( !(ptiHook = IntTID2PTI( (HANDLE)ThreadId )))
|
||||
{
|
||||
ERR("Invalid thread id 0x%x\n", ThreadId);
|
||||
EngSetLastError(ERROR_INVALID_PARAMETER);
|
||||
RETURN( NULL);
|
||||
}
|
||||
|
||||
ptiHook = Thread->Tcb.Win32Thread;
|
||||
|
||||
if ( ptiHook->rpdesk != pti->rpdesk) // gptiCurrent->rpdesk)
|
||||
{
|
||||
ERR("Local hook wrong desktop HookId: %d\n",HookId);
|
||||
|
@ -1507,7 +1504,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
|||
RETURN( NULL);
|
||||
}
|
||||
|
||||
if (Thread->ThreadsProcess != PsGetCurrentProcess())
|
||||
if (ptiHook->ppi != pti->ppi)
|
||||
{
|
||||
if ( !Mod &&
|
||||
(HookId == WH_GETMESSAGE ||
|
||||
|
@ -1674,6 +1671,9 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
|||
}
|
||||
|
||||
Hook->ModuleName.Length = ModuleName.Length;
|
||||
//// FIXME: Need to load from user32 to verify hMod before calling hook with hMod set!!!!
|
||||
//// Mod + offPfn == new HookProc Justin Case module is from another process.
|
||||
FIXME("NtUserSetWindowsHookEx Setting process hMod instance addressing.\n");
|
||||
/* Make proc relative to the module base */
|
||||
Hook->offPfn = (ULONG_PTR)((char *)HookProc - (char *)Mod);
|
||||
}
|
||||
|
@ -1685,7 +1685,6 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
|||
|
||||
CLEANUP:
|
||||
TRACE("Leave NtUserSetWindowsHookEx, ret=%i\n",_ret_);
|
||||
if (Thread) ObDereferenceObject(Thread);
|
||||
UserLeave();
|
||||
END_CLEANUP;
|
||||
}
|
||||
|
|
|
@ -2,13 +2,55 @@
|
|||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS Win32k subsystem
|
||||
* PURPOSE: Miscellaneous User functions
|
||||
* FILE: subsystems/win32/win32k/ntuser/misc.c
|
||||
* FILE: win32ss/user/ntuser/misc.c
|
||||
* PROGRAMER: Ge van Geldorp (ge@gse.nl)
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
DBG_DEFAULT_CHANNEL(UserMisc);
|
||||
|
||||
/*
|
||||
* Test the Thread to verify and validate it. Hard to the core tests are required.
|
||||
*/
|
||||
PTHREADINFO
|
||||
FASTCALL
|
||||
IntTID2PTI(HANDLE id)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PETHREAD Thread;
|
||||
PTHREADINFO pti;
|
||||
Status = PsLookupThreadByThreadId(id, &Thread);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if (PsIsThreadTerminating(Thread))
|
||||
{
|
||||
ObDereferenceObject(Thread);
|
||||
return NULL;
|
||||
}
|
||||
pti = PsGetThreadWin32Thread(Thread);
|
||||
if (!pti)
|
||||
{
|
||||
ObDereferenceObject(Thread);
|
||||
return NULL;
|
||||
}
|
||||
// Validate and verify!
|
||||
_SEH2_TRY
|
||||
{
|
||||
if (pti->TIF_flags & TIF_INCLEANUP) pti = NULL;
|
||||
if (pti && !(pti->TIF_flags & TIF_GUITHREADINITIALIZED)) pti = NULL;
|
||||
if (PsGetThreadId(Thread) != id) pti = NULL;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
pti = NULL;
|
||||
}
|
||||
_SEH2_END
|
||||
ObDereferenceObject(Thread);
|
||||
return pti;
|
||||
}
|
||||
|
||||
SHORT
|
||||
FASTCALL
|
||||
UserGetLanguageID(VOID)
|
||||
|
|
|
@ -29,30 +29,21 @@ NtUserAttachThreadInput(
|
|||
IN BOOL fAttach)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PETHREAD Thread, ThreadTo;
|
||||
PTHREADINFO pti, ptiTo;
|
||||
BOOL Ret = FALSE;
|
||||
|
||||
UserEnterExclusive();
|
||||
ERR("Enter NtUserAttachThreadInput %s\n",(fAttach ? "TRUE" : "FALSE" ));
|
||||
Status = PsLookupThreadByThreadId((HANDLE)idAttach, &Thread);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
EngSetLastError(ERROR_INVALID_PARAMETER);
|
||||
goto Exit;
|
||||
}
|
||||
Status = PsLookupThreadByThreadId((HANDLE)idAttachTo, &ThreadTo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
EngSetLastError(ERROR_INVALID_PARAMETER);
|
||||
ObDereferenceObject(Thread);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pti = PsGetThreadWin32Thread(Thread);
|
||||
ptiTo = PsGetThreadWin32Thread(ThreadTo);
|
||||
ObDereferenceObject(Thread);
|
||||
ObDereferenceObject(ThreadTo);
|
||||
pti = IntTID2PTI((HANDLE)idAttach);
|
||||
ptiTo = IntTID2PTI((HANDLE)idAttachTo);
|
||||
|
||||
if ( !pti || !ptiTo )
|
||||
{
|
||||
ERR("AttachThreadInput pti or ptiTo NULL.\n");
|
||||
EngSetLastError(ERROR_INVALID_PARAMETER);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Status = UserAttachThreadInput( pti, ptiTo, fAttach);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
|
|
@ -87,6 +87,7 @@ UserSystemParametersInfo(
|
|||
|
||||
VOID FASTCALL IntSetWindowState(PWND, UINT);
|
||||
VOID FASTCALL IntClearWindowState(PWND, UINT);
|
||||
PTHREADINFO FASTCALL IntTID2PTI(HANDLE);
|
||||
|
||||
/*************** MESSAGE.C ***************/
|
||||
|
||||
|
|
Loading…
Reference in a new issue