ViDevObjRemove

VOID __stdcall ViDevObjRemove(_DEVICE_OBJECT *DeviceObject){
  VOID *v2; 
  _VF_AVL_TREE_NODE *v3; 
  UINT64 v4; 
  _VF_AVL_LOCK_CONTEXT Context[4]; 

  *(_OWORD *)Context = 0i64;
  if( ViDevObjInitialized )
  {
    v2 = 0i64;
    VfAvlInitializeLockContext(Context, Exclusive);
    v3 = VfAvlLookupTreeNode(&ViDevObjAvl, Context, DeviceObject, 0i64);
    if( v3 )
    {
      if( ((__int64)v3[1].p & 1) != 0 && (MmVerifierData & 0x800) != 0 )
        VerifierBugCheckIfAppropriate(0xC4ui64, 0xDBu, (ULONG_PTR)DeviceObject, 0, 0, v4);
      v2 = VfAvlDeleteTreeNode(&ViDevObjAvl, Context, DeviceObject, 0i64);
    }
    VfAvlCleanupLockContext(Context);
    if( v2 )
    {
      if( ViDevObjAvl.u1.NodeSize == 1 )
        ExFreeToNPagedLookasideList(&ViAvlNodeLookaside, v2);
      else
        VfUtilFreePoolCheckIRQL(v2);
    }
  }
}

Referenced by:

VfIoDeleteDevice