IoReleaseRemoveLockAndWaitEx

VOID __stdcall IoReleaseRemoveLockAndWaitEx(PVOID Tag, UINT32 RemlockSize){
  int v2; 
  int v3; 
  ULONG_PTR v4; 
  ULONG_PTR v6; 
  *(_BYTE *)Tag = 1;
  v3 = v2;
  _InterlockedDecrement((volatile signed __int32 *)Tag + 1);
  v4 = *(_QWORD *)&RemlockSize;
  if( _InterlockedExchangeAdd((volatile signed __int32 *)Tag + 1, 0xFFFFFFFF) > 1 )
    KeWaitForSingleObject((char *)Tag + 8, Executive, 0, 0, 0i64);
  if( v3 == 120 && _InterlockedDecrement((volatile signed __int32 *)Tag + 20) < 0 )
  {
    v6 = *(_QWORD *)(*((_QWORD *)Tag + 14) + 8i64);
    if( v4 != v6
      && ((MmVerifierData & 0x800) == 0 || !(unsigned int)VfRemLockReportBadReleaseAndWaitTag((ULONG_PTR)Tag, v4, v6)) )
    {
      _InterlockedIncrement((volatile signed __int32 *)Tag + 20);
    }
    ExFreePoolWithTag(*((PVOID *)Tag + 14), 0);
    *((_QWORD *)Tag + 14) = MmBadPointer;
  }
}

Referenced by:

PopFxAcpiUnregisterDevice
PopFxUnregisterDevice
ViFilterDispatchPnp