DbgpRemoveDebugPrintCallback

__int64 __fastcall DbgpRemoveDebugPrintCallback(void *a1){
  unsigned __int8 CurrentIrql; 
  unsigned int v3; 
  void **i; 
  EX_RUNDOWN_REF *v5; 
  unsigned __int64 Count; 
  EX_RUNDOWN_REF **v8; 
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xCui64);
  v3 = 0;
  ExAcquireSpinLockSharedAtDpcLevel(&RtlpDebugPrintCallbackLock);
  for( i = (void **)RtlpDebugPrintCallbackList; ; i = (void **)*i )
  {
    if( i == &RtlpDebugPrintCallbackList )
    {
      ExReleaseSpinLockSharedFromDpcLevel(&RtlpDebugPrintCallbackLock);
      __writecr8(CurrentIrql);
      return(unsigned int)-1073741275;
    }
    v5 = (EX_RUNDOWN_REF *)(i - 3);
    if( *(i - 1) == a1 )
    {
      _m_prefetchw(v5);
      if( (_InterlockedOr((volatile signed __int32 *)v5, 1u) & 1) == 0 )
        break;
    }
  }
  ExReleaseSpinLockSharedFromDpcLevel(&RtlpDebugPrintCallbackLock);
  ExWaitForRundownProtectionRelease(v5 + 1);
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&RtlpDebugPrintCallbackLock);
  Count = v5[3].Count;
  v8 = (EX_RUNDOWN_REF **)v5[4].Count;
  if( *(EX_RUNDOWN_REF **)(Count + 8) != &v5[3] || *v8 != &v5[3] )
    __fastfail(3u);
  *v8 = (EX_RUNDOWN_REF *)Count;
  *(_QWORD *)(Count + 8) = v8;
  if( v8 == (EX_RUNDOWN_REF **)Count )
    RtlpDebugPrintCallbacksActive = 0;
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&RtlpDebugPrintCallbackLock);
  __writecr8(CurrentIrql);
  ExFreePoolWithTag(v5, 0);
  return v3;
}

Referenced by:

DbgSetDebugPrintCallback