ViDevObjRemove

VOID __stdcall ViDevObjRemove(_DEVICE_OBJECT *DeviceObject){
  void *v2; 
  CHAR *v3; 
  UINT64 v4; 
  __int128 v5; 
  v5 = 0i64;
  if( ViDevObjInitialized )
  {
    v2 = 0i64;
    VfAvlInitializeLockContext((INT64)&v5, 0i64);
    v3 = VfAvlLookupTreeNode(&ViDevObjAvl, (INT64)&v5, (UINT64)DeviceObject, 0i64);
    if( v3 )
    {
      if( (*((_DWORD *)v3 + 4) & 1) != 0 && (MmVerifierData & 0x800) != 0 )
        VerifierBugCheckIfAppropriate(0xC4ui64, 0xDBui64, (UINT64)DeviceObject, 0i64, 0i64, v4);
      v2 = (void *)VfAvlDeleteTreeNode((INT64)&ViDevObjAvl, (INT64)&v5, (UINT64)DeviceObject, 0i64);
    }
    VfAvlCleanupLockContext((INT64)&v5);
    if( v2 )
    {
      if( dword_140D4A548 == 1 )
        ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViAvlNodeLookaside, v2);
      else
        VfUtilFreePoolCheckIRQL(v2);
    }
  }
}

Referenced by:

VfIoDeleteDevice