VfCheckForResource
NTSTATUS __stdcall VfCheckForResource(VOID *p, ULONG_PTR Size){
UINT64 Param4;
_VF_AVL_TREE_NODE *v4;
__int64 *v5;
VOID *v6;
UINT64 v8;
_VF_AVL_LOCK_CONTEXT Context[4];
__int64 pa;
Param4 = *(_QWORD *)&Size;
*(_OWORD *)Context = 0i64;
if( !ViResourceInitialized )
return 0;
if( !(unsigned int)VfPoolIsInternalFree() && ViResourceAvl.NodeCount )
{
pa = 0i64;
VfAvlInitializeLockContext(Context, Shared);
v4 = VfAvlLookupTreeNode(&ViResourceAvl, Context, p, Param4);
v5 = (__int64 *)v4;
if( v4 )
{
if( !ViResourcesAlreadyLoadedDrivers && (MmVerifierData & 0x800) != 0 )
VerifierBugCheckIfAppropriate(0xC4ui64, 0xD2u, (ULONG_PTR)v4->p, (ULONG_PTR)p, Param4, v8);
pa = *v5;
}
VfAvlCleanupLockContext(Context);
if( pa )
{
_InterlockedIncrement(&ViResourceStaleNodes);
VfAvlInitializeLockContext(Context, Exclusive);
v6 = VfAvlDeleteTreeNode(&ViResourceAvl, Context, &pa, 0i64);
VfAvlCleanupLockContext(Context);
if( v6 )
{
if( ViResourceAvl.u1.NodeSize == 1 )
ExFreeToNPagedLookasideList(&ViAvlNodeLookaside, v6);
else
VfUtilFreePoolCheckIRQL(v6);
}
return 0;
}
}
return 1;
}Referenced by:
ExpCheckForResource