ViFreeMapRegisterFile

__int64 __fastcall ViFreeMapRegisterFile(__int64 a1, struct _SLIST_ENTRY *a2){
  unsigned __int8 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  _SLIST_ENTRY *Next; 
  __int64 v8; 
  unsigned int v9; 
  char *i; 
  char *v11; 
  UINT64 v12; 
  char *v13; 
  __int64 v14; 
  void *v15; 
  if( !a2 || LODWORD(a2->Next) != -1393569779 )
    return 0i64;
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 120), (UINT64)a2);
  v5 = v4;
  v6 = *((_QWORD *)&a2->Next + 1);
  Next = a2[1].Next;
  if( *(struct _SLIST_ENTRY **)(v6 + 8) != (struct _SLIST_ENTRY *)(&a2->Next + 1)
    || Next->Next != (_SLIST_ENTRY *)(&a2->Next + 1) )
  {
    __fastfail(3u);
  }
  Next->Next = (_SLIST_ENTRY *)v6;
  *(_QWORD *)(v6 + 8) = Next;
  KxReleaseSpinLock((UINT64 *)(a1 + 120));
  __writecr8(v5);
  LODWORD(a2->Next) = 0;
  v8 = *((_QWORD *)&a2[2].Next + 1);
  if( v8 )
  {
    if( (*(_BYTE *)(v8 + 10) & 1) != 0 )
      MmUnmapLockedPages(*(PVOID *)(v8 + 24), *((PMDL *)&a2[2].Next + 1));
    IoFreeMdl((_MDL *)v8);
  }
  MmUnmapLockedPages(a2[4].Next, *((PMDL *)&a2[3].Next + 1));
  v9 = 0;
  for( i = (char *)(&a2[5].Next + 1); v9 < *((_DWORD *)&a2[1].Next + 3); i += 32 )
  {
    v11 = (char *)*((_QWORD *)i + 2);
    if( *(_QWORD *)i )
    {
      v12 = *((unsigned int *)i + 2);
      v13 = &v11[(*(_DWORD *)i & 0xFFF) + 4096];
    }
    else
    {
      v13 = 0i64;
      v12 = 0i64;
    }
    ViCheckPadding(v11, 0x3000ui64, v13, v12);
    v14 = *((_QWORD *)i + 2);
    *((_DWORD *)i + 3) = 0;
    if( !(unsigned int)ViFreeToContiguousMemory(a1, v14, v9) )
      ExFreePoolWithTag(*((PVOID *)i + 2), 0);
    ++v9;
  }
  IoFreeMdl(*((_MDL **)&a2[3].Next + 1));
  v15 = (void *)*((_QWORD *)&a2[4].Next + 1);
  if( v15 )
    VfUtilFreePoolCheckIRQL(v15);
  memset((INT64)a2, 0i64);
  VfUtilFreePoolCheckIRQL(a2);
  return 1i64;
}

Referenced by:

VfAllocateAdapterChannel
VfBuildScatterGatherList
VfCancelAdapterChannel
VfFreeAdapterChannel
VfFreeAdapterObject
VfFreeMapRegisters
VfGetScatterGatherList
VfPutScatterGatherList
ViAdapterCallback