VfTargetDriversRemove
VOID __stdcall VfTargetDriversRemove(_KLDR_DATA_TABLE_ENTRY *DataTableEntry){
void *DllBase;
VOID *v3;
_VF_AVL_TREE_NODE *v4;
_VF_AVL_TREE_NODE *v5;
_VF_TARGET_VERIFIED_DRIVER_DATA *RangeSize;
_VF_AVL_TREE_NODE v7;
__m128i v8;
_VF_AVL_TREE_NODE v9;
_VF_AVL_LOCK_CONTEXT LockContext[4];
_VF_TARGET_DRIVER TargetNode;
memset(&TargetNode, 0i64, sizeof(TargetNode));
if( !VfSafeMode && ViTargetInitialized )
{
DllBase = DataTableEntry->DllBase;
*(_OWORD *)LockContext = 0i64;
v3 = 0i64;
BYTE1(LockContext[2]) = 4;
v4 = VfAvlLookupTreeNode(&ViTargetDriversAvl, LockContext, DllBase, 1ui64);
v5 = v4;
if( v4 )
{
RangeSize = (_VF_TARGET_VERIFIED_DRIVER_DATA *)v4[3].RangeSize;
if( RangeSize )
{
ViTargetRemovingCheckEtwWmi((_VF_TARGET_VERIFIED_DRIVER_DATA *)v4[3].RangeSize, DllBase);
VfPoolCheckForLeaks(RangeSize, DataTableEntry);
ViTargetRemovingCheckContiguousMemory(RangeSize, DataTableEntry);
}
v7 = *v5;
*(_VF_AVL_TREE_NODE *)&TargetNode.TreeNode.SessionId = v5[1];
v8 = (__m128i)v5[3];
TargetNode.TreeNode.Base = v7;
v9 = v5[2];
*(__m128i *)(&TargetNode.u1.Flags + 6) = v8;
*(_VF_AVL_TREE_NODE *)(&TargetNode.u1.Flags + 2) = v9;
if( _mm_srli_si128(v8, 8).m128i_u64[0] )
--dword_140C1CEE8;
v3 = VfAvlDeleteTreeNode(&ViTargetDriversAvl, LockContext, DllBase, 1ui64);
}
VfAvlCleanupLockContext(LockContext);
if( v3 )
{
VfThunkRemoveTargetNotify(&TargetNode);
if( TargetNode.VerifiedData )
ExFreePoolWithTag(TargetNode.VerifiedData, 0x44566656u);
if( ViTargetDriversAvl.u1.NodeSize == 1 )
ExFreeToNPagedLookasideList(&ViAvlNodeLookaside, v3);
else
VfUtilFreePoolCheckIRQL(v3);
}
}
}Referenced by:
VfDriverUnloadImage
VfSuspectDriversLoadCallback