ViFreeMapRegisterFile

UINT64 __stdcall ViFreeMapRegisterFile(_ADAPTER_INFORMATION *AdapterInformation, _MAP_REGISTER_FILE *MapRegisterFile){
  unsigned __int64 v4; 
  __int64 v5; 
  _MAP_REGISTER_FILE **v6; 
  __int64 v7; 
  unsigned int v8; 
  _MAP_REGISTER_FILE *i; 
  char *v10; 
  UINT64 v11; 
  char *v12; 
  VOID *v13; 
  VOID *v14; 

  if( !MapRegisterFile || *MapRegisterFile != -1393569779 )
    return 0i64;
  v4 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)AdapterInformation + 15);
  v5 = *((_QWORD *)MapRegisterFile + 1);
  v6 = (_MAP_REGISTER_FILE **)*((_QWORD *)MapRegisterFile + 2);
  if( *(_MAP_REGISTER_FILE **)(v5 + 8) != MapRegisterFile + 2 || *v6 != MapRegisterFile + 2 )
    __fastfail(3u);
  *v6 = (_MAP_REGISTER_FILE *)v5;
  *(_QWORD *)(v5 + 8) = v6;
  KxReleaseSpinLock((UINT64 *)AdapterInformation + 15);
  __writecr8(v4);
  *MapRegisterFile = 0;
  v7 = *((_QWORD *)MapRegisterFile + 5);
  if( v7 )
  {
    if( (*(_BYTE *)(v7 + 10) & 1) != 0 )
      MmUnmapLockedPages(*(VOID **)(v7 + 24), *((_MDL **)MapRegisterFile + 5));
    IoFreeMdl((PMDL)v7);
  }
  MmUnmapLockedPages(*((VOID **)MapRegisterFile + 8), *((_MDL **)MapRegisterFile + 7));
  v8 = 0;
  for( i = MapRegisterFile + 22; v8 < MapRegisterFile[7]; i += 8 )
  {
    v10 = (char *)*((_QWORD *)i + 2);
    if( *(_QWORD *)i )
    {
      v11 = (unsigned int)i[2];
      v12 = &v10[(*i & 0xFFF) + 4096];
    }
    else
    {
      v12 = 0i64;
      v11 = 0i64;
    }
    ViCheckPadding(v10, 0x3000ui64, v12, v11);
    v13 = (VOID *)*((_QWORD *)i + 2);
    i[3] = 0;
    if( !(unsigned int)ViFreeToContiguousMemory(AdapterInformation, v13, v8) )
      ExFreePoolWithTag(*((PVOID *)i + 2), 0);
    ++v8;
  }
  IoFreeMdl(*((PMDL *)MapRegisterFile + 7));
  v14 = (VOID *)*((_QWORD *)MapRegisterFile + 9);
  if( v14 )
    VfUtilFreePoolCheckIRQL(v14);
  memset(MapRegisterFile, 0i64, 0x78u);
  VfUtilFreePoolCheckIRQL(MapRegisterFile);
  return 1i64;
}

Referenced by:

VfAllocateAdapterChannel
VfBuildScatterGatherList
VfCancelAdapterChannel
VfFreeAdapterChannel
VfFreeAdapterObject
VfFreeMapRegisters
VfGetScatterGatherList
VfPutScatterGatherList
ViAdapterCallback