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