IoReleaseRemoveLockEx

VOID *__stdcall IoReleaseRemoveLockEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, UINT32 RemlockSize){
  VOID *result; 
  char v6; 
  PVOID **v7; 
  unsigned __int64 v8; 
  PVOID *v9; 
  PVOID *v10; 
  PVOID *v11; 
  PVOID **v12; 

  if( RemlockSize == 120 )
  {
    v6 = 0;
    v7 = (PVOID **)((char *)RemoveLock + 112);
    v8 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)RemoveLock + 9);
    v9 = (PVOID *)*((_QWORD *)RemoveLock + 14);
    v10 = v9;
    while( v10 )
    {
      if( v6 || v10[1] != Tag )
      {
        v9 = v10;
        v10 = (PVOID *)*v10;
      }
      else
      {
        v11 = (PVOID *)*v10;
        v6 = 1;
        if( v10 == *v7 )
        {
          *v7 = v11;
          v12 = (PVOID **)((char *)RemoveLock + 112);
        }
        else
        {
          *v9 = v11;
          v12 = (PVOID **)v9;
        }
        ExFreePoolWithTag(v10, 0);
        v10 = *v12;
      }
    }
    KxReleaseSpinLock((UINT64 *)RemoveLock + 9);
    __writecr8(v8);
    if( !v6
      && _InterlockedDecrement((volatile signed __int32 *)RemoveLock + 20) < 0
      && ((MmVerifierData & 0x800) == 0 || !(unsigned int)VfRemLockReportBadReleaseTag((ULONG_PTR)RemoveLock, Tag)) )
    {
      _InterlockedIncrement((volatile signed __int32 *)RemoveLock + 20);
    }
  }
  result = (VOID *)(unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)RemoveLock + 1, 0xFFFFFFFF);
  if( (_DWORD)result == 1 )
    LODWORD(result) = KeSetEvent((PRKEVENT)((char *)RemoveLock + 8), 0, 0);
  return result;
}

Referenced by:

ViFilterDeviceUsageNotificationCompletion
ViFilterGenericCompletionRoutine
ViFilterStartCompletionRoutine