ViSpecialFreeCommonBuffer
VOID **__fastcall ViSpecialFreeCommonBuffer(
void (__fastcall *a1)(_QWORD, _QWORD, _QWORD, _QWORD, char),
_QWORD *a2,
VOID *a3,
char a4){
VOID **result;
VOID **v9;
unsigned __int64 v10;
VOID ***v11;
VOID ***v12;
char v13;
result = (VOID **)VF_FIND_BUFFER(a2 + 10, (__int64)a3);
v9 = result;
if( result )
{
ViCheckPadding(result[2], *((unsigned int *)result + 1), result[3], *((unsigned int *)result + 2));
v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(a2 + 12);
v11 = (VOID ***)v9[6];
v12 = (VOID ***)v9[7];
if( v11[1] != v9 + 6 || *v12 != v9 + 6 )
__fastfail(3u);
*v12 = (VOID **)v11;
v11[1] = (VOID **)v12;
KxReleaseSpinLock(a2 + 12);
__writecr8(v10);
memset(a3, 0i64, *((_DWORD *)v9 + 2));
v13 = a4;
a1(a2[2], *((unsigned int *)v9 + 1), v9[4], v9[2], v13);
DECREMENT_COMMON_BUFFERS((__int64)a2);
ExFreePoolWithTag(v9, 0);
return(VOID **)1;
}
return result;
}Referenced by:
VfFreeCommonBuffer