[WIN32K] Keep a reference on an ETHREAD while THREADINFO exists

This commit is contained in:
Timo Kreuzer 2018-03-13 23:00:17 +01:00
parent e5904abf94
commit ba893e1172

View file

@ -89,13 +89,6 @@ AllocW32Process(IN PEPROCESS Process,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
#define FreeW32Process(/*Process*/ W32Process) \
do { \
/*PPROCESSINFO W32Process = PsGetProcessWin32Process(Process);*/ \
/*ASSERT(W32Process);*/ \
IntDereferenceProcessInfo(W32Process); \
} while(0)
/* /*
* Called from IntDereferenceProcessInfo * Called from IntDereferenceProcessInfo
*/ */
@ -332,7 +325,7 @@ ExitProcessCallback(PEPROCESS Process)
ppiCurrent->peProcess = NULL; ppiCurrent->peProcess = NULL;
/* Finally, dereference */ /* Finally, dereference */
FreeW32Process(/*Process*/ ppiCurrent); // IntDereferenceProcessInfo(ppiCurrent); IntDereferenceProcessInfo(ppiCurrent);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -397,19 +390,13 @@ AllocW32Thread(IN PETHREAD Thread,
RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent)); RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent));
PsSetThreadWin32Thread(Thread, ptiCurrent, NULL); PsSetThreadWin32Thread(Thread, ptiCurrent, NULL);
ObReferenceObject(Thread);
IntReferenceThreadInfo(ptiCurrent); IntReferenceThreadInfo(ptiCurrent);
*W32Thread = ptiCurrent; *W32Thread = ptiCurrent;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
#define FreeW32Thread(/*Thread*/ W32Thread) \
do { \
/*PTHREADINFO W32Thread = PsGetThreadWin32Thread(Thread);*/ \
/*ASSERT(W32Thread);*/ \
IntDereferenceThreadInfo(W32Thread); \
} while(0)
/* /*
* Called from IntDereferenceThreadInfo * Called from IntDereferenceThreadInfo
*/ */
@ -428,6 +415,8 @@ UserDeleteW32Thread(PTHREADINFO pti)
MsqCleanupThreadMsgs(pti); MsqCleanupThreadMsgs(pti);
ObDereferenceObject(pti->pEThread);
ExFreePoolWithTag(pti, USERTAG_THREADINFO); ExFreePoolWithTag(pti, USERTAG_THREADINFO);
IntDereferenceProcessInfo(ppi); IntDereferenceProcessInfo(ppi);
@ -845,10 +834,9 @@ ExitThreadCallback(PETHREAD Thread)
/* The thread is dying */ /* The thread is dying */
PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent); PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
ptiCurrent->pEThread = NULL;
/* Free the THREADINFO */ /* Dereference the THREADINFO */
FreeW32Thread(/*Thread*/ ptiCurrent); // IntDereferenceThreadInfo(ptiCurrent); IntDereferenceThreadInfo(ptiCurrent);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }