VerifierExDeleteResourceLite

NTSTATUS __stdcall VerifierExDeleteResourceLite(_ERESOURCE *Resource){
  unsigned __int64 v1; 
  VOID *v3; 
  NTSTATUS result; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  _VF_AVL_LOCK_CONTEXT Context[4]; 

  v1 = 0i64;
  *(_OWORD *)Context = 0i64;
  if( ViResourceInitialized && ViResourceAvl.NodeCount )
  {
    v3 = 0i64;
    VfAvlInitializeLockContext(Context, Exclusive);
    if( VfAvlLookupTreeNode(&ViResourceAvl, Context, Resource, 0i64) )
    {
      v3 = VfAvlDeleteTreeNode(&ViResourceAvl, Context, Resource, 0i64);
    }
    else if( !ViResourceNotTracked && !ViResourcesAlreadyLoadedDrivers && (MmVerifierData & 0x800) != 0 )
    {
      VerifierBugCheckIfAppropriate(0xC4ui64, 0xD1u, (ULONG_PTR)Resource, 0, 0, v8);
    }
    VfAvlCleanupLockContext(Context);
    if( v3 )
    {
      if( ViResourceAvl.u1.NodeSize == 1 )
        ExFreeToNPagedLookasideList(&ViAvlNodeLookaside, v3);
      else
        VfUtilFreePoolCheckIRQL(v3);
    }
  }
  result = ((__int64(__fastcall *)(_ERESOURCE *))pXdvExDeleteResourceLite)(Resource);
  if( (MmVerifierData & 0x800) != 0 && result >= 0 )
  {
    v5 = &Resource[1] >= Resource ? 0xD : 0;
    if( (&Resource[1] >= Resource ? 0xD : 0) != 0 )
    {
      if( Resource <= &Resource[1]
        && (Resource > (_ERESOURCE *)&MmBadPointer || &Resource[-1].SpinLock + v5 < (unsigned __int64 *)&MmBadPointer) )
      {
        v6 = &Resource[1] >= Resource ? 0xC : 0;
        do
          v1 += 2i64;
        while( v1 < v6 );
        v7 = 8 * v6;
        memset64(Resource, (unsigned __int64)MmBadPointer, v7 >> 3);
        Resource = (_ERESOURCE *)((char *)Resource + v7);
      }
      while( v1 < v5 )
      {
        ++v1;
        Resource->SystemResourcesList.Flink = (_LIST_ENTRY *)MmBadPointer;
        Resource = (_ERESOURCE *)((char *)Resource + 8);
      }
    }
  }
  return result;
}

Referenced by:

No references.