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