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