MiProcessDereferenceList

VOID __stdcall MiProcessDereferenceList(_MI_PARTITION *Partition){
  int v1; 
  _MI_PARTITION_SEGMENTS *p_Segments; 
  unsigned __int8 v4; 
  _BYTE *v5; 
  unsigned __int8 v6; 
  __int64 *v7; 
  __int64 v8; 
  __int64 **v9; 
  __int64 *v10; 
  int v11; 
  _QWORD **v12; 
  _QWORD *v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int128 v17; 
  char v18; 
  __int64 v19; 
  __int64 v20; 
  __int128 v21; 
  int v22; 
  int v23; 
  bool v24; 
  unsigned __int64 ActualExpansion; 
  _MMPAGE_FILE_EXPANSION PageExpand; 
  int v27; 
  int v28; 

  v28 = v1;
  memset(&PageExpand, 0i64, sizeof(PageExpand));
  v27 = 0;
  p_Segments = &Partition->Segments;
  v4 = ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
  v5 = &Partition->Segments.gapB0[32];
LABEL_2:
  v6 = v4;
  do
  {
    v7 = *(__int64 **)v5;
    if( *(_BYTE **)v5 != v5 )
    {
      v8 = *v7;
      if( (_BYTE *)v7[1] != v5 || *(__int64 **)(v8 + 8) != v7 )
LABEL_41:
        __fastfail(3u);
      *(_QWORD *)v5 = v8;
      *(_QWORD *)(v8 + 8) = v5;
      if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel(v7 + 8) )
      {
        *((_DWORD *)v7 + 12) &= ~0x8000000u;
        v7[1] = (__int64)v7;
        *v7 = (__int64)v7;
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
        ExReleaseSpinLockExclusiveFromDpcLevel(v7 + 8);
        __writecr8(v6);
        MiSegmentDelete((_CONTROL_AREA *)(v7 - 1));
      }
      else
      {
        v14 = *(_QWORD *)v5;
        if( *(_BYTE **)(*(_QWORD *)v5 + 8i64) != v5 )
          goto LABEL_41;
        *v7 = v14;
        v7[1] = (__int64)v5;
        *(_QWORD *)(v14 + 8) = v7;
        *(_QWORD *)v5 = v7;
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
        __writecr8(v6);
      }
      v4 = ExAcquireSpinLockExclusive((INT64 *)&p_Segments->SegmentListLock);
      goto LABEL_2;
    }
    v9 = (__int64 **)&Partition->Segments.gapB0[64];
    while( 1 )
    {
      v10 = *v9;
      if( *v9 == (__int64 *)v9 )
        break;
      v15 = *v10;
      if( (__int64 **)v10[1] != v9 || *(__int64 **)(v15 + 8) != v10 )
        goto LABEL_41;
      *v9 = (__int64 *)v15;
      v16 = (__int64)(v10 - 1);
      *(_QWORD *)(v15 + 8) = v9;
      if( *(_QWORD *)(v16 + 32) == -1i64 )
      {
        if( ExAcquireRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown) )
        {
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
          __writecr8(v6);
          MiAttemptPageFileReduction((_MMPAGE_FILE_EXPANSION *)v16);
          ExReleaseRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown);
          v6 = ExAcquireSpinLockExclusive((INT64 *)&p_Segments->SegmentListLock);
        }
        if( (*(_BYTE *)(v16 + 79) & 0x10) == 0 )
          KeSetEvent((PRKEVENT)(v16 + 48), 0, 0);
      }
      else
      {
        *(_OWORD *)&PageExpand.Segment = *(_OWORD *)v16;
        *(_OWORD *)&PageExpand.DereferenceList.Blink = *(_OWORD *)(v16 + 16);
        *(_OWORD *)&PageExpand.RequestedExpansionSize = *(_OWORD *)(v16 + 32);
        *(_OWORD *)PageExpand.gap30 = *(_OWORD *)(v16 + 48);
        v17 = *(_OWORD *)(v16 + 64);
        PageExpand.ActiveEntry = (void **volatile)v16;
        *(_OWORD *)&PageExpand.gap30[16] = v17;
        *(_QWORD *)(v16 + 80) = &PageExpand;
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
        __writecr8(v6);
        if( ExAcquireRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown) )
        {
          MiExtendPagingFiles(&PageExpand);
          ExReleaseRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown);
        }
        v18 = MiProcessingPageExtendComplete((__int64)&PageExpand, v16, (__int64)Partition);
        --Partition->Segments.PagefileExtensionRequests;
        v6 = v18;
        if( Partition->Segments.PagefileExtensionWaiters )
          KeSetEvent((PRKEVENT)Partition->Segments.gap210, 0, 0);
      }
    }
    v11 = v28;
    if( v28 )
    {
      v12 = (_QWORD **)&Partition->Segments.gapB0[48];
      while( 1 )
      {
        v13 = *v12;
        if( *v12 == v12 )
          break;
        v19 = *v13;
        if( (_QWORD **)v13[1] != v12 || *(_QWORD **)(v19 + 8) != v13 )
          goto LABEL_41;
        *v12 = (_QWORD *)v19;
        v20 = (__int64)(v13 - 1);
        *(_QWORD *)(v19 + 8) = v12;
        *(_OWORD *)&PageExpand.Segment = *(_OWORD *)(v13 - 1);
        *(_OWORD *)&PageExpand.DereferenceList.Blink = *(_OWORD *)(v13 + 1);
        *(_OWORD *)&PageExpand.RequestedExpansionSize = *(_OWORD *)(v13 + 3);
        *(_OWORD *)PageExpand.gap30 = *(_OWORD *)(v13 + 5);
        v21 = *(_OWORD *)(v13 + 7);
        PageExpand.ActiveEntry = (void **volatile)(v13 - 1);
        *(_OWORD *)&PageExpand.gap30[16] = v21;
        v13[9] = &PageExpand;
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&Partition->Segments.SegmentListLock);
        __writecr8(v6);
        MiRemoveUnusedSegments(Partition);
        v22 = v27;
        v24 = v23 == 0;
        ActualExpansion = PageExpand.ActualExpansion;
        if( !v24 )
          v22 = 1;
        v27 = v22;
        if( v22 )
          ActualExpansion = 1i64;
        PageExpand.ActualExpansion = ActualExpansion;
        v6 = MiProcessingPageExtendComplete((__int64)&PageExpand, v20, (__int64)Partition);
      }
      v11 = v28;
      p_Segments = &Partition->Segments;
    }
  }
  while( *(_BYTE **)v5 != v5
       || v11 && *(_MI_PARTITION **)&Partition->Segments.gapB0[48] != (_MI_PARTITION *)&Partition->Segments.gapB0[48]
       || *v9 != (__int64 *)v9 );
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
  __writecr8(v6);
  if( *(_DWORD *)&Partition->Segments.gap1D0[4] )
  {
    KeResetEvent((_KEVENT *)Partition->Segments.gap1D0);
    MiFreeClonePool();
  }
}

Referenced by:

MiDereferenceSegmentThread
MiRemoveUnusedSegments