KeDeleteThread

VOID __stdcall KeDeleteThread(_ETHREAD *Thread){
  __int64 *v2; 
  _BYTE *v3; 
  unsigned __int8 v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  __int64 **v7; 
  unsigned __int8 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  _QWORD *v11; 

  KiWaitForContextSwap(&Thread->Tcb);
  KiDecrementProcessStackCount(&Thread->Tcb.ApcState.Process->Pcb);
  v2 = (__int64 *)&Thread->Tcb.gap36C[4];
  if( *(_QWORD *)&Thread->Tcb.gap36C[4] != 1i64 )
  {
    v4 = KeAcquireSpinLockRaiseToDpc(&qword_140C31C98);
    v5 = *v2;
    v6 = v4;
    if( *v2 != 1 && *(_QWORD *)&Thread->Tcb.gap36C[12] )
    {
      v7 = *(__int64 ***)&Thread->Tcb.gap36C[12];
      if( *(__int64 **)(v5 + 8) != v2 || *v7 != v2 )
        goto LABEL_10;
      *v7 = (__int64 *)v5;
      *(_QWORD *)(v5 + 8) = v7;
    }
    KxReleaseSpinLock(&qword_140C31C98);
    __writecr8(v6);
  }
  v3 = Thread->Tcb.gap3F0;
  if( *(_QWORD *)Thread->Tcb.gap3F0 != 1i64 )
  {
    v8 = KeAcquireSpinLockRaiseToDpc(&KiUpdateVpThreadPriorityLock);
    v9 = *(_QWORD *)v3;
    v10 = v8;
    if( *(_QWORD *)v3 == 1i64 || !*(_QWORD *)&Thread->Tcb.gap3F0[8] )
      goto LABEL_16;
    v11 = *(_QWORD **)&Thread->Tcb.gap3F0[8];
    if( *(_BYTE **)(v9 + 8) == v3 && (_BYTE *)*v11 == v3 )
    {
      *v11 = v9;
      *(_QWORD *)(v9 + 8) = v11;
LABEL_16:
      KxReleaseSpinLock(&KiUpdateVpThreadPriorityLock);
      __writecr8(v10);
      return;
    }
LABEL_10:
    __fastfail(3u);
  }
}

Referenced by:

No references.