PsRemoveCreateThreadNotifyRoutine

NTSTATUS __fastcall PsRemoveCreateThreadNotifyRoutine(INT64 a1){
  _ETHREAD *CurrentThread; 
  __int64 v3; 
  _EX_RUNDOWN_REF *v4; 
  _EX_RUNDOWN_REF *v5; 
  volatile signed __int32 *v7; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v3 = 0i64;
  while( 1 )
  {
    v4 = ExReferenceCallBackBlock((INT64 *)&stru_140CEBF20 + v3);
    v5 = v4;
    if( v4 )
      break;
LABEL_6:
    v3 = (unsigned int)(v3 + 1);
    if( (unsigned int)v3 >= 0x40 )
    {
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
      return -1073741702;
    }
  }
  if( v4[1].Count != a1 || !ExCompareExchangeCallBack(&stru_140CEBF20 + 2 * v3, 0i64, (_EX_CALLBACK_ROUTINE_BLOCK *)v4) )
  {
    ExDereferenceCallBackBlock(&stru_140CEBF20 + 2 * v3, v5);
    goto LABEL_6;
  }
  v7 = &PspCreateThreadNotifyRoutineNonSystemCount;
  if( !v5[2].Count )
    v7 = &PspCreateThreadNotifyRoutineCount;
  _InterlockedAdd(v7, 0xFFFFFFFF);
  ExDereferenceCallBackBlock(&stru_140CEBF20 + 2 * v3, v5);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  ExWaitForRundownProtectionRelease(v5);
  ExFreePoolWithTag(v5, 0);
  return 0;
}

Referenced by:

No references.