MiNoPagesLastChance

VOID __stdcall MiNoPagesLastChance(_MI_PARTITION *Partition, UINT64 Limit){
  int LastModifiedWriteError; 
  void *TotalPagesForPagingFile; 
  int v4; 
  int LastMappedWriteError; 
  UINT64 v6; 
  int v7; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  volatile unsigned int NumberOfPagingFiles; 
  int v12; 
  _MMPAGING_FILE **PagingFile; 
  __int64 v14; 
  _MMPAGING_FILE *v15; 
  int v16; 
  UINT32 v17; 
  unsigned __int64 Total; 
  unsigned __int64 v19; 
  _EPROCESS *SystemProcess; 
  UINT64 UnbiasedInterruptTime; 
  __int64 v22; 
  unsigned __int64 *p_Lock; 
  __int64 v24; 
  unsigned __int64 *p_Flink; 
  __int64 v26; 
  unsigned __int8 CurrentIrql; 
  __int64 v28; 
  _MMPFN *v29; 
  __int64 bf_0; 
  __int64 v31; 
  _MI_LDW_WORK_CONTEXT *p_LastChanceLdwContext; 
  char v33; 
  UINT8 v34; 
  UINT64 *v35; 
  unsigned int BugCheckParameter3; 
  int BugCheckParameter3_4; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  __int64 v39; 
  _FILE_OBJECT *v40; 
  PVOID BugCheckParameter2; 
  __int64 v42; 
  int v44; 

  LastModifiedWriteError = Partition->Modwriter.LastModifiedWriteError;
  TotalPagesForPagingFile = (void *)Partition->Vp.TotalPagesForPagingFile;
  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  v4 = LastModifiedWriteError;
  LastMappedWriteError = Partition->Modwriter.LastMappedWriteError;
  v6 = (unsigned int)Limit;
  v7 = (unsigned int)LastMappedWriteError >> 31;
  BugCheckParameter2 = TotalPagesForPagingFile;
  v9 = 0i64;
  if( LastMappedWriteError >= 0 )
    LastMappedWriteError = 0;
  v10 = 0i64;
  LockQueue.LockQueue = 0i64;
  if( LastModifiedWriteError >= 0 )
    v4 = LastMappedWriteError;
  NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
  v12 = v7 | 2;
  BugCheckParameter3_4 = v4;
  if( LastModifiedWriteError >= 0 )
    v12 = v7;
  if( !NumberOfPagingFiles )
    goto LABEL_13;
  PagingFile = Partition->Vp.PagingFile;
  v14 = NumberOfPagingFiles;
  do
  {
    v15 = *PagingFile;
    if( ((*PagingFile)->_bf_cc & 0x50) == 0 )
    {
      v9 += v15->MaximumSize - v15->Size;
      v10 += v15->FreeSpace;
    }
    ++PagingFile;
    --v14;
  }
  while( v14 );
  if( v10 < 0x400 )
LABEL_13:
    v12 |= 4u;
  v16 = v12 | 8;
  if( v9 >= 0x400 )
    v16 = v12;
  BugCheckParameter3 = v16;
  if( *(&stru_140C4DB30 + 565) )
  {
    v17 = 243;
  }
  else
  {
    Total = Partition->Vp.ModifiedNoWritePageListHead.Total;
    v19 = Partition->Vp.ModifiedPageListHead.Total >> 2;
    if( Total < v19 )
    {
      v17 = Partition->Vp.TotalPagesForPagingFile < v19 ? 235 : 77;
    }
    else
    {
      v17 = 253;
      BugCheckParameter2 = (PVOID)Partition->Vp.ModifiedNoWritePageListHead.Total;
      TotalPagesForPagingFile = (void *)Total;
    }
  }
  SystemProcess = Partition->Core.PartitionObject->SystemProcess;
  if( !SystemProcess->Job
    || (PsGetJobLastThrottledIoTime((INT64)SystemProcess->Job),
        UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u),
        UnbiasedInterruptTime - v22 >= -MiNoPagesTimeout.QuadPart) )
  {
    if( KdPitchDebugger || (_BYTE)KdDebuggerNotPresent )
    {
      v44 = 0;
    }
    else
    {
      DbgPrintEx(
        0x66u,
        0,
        "Without a debugger attached, the following bugcheck would have occurred.\n%4lx %p %p %x %x\n",
        v17,
        (const void *)Partition->Vp.ModifiedPageListHead.Total,
        TotalPagesForPagingFile,
        v16,
        v4);
      if( (MiFlags & 8) != 0 )
        __debugbreak();
      v44 = 1;
    }
    if( !MiSufficientAvailablePages((INT64)Partition, v6)
      && !_InterlockedCompareExchange(&Partition->PageLists.LastChanceLdwContext.Active, 1, 0) )
    {
      p_Lock = &Partition->PageLists.MappedPageListHead[0].Lock;
      v24 = 0i64;
      p_Flink = &Partition->PageLists.MappedPageListHead[0].Flink;
      v40 = 0i64;
      v26 = 16i64;
      v35 = &Partition->PageLists.MappedPageListHead[0].Lock;
      v39 = 16i64;
      while( 1 )
      {
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        LockQueue.LockQueue.Next = 0i64;
        LockQueue.LockQueue.Lock = p_Lock;
        KxAcquireQueuedSpinLock(&LockQueue.LockQueue, p_Lock);
        v28 = *p_Flink;
        if( *p_Flink == 0xFFFFFFFFFi64 )
          goto LABEL_45;
        do
        {
          v42 = 48 * v28;
          v29 = &MmGetPfnDb()[v28];
          v28 = v29->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64;
          bf_0 = v29->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
          if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
            bf_0 &= ~*(&stru_140C4DB30 + 42);
          v31 = *(_QWORD *)(bf_0 >> 16);
          if( (*(_DWORD *)(v31 + 56) & 0x28) != 0
            || v24 && v24 != v31
            || _interlockedbittestandset64((volatile signed __int32 *)&v29->u2, 0x3Fui64) )
          {
            goto LABEL_42;
          }
          ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v31 + 72));
          if( (*(_DWORD *)(v31 + 56) & 8) != 0 )
          {
            ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 72));
            _InterlockedAnd64(&v29->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_42:
            p_Lock = v35;
            continue;
          }
          if( !v24 )
          {
            v40 = (_FILE_OBJECT *)ObFastReferenceObjectLocked((_EX_FAST_REF *)(v31 + 64));
            v24 = v31;
          }
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 72));
          MiUnlinkPageFromList(v29, 1ui64);
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
          v33 = *((_BYTE *)&v29->u3 + 2);
          v29->u2._bf_0 &= 0xC000000000000000ui64;
          *((_BYTE *)&v29->u3 + 2) = v33 & 0xEF;
          MiPfnReferenceCountIsZero(v29, v42 / 48, v34);
          _InterlockedAnd64(&v29->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(CurrentIrql);
          ++dword_140C4C954;
          CurrentIrql = KeGetCurrentIrql();
          __writecr8(2ui64);
          p_Lock = v35;
          LockQueue.LockQueue.Next = 0i64;
          LockQueue.LockQueue.Lock = v35;
          KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v35);
          v28 = *p_Flink;
        }
        while( v28 != 0xFFFFFFFFFi64 );
        v26 = v39;
LABEL_45:
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
        __writecr8(CurrentIrql);
        p_Lock += 5;
        p_Flink += 5;
        --v26;
        v35 = p_Lock;
        v39 = v26;
        if( !v26 )
        {
          p_LastChanceLdwContext = &Partition->PageLists.LastChanceLdwContext;
          if( v24 )
          {
            Partition->PageLists.LastChanceLdwContext.FileObject = v40;
            Partition->PageLists.LastChanceLdwContext.ErrorStatus = -1073741566;
            p_LastChanceLdwContext->WorkItem.List.Flink = 0i64;
            Partition->PageLists.LastChanceLdwContext.WorkItem.WorkerRoutine = (void(__fastcall *)(void *))MiLdwPopupWorker;
            Partition->PageLists.LastChanceLdwContext.WorkItem.Parameter = &Partition->PageLists.LastChanceLdwContext;
            ExQueueWorkItem(&p_LastChanceLdwContext->WorkItem, DelayedWorkQueue);
            ++dword_140C4C950;
          }
          else
          {
            _InterlockedAnd(&Partition->PageLists.LastChanceLdwContext.Active, 0);
            if( !v44 )
              KeBugCheckEx(
                v17,
                (PVOID)Partition->Vp.ModifiedPageListHead.Total,
                BugCheckParameter2,
                (PVOID)BugCheckParameter3,
                (PVOID)BugCheckParameter3_4);
          }
          return;
        }
      }
    }
  }
}

Referenced by:

MiWaitForFreePage