IoReleaseRemoveLockAndWaitEx

VOID *__stdcall IoReleaseRemoveLockAndWaitEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, UINT32 RemlockSize){
  signed __int32 v6; 
  bool v7; 
  VOID *result; 
  void *v9; 

  *(_BYTE *)RemoveLock = 1;
  _InterlockedDecrement((volatile signed __int32 *)RemoveLock + 1);
  v6 = _InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 1, 0xFFFFFFFF);
  v7 = v6 <= 1;
  result = (VOID *)(unsigned int)(v6 - 1);
  if( !v7 )
    LODWORD(result) = KeWaitForSingleObject((UINT64)RemoveLock + 8, 0, 0, 0, 0i64);
  if( RemlockSize == 120 )
  {
    result = (VOID *)(unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 20, 0xFFFFFFFF);
    if( (int)result - 1 < 0 )
    {
      v9 = *(void **)(*((_QWORD *)RemoveLock + 14) + 8i64);
      if( Tag != v9
        && ((MmVerifierData & 0x800) == 0
         || !(unsigned int)VfRemLockReportBadReleaseAndWaitTag((ULONG_PTR)RemoveLock, Tag, v9)) )
      {
        _InterlockedIncrement((volatile signed __int32 *)RemoveLock + 20);
      }
      ExFreePoolWithTag(*((PVOID *)RemoveLock + 14), 0);
      result = MmBadPointer;
      *((_QWORD *)RemoveLock + 14) = MmBadPointer;
    }
  }
  return result;
}

Referenced by:

PopFxAcpiUnregisterDevice
PopFxUnregisterDevice
ViFilterDispatchPnp