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