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