PspClearProcessThreadCidRefs

VOID __stdcall PspClearProcessThreadCidRefs(_ETHREAD *CurrentThread, PVOID Cid, PVOID Object){
  INT64 v3; 
  _HANDLE_TABLE_ENTRY *v6; 
  volatile unsigned __int64 LowValue; 
  _HANDLE_TABLE *v8; 
  unsigned int v9; 
  int v10[8]; 
  __int128 v11; 
  PVOID v12; 
  --*((_WORD *)CurrentThread + 243);
  v6 = ExMapHandleToPointer(PspCidTable, Cid, Object, v3, v11, *((INT64 *)&v11 + 1), v12);
  v11 = 0i64;
  LowValue = v6->LowValue;
  *(_QWORD *)&v11 = v6->LowValue & 0xFFFFFFFFFFFE0001ui64;
  v6->LowValue = v11;
  v8 = PspCidTable;
  v9 = (unsigned __int16)(LowValue >> 1);
  _InterlockedExchangeAdd64(&v6->VolatileLowValue, 1ui64);
  _InterlockedOr(v10, 0);
  if( v8->HandleContentionEvent.Value )
    ExfUnblockPushLock(&v8->HandleContentionEvent, 0i64);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( v9 )
    ObDereferenceObjectEx(Object, v9);
}

Referenced by:

PspExitThread
PspRundownSingleProcess