MiDeleteCachedSubsection

NTSTATUS __stdcall MiDeleteCachedSubsection(_MI_PARTITION *Partition){
  _MI_PARTITION_SEGMENTS *p_Segments; 
  __int64 Flink; 
  __int64 v4; 
  _LIST_ENTRY *p_UnusedSubsectionList; 
  unsigned __int64 v6; 
  _LIST_ENTRY *i; 
  NTSTATUS result; 
  _LIST_ENTRY *v9; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *v11; 
  UINT64 v12; 
  int v13; 
  UINT64 v14; 
  UINT64 v15; 
  int v16; 
  _MI_SUBSECTION_STATUS v17; 
  int v18; 
  unsigned __int8 v19; 
  unsigned __int64 v20; 
  _FILE_OBJECT *v21; 
  unsigned __int64 v22; 
  signed __int64 v23; 
  unsigned __int8 v24; 
  int v25; 
  unsigned __int64 v26; 
  _BOOL4 v27; 
  char v28; 
  int v29; 
  unsigned int v30; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v31; 
  UINT64 v32; 
  UINT64 v33; 
  UINT64 v34; 
  __int64 v35; 
  INT16 v36; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v37; 
  __int64 v38; 
  UINT64 Flags; 
  signed __int64 v40; 
  _IO_STATUS_BLOCK IoStatus; 
  _MMPTE *FinalPte; 
  _MMPTE *P; 
  _MMPTE *StartingPte; 

  p_Segments = &Partition->Segments;
  Flink = 1i64;
  IoStatus = 0i64;
  v4 = 1i64;
  p_UnusedSubsectionList = &Partition->Segments.UnusedSubsectionList;
  v6 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
  for( i = p_UnusedSubsectionList->Flink; i != p_UnusedSubsectionList; i = i->Flink )
  {
    v4 = (__int64)&i[-5];
    Flink = (__int64)i[-5].Flink;
    if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(Flink + 72)) )
      break;
  }
  if( i == p_UnusedSubsectionList )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
    result = -1073741275;
LABEL_11:
    __writecr8(v6);
    return result;
  }
  v9 = (_LIST_ENTRY *)(v4 + 80);
  v10 = *(_LIST_ENTRY **)(v4 + 80);
  v11 = *(_LIST_ENTRY **)(v4 + 88);
  if( v10->Blink != (_LIST_ENTRY *)(v4 + 80) || v11->Flink != v9 )
    __fastfail(3u);
  v11->Flink = v10;
  v10->Blink = v11;
  *(_WORD *)(v4 + 34) &= ~8u;
  *(_QWORD *)(v4 + 88) = v4 + 80;
  v9->Flink = v9;
  MiReduceUnusedSubsectionCount((_MSUBSECTION *)v4);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
  v13 = *(_DWORD *)(Flink + 56);
  if( (v13 & 1) != 0 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
    result = -1073741709;
    goto LABEL_11;
  }
  if( (v13 & 8) != 0 )
  {
    if( *(int *)(v4 + 52) < 0 )
    {
      LODWORD(v14) = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v12);
      v15 = v14;
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
      __writecr8(v6);
      if( v15 )
        MiReturnCrossPartitionSectionCharges((_MI_CROSS_PARTITION_CHARGES *)Partition, 1i64, v15);
      return -1073741792;
    }
    v16 = 1;
  }
  else
  {
    v16 = 0;
  }
  if( *(_QWORD *)(v4 + 96) )
    KeBugCheckEx(0x1Au, (PVOID)0x42004, (PVOID)v4, 0i64, 0i64);
  *(_QWORD *)(v4 + 96) = 1i64;
  *(_WORD *)(v4 + 32) &= ~1u;
  MiRemoveUnusedSegment((_CONTROL_AREA *)Flink);
  *(_DWORD *)(Flink + 56) |= 0x100u;
  P = *(_MMPTE **)(v4 + 8);
  if( v16 == 1 )
  {
    ++*(_DWORD *)(Flink + 76);
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
    __writecr8(v6);
    v17 = MiIsSubsectionClean((_MSUBSECTION *)v4);
    if( v17 )
    {
      if( v17 == MiSubsectionDirty )
      {
        v19 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
        *(_DWORD *)(v4 + 52) |= 0x80000000;
        v20 = v19;
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
        __writecr8(v20);
      }
      v18 = -1073741792;
    }
    else
    {
      v18 = 0;
    }
  }
  else
  {
    v21 = MiPreventControlAreaDelete((_CONTROL_AREA *)Flink);
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
    __writecr8(v6);
    StartingPte = *(_MMPTE **)(v4 + 8);
    FinalPte = &StartingPte[*(unsigned int *)(v4 + 44) - 1];
    v18 = FsRtlAcquireFileForCcFlushEx(v21);
    v22 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
    v23 = _InterlockedDecrement64((volatile signed __int64 *)(Flink + 112));
    v40 = v23;
    *(_QWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(Flink + 60) & 0x3FF)) + 1688i64) = 0i64;
    if( v18 < 0 || (*(_DWORD *)(Flink + 56) & 1) != 0 )
    {
      if( v23 )
        ++*(_DWORD *)(Flink + 76);
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
      __writecr8(v22);
      if( v18 >= 0 )
      {
        FsRtlReleaseFileForCcFlush(v21);
        v18 = -1073741431;
      }
      if( !v40 )
      {
        MiDeleteControlArea((_CONTROL_AREA *)Flink);
        ObfDereferenceObjectWithTag(v21, 0x746C6644ui64);
        return v18;
      }
    }
    else
    {
      ++*(_DWORD *)(Flink + 76);
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
      __writecr8(v22);
      KeGetCurrentThread()[1].TrapFrame = (_KTRAP_FRAME *)1;
      LODWORD(Flags) = 2;
      v18 = MiFlushSectionInternal(StartingPte, FinalPte, (_SUBSECTION *)v4, (_SUBSECTION *)v4, 0i64, Flags, &IoStatus);
      KeGetCurrentThread()[1].TrapFrame = 0i64;
      FsRtlReleaseFileForCcFlush(v21);
    }
    MiDereferenceControlAreaFile((_CONTROL_AREA *)Flink, v21);
  }
  v24 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
  v25 = *(_DWORD *)(Flink + 56);
  v26 = v24;
  if( (v25 & 1) == 0 )
  {
    if( v18 >= 0 )
    {
      if( *(_QWORD *)(v4 + 96) == 1i64 && (*(_BYTE *)(v4 + 32) & 1) == 0 )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
        __writecr8(v26);
        v27 = MiPurgeSubsection((_MSUBSECTION *)v4) == 0;
        v28 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
        v25 = *(_DWORD *)(Flink + 56);
        LOBYTE(v26) = v28;
        v29 = v27;
        goto LABEL_46;
      }
      v18 = -1073741823;
    }
    v29 = 1;
LABEL_46:
    v30 = v25 & 0xFFFFFEFF;
    *(_DWORD *)(Flink + 56) = v30;
    if( (v30 & 1) != 0 )
      goto LABEL_47;
    v32 = 0i64;
    if( v29 == 1 || *(_QWORD *)(v4 + 96) != 1i64 || *(_DWORD *)(v4 + 104) || (*(_BYTE *)(v4 + 32) & 1) != 0 )
    {
      v18 = -1073741823;
      LODWORD(v33) = MiDecrementSubsectionViewCount((_MSUBSECTION *)v4);
      v32 = v33;
      if( !*(_QWORD *)(v4 + 96) )
      {
        LODWORD(v35) = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v34);
        v32 += v35;
      }
      P = 0i64;
    }
    else
    {
      MiUpdateSystemProtoPtesTree((_RTL_BALANCED_NODE *)(v4 + 112), 0i64);
      *(_QWORD *)(v4 + 8) = 0i64;
      *(_QWORD *)(v4 + 96) = 0i64;
    }
    v37 = MiDecrementModifiedWriteCount((_CONTROL_AREA *)Flink, 1ui64);
    if( *(_QWORD *)(Flink + 24) | *(_QWORD *)(Flink + 40) )
    {
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
    }
    else
    {
      if( !*(_QWORD *)(Flink + 32) )
      {
        LOBYTE(v36) = v26;
        MiDestroySection((_CONTROL_AREA *)Flink, v36, 0i64);
        goto LABEL_64;
      }
      MiInsertUnusedSegment((_CONTROL_AREA *)Flink);
      v32 += v38;
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
    }
    __writecr8((unsigned __int8)v26);
LABEL_64:
    if( v37 )
      MiReleaseControlAreaWaiters(v37);
    if( v32 )
      MiReturnCrossPartitionSectionCharges((_MI_CROSS_PARTITION_CHARGES *)Partition, 1i64, v32);
    if( P )
      ExFreePoolWithTag(P, 0);
    return v18;
  }
  *(_DWORD *)(Flink + 56) = v25 & 0xFFFFFEFF;
LABEL_47:
  MiDecrementSubsectionViewCount((_MSUBSECTION *)v4);
  v31 = MiDecrementModifiedWriteCount((_CONTROL_AREA *)Flink, 1ui64);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
  __writecr8((unsigned __int8)v26);
  if( v31 )
    MiReleaseControlAreaWaiters(v31);
  return -1073741823;
}

Referenced by:

MiRemoveUnusedSegments