MiGatherMappedPages

__int64 __fastcall MiGatherMappedPages(__int64 a1, unsigned int a2, __int64 a3){
  unsigned int v4; 
  _QWORD *v6; 
  int v7; 
  IO_STATUS_BLOCK *v8; 
  __int64 v9; 
  _MMPFN *PfnDb; 
  UINT64 v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  int v16; 
  __int64 v17; 
  volatile signed __int64 *v18; 
  unsigned __int8 *v19; 
  _FILE_OBJECT *v20; 
  bool v21; 
  _FILE_OBJECT *v22; 
  _SECTION_OBJECT_POINTERS *v23; 
  int v24; 
  IO_STATUS_BLOCK *v25; 
  IO_STATUS_BLOCK *v26; 
  unsigned __int64 v27; 
  int v28; 
  LARGE_INTEGER v29; 
  __int64 Information_low; 
  ERESOURCE **v31; 
  unsigned int v32; 
  unsigned int v33; 
  int v34; 
  int v35; 
  NTSTATUS v36; 
  void *v37; 
  IO_STATUS_BLOCK *v38; 
  unsigned __int8 CurrentIrql; 
  UINT64 v41; 
  int v42; 
  unsigned __int64 v43; 
  IO_STATUS_BLOCK *v44; 
  int v45; 
  MDL *v46; 
  __int64 v47; 
  INT64 *v48; 
  unsigned __int64 v49; 
  unsigned __int64 v50; 
  UINT64 v51; 
  int v52; 
  unsigned __int8 v53; 
  LARGE_INTEGER FileOffset; 
  IO_STATUS_BLOCK *IoStatus; 
  LARGE_INTEGER EndingOffset; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  unsigned int v58; 
  INT64 v60; 
  v60 = 0i64;
  EndingOffset.QuadPart = 0i64;
  v4 = a2;
  FileOffset.QuadPart = 0i64;
  if( a2 >= 0x10 )
  {
    v4 = 0;
    v6 = (_QWORD *)(a1 + 3472);
    do
    {
      if( *v6 != 0xFFFFFFFFFi64 )
        break;
      ++v4;
      v6 += 5;
    }
    while( v4 < 0x10 );
    if( v4 == 16 )
      return 0i64;
  }
  v7 = 0;
  if( *(_BYTE *)(a1 + 1003) )
  {
    v48 = (INT64 *)(a1 + 996);
    v49 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 996));
    if( *(_BYTE *)(a1 + 1005) )
    {
      *(_BYTE *)(a1 + 1005) = 0;
      *(_BYTE *)(a1 + 1003) = 0;
      v7 = 1;
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(v48);
    __writecr8(v49);
  }
  if( *(_BYTE *)(a1 + 1032) == 1 )
    v7 = 1;
  if( v7 )
    KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&Mi10Milliseconds);
  v8 = (IO_STATUS_BLOCK *)(5i64 * v4);
  v9 = *(_QWORD *)(a1 + 40i64 * v4 + 3472);
  IoStatus = v8;
  if( v9 == 0xFFFFFFFFFi64 )
    return 0i64;
  PfnDb = MmGetPfnDb();
  while( 1 )
  {
    v11 = (UINT64)PfnDb + 48 * v9;
    v12 = (unsigned __int8)MiLockPageInline(v11);
    if( v9 == *(_QWORD *)(a1 + 8i64 * (_QWORD)IoStatus + 3472) )
      break;
LABEL_38:
    _InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
    PfnDb = MmGetPfnDb();
    v9 = *(_QWORD *)(a1 + 8i64 * (_QWORD)IoStatus + 3472);
    if( v9 == 0xFFFFFFFFFi64 )
      return 0i64;
  }
  v13 = *(_QWORD *)(v11 + 16);
  if( qword_140C4DC80 && (v13 & 0x10) == 0 )
    v13 &= ~qword_140C4DC80;
  v14 = v13 >> 16;
  v15 = *(_QWORD *)v14;
  v16 = *(_DWORD *)(*(_QWORD *)v14 + 56i64);
  if( (v16 & 0x20) != 0 )
  {
    MiUnlinkPageFromList((_MMPFN *)v11, 0i64);
    v60 = MI_READ_PTE_LOCK_FREE(v11 + 16);
    v50 = (unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v60) >> 5;
    if( ((*(_QWORD *)(v11 + 40) >> 60) & 7) == 3 )
    {
      MiClearPfnImageVerified(v11, 28);
      if( (MiFlags & 0x10000) != 0 && (v50 & 2) != 0 && (*(_DWORD *)(v15 + 92) & 0xC0000) != 0 )
        MiMarkPfnVerified(v11, 32 * ((((unsigned int)MiFlags >> 17) & 1) == 0) + 6);
    }
    v60 = MiSwizzleInvalidPte(32 * (v50 & 0x1F));
    *(_QWORD *)(v11 + 16) = v60;
    MiDereferenceControlAreaPfnList((_CONTROL_AREA *)v15, 0i64, v51, 3ui64);
    v41 = 8i64;
    goto LABEL_37;
  }
  if( (v16 & 8) != 0 )
  {
LABEL_36:
    MiUnlinkPageFromList((_MMPFN *)v11, 0i64);
    v41 = 16i64;
LABEL_37:
    MiInsertPageInList((_MMPFN *)v11, v41);
    goto LABEL_38;
  }
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v15 + 72));
  if( (*(_DWORD *)(v15 + 56) & 8) != 0 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
    goto LABEL_36;
  }
  v17 = *(_QWORD *)(v15 + 120);
  ++*(_DWORD *)(v15 + 76);
  v18 = (volatile signed __int64 *)(8 * v17);
  if( v18 && _InterlockedIncrement64(v18 + 4) <= 1 )
    __fastfail(0xEu);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
  MiReferencePageForModifiedWrite((_MMPFN *)v11, 1u, v19);
  _InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v12);
  v20 = MiReferenceControlAreaFile((_CONTROL_AREA *)v15);
  v21 = *(_BYTE *)(a1 + 1003) == 0;
  v22 = v20;
  v23 = v20->SectionObjectPointer;
  SectionObjectPointer = v23;
  if( v21 )
    v24 = CcNotifyOfMappedWrite(v23, FileOffset, 0i64);
  else
    v24 = 0;
  v25 = (IO_STATUS_BLOCK *)MiBuildMappedCluster((char *)v11, (unsigned __int64 *)(a3 + 208), v24);
  *(_QWORD *)(a3 + 200) = v25;
  v26 = v25;
  *(_QWORD *)(a3 + 160) = v15;
  IoStatus = v25;
  v27 = MiStartingOffset(
          v14,
          *((_QWORD *)MmGetPfnDb() + 6 * (__int64)v25[3].Pointer + 1) | 0x8000000000000000ui64,
          0xFFFFFFFF);
  v28 = *(_DWORD *)(a3 + 40);
  v29.QuadPart = v27;
  FileOffset.QuadPart = v27;
  LODWORD(v27) = v26[2].Information;
  *(_DWORD *)(a3 + 136) = v27;
  v58 = (unsigned int)v27 >> 12;
  *(_DWORD *)(a3 + 140) = ((unsigned int)v27 >> 12) - 1;
  Information_low = LODWORD(v26[2].Information);
  v31 = (ERESOURCE **)(a3 + 168);
  *(_QWORD *)(a3 + 168) = 0i64;
  EndingOffset.QuadPart = v29.QuadPart + Information_low;
  if( (*((_DWORD *)v22->DeviceObject + 13) & 0x10) != 0 )
    v32 = v28 | 2;
  else
    v32 = v28 & 0xFFFFFFFD;
  *(_DWORD *)(a3 + 40) = v32;
  v33 = 0;
  v34 = *(_DWORD *)(v15 + 56);
  if( (v34 & 4) != 0 )
  {
    MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
LABEL_30:
    v36 = -1073741740;
    goto LABEL_31;
  }
  if( (v34 & 0x10) != 0 )
  {
    MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
    v36 = -1073741672;
LABEL_31:
    v33 = 1;
    goto LABEL_32;
  }
  *(_QWORD *)(a3 + 152) = v22;
  if( FsRtlAcquireFileForModWriteEx(v22, &EndingOffset, v31) < 0 )
  {
    v36 = -1073741740;
    MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
    *v31 = 0i64;
LABEL_47:
    if( (v36 & 0xC0000000) != -1073741824 )
      goto LABEL_33;
LABEL_32:
    v37 = (void *)a3;
    *(_QWORD *)(a3 + 24) = 0i64;
    v38 = (IO_STATUS_BLOCK *)(a3 + 16);
    *(_DWORD *)(a3 + 16) = v36;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(1ui64);
    MiWriteComplete(v37, v38, v33);
    __writecr8(CurrentIrql);
    goto LABEL_33;
  }
  v35 = CcNotifyOfMappedWrite(SectionObjectPointer, v29, LODWORD(IoStatus[2].Information));
  if( !v35 )
  {
    FsRtlReleaseFileForModWrite(v22, *v31);
    MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
    *v31 = 0i64;
    goto LABEL_30;
  }
  if( v35 == 1 )
    *v31 = (ERESOURCE *)((unsigned __int64)*v31 | 1);
  *(LARGE_INTEGER *)(a3 + 176) = v29;
  v42 = *(_DWORD *)(a1 + 688);
  v43 = *(_QWORD *)(a1 + 7104);
  if( v42 )
  {
    if( v43 >= 0x420 )
      v52 = 0;
    else
      v52 = v42 - 1;
    *(_DWORD *)(a1 + 688) = v52;
  }
  else if( v43 < 0x120 )
  {
    *(_DWORD *)(a1 + 688) = v43 < 0xA0 ? 32 : 8;
  }
  __incgsdword(0x2EB4u);
  v44 = (IO_STATUS_BLOCK *)(a3 + 16);
  __addgsdword(0x2EB0u, v58);
  if( !MiControlAreaUsingExtents(v15) )
  {
    v36 = IoAsynchronousPageWrite(
            v22,
            (__int64)IoStatus,
            &FileOffset,
            (void(__fastcall *)(__int64, __int64, _QWORD))MiWriteComplete,
            v47,
            v45,
            0,
            0,
            (__int64)v18,
            (__int64)v44,
            (_QWORD *)(v47 + 32));
    goto LABEL_47;
  }
  MiFlushFileOnlyMdl(v46, IoStatus);
  v53 = KeGetCurrentIrql();
  __writecr8(1ui64);
  MiWriteComplete((PVOID)a3, v44, 0i64);
  __writecr8(v53);
LABEL_33:
  if( v18 )
    IoDiskIoAttributionDereference((PVOID)v18);
  return 1i64;
}

Referenced by:

MiMappedPageWriter