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