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