IopDereferencePassiveInterruptBlock
VOID __stdcall IopDereferencePassiveInterruptBlock(PASSIVE_INTERRUPT_BLOCK *PassiveInterrupt){
char v2;
__int64 v3;
PASSIVE_INTERRUPT_BLOCK **v4;
UINT8 OldIrql;
UINT8 v6;
v6 = 0;
OldIrql = 0;
v2 = 0;
IopAcquireGlobalPassiveInterruptListLock(&v6);
IopAcquirePassiveInterruptBlockLock(PassiveInterrupt, &OldIrql);
if( _InterlockedExchangeAdd(PassiveInterrupt + 48, 0xFFFFFFFF) == 1 )
{
v3 = *(_QWORD *)PassiveInterrupt;
v4 = (PASSIVE_INTERRUPT_BLOCK **)*((_QWORD *)PassiveInterrupt + 1);
if( *(PASSIVE_INTERRUPT_BLOCK **)(*(_QWORD *)PassiveInterrupt + 8i64) != PassiveInterrupt
|| *v4 != PassiveInterrupt )
{
__fastfail(3u);
}
*v4 = (PASSIVE_INTERRUPT_BLOCK *)v3;
v2 = 1;
*(_QWORD *)(v3 + 8) = v4;
}
KxReleaseSpinLock((UINT64 *)PassiveInterrupt + 7);
__writecr8(OldIrql);
KxReleaseSpinLock(&qword_140C45258);
__writecr8(v6);
if( v2 )
ExFreePoolWithTag(PassiveInterrupt, 0x6269704Bu);
}Referenced by:
IopDestroyPassiveInterruptBlock
IopPassiveInterruptWorker