DbgpRemoveDebugPrintCallback
__int64 __fastcall DbgpRemoveDebugPrintCallback(_LIST_ENTRY *a1){
unsigned __int8 CurrentIrql;
unsigned int v3;
_LIST_ENTRY *i;
_EX_RUNDOWN_REF *p_Blink;
unsigned __int64 Count;
_EX_RUNDOWN_REF **v8;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xCui64);
v3 = 0;
ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)&unk_140CEC520);
for( i = (_LIST_ENTRY *)*(&stru_140C00F40 + 892); ; i = i->Flink )
{
if( i == (_LIST_ENTRY *)((char *)&stru_140C00F40 + 7136) )
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&unk_140CEC520);
__writecr8(CurrentIrql);
return(unsigned int)-1073741275;
}
p_Blink = (_EX_RUNDOWN_REF *)&i[-2].Blink;
if( i[-1].Blink == a1 )
{
_m_prefetchw(p_Blink);
if( (_InterlockedOr((volatile signed __int32 *)p_Blink, 1u) & 1) == 0 )
break;
}
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&unk_140CEC520);
ExWaitForRundownProtectionRelease(p_Blink + 1);
ExAcquireSpinLockExclusiveAtDpcLevel(&unk_140CEC520);
Count = p_Blink[3].Count;
v8 = (_EX_RUNDOWN_REF **)p_Blink[4].Count;
if( *(_EX_RUNDOWN_REF **)(Count + 8) != &p_Blink[3] || *v8 != &p_Blink[3] )
__fastfail(3u);
*v8 = (_EX_RUNDOWN_REF *)Count;
*(_QWORD *)(Count + 8) = v8;
if( v8 == (_EX_RUNDOWN_REF **)Count )
byte_140C50450 = 0;
ExReleaseSpinLockExclusiveFromDpcLevel(&unk_140CEC520);
__writecr8(CurrentIrql);
ExFreePoolWithTag(p_Blink, 0);
return v3;
}Referenced by:
DbgSetDebugPrintCallback