MiWriteComplete

VOID __stdcall MiWriteComplete(VOID *Context, _IO_STATUS_BLOCK *IoStatus, UINT64 MaintainIoSizeDespiteError){
  _MDL *v3; 
  INT64 v5; 
  int v7; 
  __int16 MdlFlags; 
  int v9; 
  unsigned int v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  int v13; 
  _CONTROL_AREA *v14; 
  __int64 v15; 
  __int64 v16; 
  INT64 v17; 
  _MDL *p_Size; 
  _MDL *Next; 
  _MMPFN *v20; 
  _MMPTE v21; 
  unsigned __int64 v22; 
  INT64 v23; 
  INT64 v24; 
  unsigned __int64 v25; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v26; 
  char *v27; 
  __int64 v28; 
  _BOOL4 IsRetryIoStatus; 
  __int64 v30; 
  char v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  INT64 v34; 
  int v35; 
  _KEVENT *v36; 
  _FILE_OBJECT *v37; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedResidentAvailable; 
  bool v40; 
  signed __int32 v41; 
  _WORK_QUEUE_ITEM *Pool; 
  VOID **v43; 
  INT64 *v44; 
  unsigned __int8 v45; 
  unsigned __int8 v46; 
  unsigned __int64 v47; 
  unsigned __int8 v48; 
  unsigned __int8 v49; 
  INT64 v50; 
  int v51; 
  _CONTROL_AREA *ControlArea; 
  _KEVENT *Event; 
  _MDL *v54; 
  unsigned __int64 v55; 
  _LARGE_INTEGER CurrentTime; 
  _MMPFN *v57; 
  UINT8 FileObject; 
  _FILE_OBJECT *FileObjecta; 
  int Status; 
  int v61; 
  int Length; 

  v61 = MaintainIoSizeDespiteError;
  v3 = (_MDL *)*((_QWORD *)Context + 25);
  v5 = *((_QWORD *)Context + 24);
  Length = *((_DWORD *)Context + 34);
  v7 = 0;
  v51 = 0;
  MdlFlags = v3->MdlFlags;
  v9 = 0;
  if( (MdlFlags & 0x200) != 0 )
  {
    MiRetardMdl(v3);
    MdlFlags = v3->MdlFlags;
  }
  if( (MdlFlags & 1) != 0 )
    MmUnmapLockedPages(v3->MappedSystemVa, v3);
  v10 = IoStatus->Status;
  v11 = *((_QWORD *)Context + 21);
  Status = v10;
  ControlArea = (_CONTROL_AREA *)*((_QWORD *)Context + 20);
  if( !ControlArea )
  {
    LODWORD(v50) = v10;
    CurrentTime = *(_LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    MI_PAGEFILE_WRITE(
      (_MMMOD_WRITER_MDL_ENTRY *)Context,
      &CurrentTime,
      IoPagingPriorityReserved2|IoPagingPriorityNormal,
      0i64,
      v50);
    v10 = Status;
  }
  v54 = v3 + 1;
  v55 = (unsigned __int64)&v3[1] + 8 * ((Length & 0xFFF) != 0) + 8 * (Length >> 12);
  if( v11 )
  {
    v37 = (_FILE_OBJECT *)*((_QWORD *)Context + 19);
    FileObjecta = v37;
    if( (v11 & 1) != 0 )
    {
      v11 &= ~1ui64;
    }
    else
    {
      CcNotifyOfMappedWriteComplete(
        v37->SectionObjectPointer,
        *(_LARGE_INTEGER *)((char *)Context + 176),
        (unsigned int)Length,
        v10);
      v37 = FileObjecta;
    }
    FsRtlReleaseFileForModWrite(v37, (_ERESOURCE *)v11);
    MiDereferenceControlAreaFile(ControlArea, FileObjecta);
  }
  if( Status >= 0 )
  {
    v14 = ControlArea;
    goto LABEL_13;
  }
  v12 = (*((_DWORD *)Context + 10) >> 1) & 1;
  MmIsWriteErrorFatal((_BYTE *)(ControlArea != 0i64), v12, (unsigned int)Status);
  if( !v13 )
    goto LABEL_10;
  if( !ControlArea )
    KeBugCheckEx(0x7Au, (PVOID)0x20, (PVOID)Status, v3, 0i64);
  if( (ControlArea->u.LongFlags & 0x10) != 0 )
    goto LABEL_11;
  if( MiIsRetryIoStatus((unsigned int)Status, Length) && v12 && v55 > (unsigned __int64)&v3[1].Size )
  {
LABEL_10:
    v9 = 1;
  }
  else
  {
    v7 = 1;
    v51 = 1;
  }
LABEL_11:
  v14 = ControlArea;
  if( ControlArea )
    *(_DWORD *)(v5 + 680) = Status;
  else
    *(_DWORD *)(v5 + 676) = Status;
LABEL_13:
  Event = 0i64;
  if( v7 )
    MiSetDeleteOnClose(v14, 1ui64);
  v15 = MiSwizzleInvalidPte(0i64);
  v16 = *((_QWORD *)Context + 18);
  v17 = v15;
  if( v16 )
  {
    LODWORD(v34) = MiTransferSoftwarePte(v15, *((_QWORD *)Context + 18), *((_QWORD *)Context + 22) >> 12);
    v17 = v34;
  }
  p_Size = v54;
  if( (unsigned __int64)v54 < v55 )
  {
    do
    {
      Next = p_Size->Next;
      if( Next == (_MDL *)*(&stru_140C4DB30 + 495) )
      {
        if( (*((_DWORD *)Context + 10) & 0x20) == 0 )
          MiReleasePageFileInfo((_MI_PARTITION *)v5, (_MMPTE)v17, 0i64);
        v32 = v17;
        if( *(&stru_140C4DB30 + 42) && (v17 & 0x10) == 0 )
          v32 = v17 & ~*(&stru_140C4DB30 + 42);
        v23 = HIDWORD(v32) + 1;
      }
      else
      {
        v20 = &MmGetPfnDb()[(_QWORD)Next];
        v57 = v20;
        FileObject = MiLockPageInline(v20);
        if( (v9 & 1) == 0 )
        {
          if( (*(_BYTE *)(&v20->u3 + 1) & 0x10) == 0 || (*(_DWORD *)(&v20->3 + 1) & 0x400i64) != 0 )
            v9 &= ~2u;
          else
            v9 |= 2u;
        }
        v9 &= 0xFFFFFFF3;
        if( (*((_DWORD *)Context + 10) & 0x20) != 0 )
        {
          v30 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v20->u4._bf_0 >> 39) & 0x3FF));
          if( (v9 & 2) == 0 && (v20->u2._bf_0 & 0x4000000000000000i64) == 0 )
          {
            v31 = *((_BYTE *)&v20->u3 + 2);
            if( v20->u3.ReferenceCount > 1u )
            {
              *((_BYTE *)&v20->u3 + 2) = v31 | 0x10;
              v9 |= 2u;
            }
            else
            {
              *((_BYTE *)&v20->u3 + 2) = v31 & 0xF8 | 2;
              if( *(_DWORD *)(v30 + 1288) )
                v9 |= 4u;
              else
                v9 |= 8u;
            }
          }
        }
        LODWORD(v21.u.Long) = MiWriteCompletePfn(v20);
        _InterlockedAnd64(&v57->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(FileObject);
        if( v21.u.Long )
          MiReleasePageFileInfo((_MI_PARTITION *)v5, v21, 0i64);
        v22 = v17;
        if( *(&stru_140C4DB30 + 42) && (v17 & 0x10) == 0 )
          v22 = v17 & ~*(&stru_140C4DB30 + 42);
        v23 = HIDWORD(v22) + 1;
      }
      LODWORD(v24) = MiUpdatePageFileHighInPte(v17, v23);
      v17 = v24;
      p_Size = (_MDL *)&v54->Size;
      v54 = p_Size;
    }
    while( (unsigned __int64)p_Size < v55 );
    v16 = *((_QWORD *)Context + 18);
    v7 = v51;
  }
  v25 = *((unsigned int *)Context + 35);
  if( (_DWORD)v25 )
  {
    v33 = *((unsigned int *)Context + 35);
    if( v16 )
    {
      if( (_MI_PARTITION *)v5 == &Irp )
      {
        CurrentPrcb = KeGetCurrentPrcb();
        CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
        if( (_DWORD)CachedResidentAvailable != -1 )
        {
          if( v25 + CachedResidentAvailable <= 0x100 )
          {
            do
            {
              if( v25 >= 0x80000 )
                break;
              v41 = _InterlockedCompareExchange(
                      (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                      v25 + CachedResidentAvailable,
                      CachedResidentAvailable);
              v40 = (_DWORD)CachedResidentAvailable == v41;
              LODWORD(CachedResidentAvailable) = v41;
              if( v40 )
                goto LABEL_30;
            }
            while( v41 != -1 && v25 + v41 <= 0x100 );
          }
          if( (int)CachedResidentAvailable > 192
            && (_DWORD)CachedResidentAvailable != -1
            && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                    192,
                                                    CachedResidentAvailable) )
          {
            v33 = (int)CachedResidentAvailable - 192 + v25;
          }
        }
      }
      if( v33 )
        _InterlockedExchangeAdd64((volatile signed __int64 *)(v5 + 7168), v33);
    }
    else
    {
      MiReleaseWriteInProgressCharges((_MI_PARTITION *)v5, *((unsigned int *)Context + 35), 1ui64);
    }
  }
LABEL_30:
  if( *((_QWORD *)Context + 18) )
  {
    if( (*((_DWORD *)Context + 10) & 0x1Cu) < 8 )
      --*(_DWORD *)(v5 + 692);
    MiMakePagefileWriterEntryAvailable(Context);
    v36 = (_KEVENT *)(v5 + 920);
    if( *(_BYTE *)(v5 + 673) != 1 )
      v36 = 0i64;
    Event = v36;
    if( (*((_DWORD *)Context + 10) & 0x20) != 0 )
    {
      *(_DWORD *)(v5 + 1180) += v35;
      Event = v36;
      if( !*(_BYTE *)(v5 + 674) )
      {
        MiStoreCheckCompleteWriteBatch(v5);
        Event = v36;
      }
    }
  }
  if( ControlArea )
  {
    if( v7 )
    {
      Pool = (_WORK_QUEUE_ITEM *)MiAllocatePool(64i64, 0x38ui64, 0x70646D4Dui64);
      if( Pool )
      {
        Pool[1].List.Flink = (_LIST_ENTRY *)MiReferenceControlAreaFile(ControlArea);
        LODWORD(Pool[1].List.Blink) = Status;
        LOBYTE(Pool[1].WorkerRoutine) = 1;
        Pool->WorkerRoutine = (void(__fastcall *)(void *))MiLdwPopupWorker;
        Pool->Parameter = Pool;
        Pool->List.Flink = 0i64;
        ExQueueWorkItem(Pool, DelayedWorkQueue);
      }
    }
    v26 = MiDecrementModifiedWriteCount(ControlArea, 0i64);
    if( v26 )
      MiReleaseControlAreaWaiters(v26);
    _InterlockedDecrement((volatile signed __int32 *)(v5 + 624));
    v27 = (char *)*((_QWORD *)Context + 25);
    if( v27 != (char *)Context + 208 )
      ExFreePoolWithTag(v27, 0);
    if( (*((_DWORD *)Context + 10) & 1) != 0 )
    {
      v43 = *(VOID ***)(v5 + 640);
      if( *v43 != (VOID *)(v5 + 632) )
        __fastfail(3u);
      *(_QWORD *)Context = v5 + 632;
      *((_QWORD *)Context + 1) = v43;
      *v43 = Context;
      *(_QWORD *)(v5 + 640) = Context;
      if( *(_BYTE *)(v5 + 672) == 1 )
      {
        *(_BYTE *)(v5 + 672) = 0;
        KeSignalGate((_KGATE *)(v5 + 648), 1i64);
      }
    }
    else
    {
      MiFreeModWriterEntry((_MMMOD_WRITER_MDL_ENTRY *)Context, 1ui64);
    }
    v28 = 1003i64;
  }
  else
  {
    v28 = 1000i64;
  }
  if( Status >= 0 )
  {
    if( ControlArea )
      *(_BYTE *)(v5 + 1032) = 0;
    if( !*(_BYTE *)(v28 + v5) )
      goto LABEL_45;
    v44 = (INT64 *)(v5 + 996);
    v45 = ExAcquireSpinLockExclusive((INT64 *)(v5 + 996));
    v46 = *(_BYTE *)(v28 + v5);
    v47 = v45;
    if( !v46 )
      goto LABEL_130;
    if( *(_BYTE *)(v28 + v5 + 2) )
    {
      if( v46 > 1u )
      {
        *(_BYTE *)(v28 + v5 + 2) = 0;
LABEL_121:
        *(_BYTE *)(v28 + v5) = 0;
      }
    }
    else
    {
      v40 = (*(_BYTE *)(v28 + v5 + 1))-- == 1;
      if( v40 )
      {
        if( v46 <= 1u )
          goto LABEL_129;
        goto LABEL_121;
      }
    }
LABEL_130:
    ExReleaseSpinLockExclusiveFromDpcLevel(v44);
    __writecr8(v47);
    goto LABEL_45;
  }
  IsRetryIoStatus = MiIsRetryIoStatus((unsigned int)Status, Length);
  if( v61 )
  {
    if( v7 || IsRetryIoStatus )
      goto LABEL_45;
    goto LABEL_44;
  }
  if( Status == -1073741740 )
  {
LABEL_44:
    *(_BYTE *)(v5 + 1032) = 1;
    goto LABEL_45;
  }
  if( IsRetryIoStatus )
  {
    v44 = (INT64 *)(v5 + 996);
    v48 = ExAcquireSpinLockExclusive((INT64 *)(v5 + 996));
    v49 = *(_BYTE *)(v28 + v5);
    v47 = v48;
    if( !v49 )
    {
      *(_WORD *)(v28 + v5) = 4112;
      goto LABEL_130;
    }
    if( v49 > 1u )
      *(_BYTE *)(v28 + v5) = v49 >> 1;
    if( *(_BYTE *)(v28 + v5 + 2) )
      goto LABEL_130;
    v40 = (*(_BYTE *)(v28 + v5 + 1))-- == 1;
    if( !v40 )
      goto LABEL_130;
LABEL_129:
    *(_BYTE *)(v28 + v5 + 2) = 1;
    goto LABEL_130;
  }
LABEL_45:
  if( Event )
    KeSetEvent(Event, 0, 0);
}

Referenced by:

MiGatherMappedPages
MiGatherPagefilePages
MiStoreWriteModifiedCompleteApc