PspUmsUnInitThread
INT64 __stdcall PspUmsUnInitThread(_ETHREAD *Thread, INT64 *Object){
_ETHREAD *CurrentThread;
__int64 v4;
INT64 v5;
bool v6;
int v7;
signed int updated;
struct _DMA_ADAPTER *v9;
int a2;
a2 = 0;
CurrentThread = Thread;
if( !Thread )
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*((_BYTE *)CurrentThread + 3) & 0x40) != 0 )
{
v4 = *((_QWORD *)Thread + 62);
v5 = *(_QWORD *)v4;
if( (*(_DWORD *)(v4 + 80) & 4) != 0 )
{
v6 = 1;
v7 = PspRundownUmsThreadForApcDelivery((INT64)Thread, &a2, v5, 1);
if( (*((_DWORD *)Thread + 324) & 0x10000) != 0 )
v7 = 0;
if( v7 < 0 || (a2 & 8) == 0 && (a2 & 1) == 0 )
v6 = (*((_DWORD *)Thread + 324) & 0x10000) != 0;
}
else
{
KeSetUmsThreadKernelLock(v5, 0i64);
v6 = 1;
}
updated = KeUpdateUmsThreadState(v5, 2i64, v6);
}
else
{
--*((_WORD *)Thread + 243);
updated = PspDisassociateUmsThreadFromPrimary((PETHREAD)Thread, 0i64);
KiLeaveGuardedRegionUnsafe((__int64)Thread);
}
v9 = *(struct _DMA_ADAPTER **)(*((_QWORD *)Thread + 62) + 16i64);
KeUnInitializeUmsThread((INT64)Thread);
if( v9 )
HalPutDmaAdapter(v9);
if( updated < 0 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1124i64) & 0x40000008) == 0 )
PsTerminateProcess(*((_QWORD *)KeGetCurrentThread() + 23), updated);
return(unsigned int)updated;
}Referenced by:
PspExitThread