- Thread ID to Thread Information.

svn path=/trunk/; revision=59000
This commit is contained in:
James Tabor 2013-05-11 19:33:40 +00:00
parent 6ca4c20d1b
commit b256611e05
4 changed files with 58 additions and 25 deletions

View file

@ -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;
}

View file

@ -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)

View file

@ -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))

View file

@ -87,6 +87,7 @@ UserSystemParametersInfo(
VOID FASTCALL IntSetWindowState(PWND, UINT);
VOID FASTCALL IntClearWindowState(PWND, UINT);
PTHREADINFO FASTCALL IntTID2PTI(HANDLE);
/*************** MESSAGE.C ***************/