MiGatherMappedPages

NTSTATUS __stdcall MiGatherMappedPages(_MI_PARTITION *Partition, UINT64 i, _MMMOD_WRITER_MDL_ENTRY *ModWriterEntry){
  unsigned int v4; 
  unsigned __int64 *p_Flink; 
  int v7; 
  _MDL *v8; 
  unsigned __int64 Flink; 
  _MMPFN *PfnDb; 
  _MMPFN *v11; 
  unsigned __int64 v12; 
  __int64 bf_0; 
  __int64 v14; 
  INT64 v15; 
  int v16; 
  __int64 v17; 
  volatile signed __int64 *Priority; 
  _FILE_OBJECT *v19; 
  bool v20; 
  _FILE_OBJECT *v21; 
  _SECTION_OBJECT_POINTERS *v22; 
  NTSTATUS v23; 
  _MDL *v24; 
  _MDL *v25; 
  _LARGE_INTEGER v26; 
  _MODWRITER_FLAGS u1; 
  _LARGE_INTEGER v28; 
  __int64 ByteCount; 
  _ERESOURCE **p_FileResource; 
  _MODWRITER_FLAGS v31; 
  unsigned int v32; 
  int v33; 
  NTSTATUS v34; 
  int v35; 
  _MMMOD_WRITER_MDL_ENTRY *v36; 
  union {_IO_STATUS_BLOCK IoStatus;} *p_u; 
  unsigned __int8 CurrentIrql; 
  UINT8 v40; 
  UINT64 v41; 
  unsigned int MappedWriteBurstCount; 
  volatile unsigned __int64 AvailablePages; 
  union {_IO_STATUS_BLOCK IoStatus;} *HybridPriority; 
  int v45; 
  int v46; 
  _MDL *v47; 
  VOID *v48; 
  INT64 *p_ClusterRestrictionLock; 
  unsigned __int64 v50; 
  INT64 v51; 
  unsigned __int64 v52; 
  unsigned __int64 v53; 
  __int64 v54; 
  char v55; 
  __int64 v56; 
  int v57; 
  UINT64 v58; 
  unsigned int v59; 
  unsigned __int8 v60; 
  _IO_STATUS_BLOCK *v61; 
  UINT64 v62; 
  VOID *ApcContext; 
  VOID *v64; 
  _LARGE_INTEGER FileOffset; 
  _MDL *MemoryDescriptorList; 
  _LARGE_INTEGER EndingOffset; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  unsigned int v69; 
  INT64 v71; 

  v71 = 0i64;
  EndingOffset.QuadPart = 0i64;
  v4 = i;
  FileOffset.QuadPart = 0i64;
  if( (unsigned int)i >= 0x10 )
  {
    v4 = 0;
    p_Flink = &Partition->PageLists.MappedPageListHead[0].Flink;
    do
    {
      if( *p_Flink != 0xFFFFFFFFFi64 )
        break;
      ++v4;
      p_Flink += 5;
    }
    while( v4 < 0x10 );
    if( v4 == 16 )
      return 0;
  }
  v7 = 0;
  if( Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages )
  {
    p_ClusterRestrictionLock = (INT64 *)&Partition->Modwriter.ClusterRestrictionLock;
    v50 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&Partition->Modwriter.ClusterRestrictionLock);
    if( Partition->Modwriter.ClusterRestrictions[1].ImposeDelay )
    {
      Partition->Modwriter.ClusterRestrictions[1].ImposeDelay = 0;
      Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages = 0;
      v7 = 1;
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(p_ClusterRestrictionLock);
    __writecr8(v50);
  }
  if( Partition->Modwriter.DelayMappedWrite == 1 )
    v7 = 1;
  if( v7 )
    KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Mi10Milliseconds);
  v8 = (_MDL *)(5i64 * v4);
  Flink = Partition->PageLists.MappedPageListHead[v4].Flink;
  MemoryDescriptorList = v8;
  if( Flink == 0xFFFFFFFFFi64 )
    return 0;
  PfnDb = MmGetPfnDb();
  while( 1 )
  {
    v11 = &PfnDb[Flink];
    v12 = MiLockPageInline(v11);
    if( Flink == *(&Partition->PageLists.MappedPageListHead[0].Flink + (_QWORD)MemoryDescriptorList) )
      break;
LABEL_38:
    _InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
    PfnDb = MmGetPfnDb();
    Flink = *(&Partition->PageLists.MappedPageListHead[0].Flink + (_QWORD)MemoryDescriptorList);
    if( Flink == 0xFFFFFFFFFi64 )
      return 0;
  }
  bf_0 = v11->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
  if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
    bf_0 &= ~*(&stru_140C4DB30 + 42);
  v14 = bf_0 >> 16;
  v15 = *(_QWORD *)v14;
  v16 = *(_DWORD *)(*(_QWORD *)v14 + 56i64);
  if( (v16 & 0x20) != 0 )
  {
    MiUnlinkPageFromList(v11, 0i64);
    LODWORD(v51) = MI_READ_PTE_LOCK_FREE((INT64)&v11->OriginalPte.u.Hard);
    v71 = v51;
    LODWORD(v52) = MI_READ_PTE_LOCK_FREE((INT64)&v71);
    v53 = v52 >> 5;
    if( (((unsigned __int64)v11->u4._bf_0 >> 60) & 7) == 3 )
    {
      MiClearPfnImageVerified(v11, 0x1Cui64);
      if( (MiFlags & 0x10000) != 0 && (v53 & 2) != 0 && (*(_DWORD *)(v15 + 92) & 0xC0000) != 0 )
        MiMarkPfnVerified(v11, 32 * (unsigned int)((((unsigned int)MiFlags >> 17) & 1) == 0) + 6);
    }
    v54 = MiSwizzleInvalidPte(32 * (v53 & 0x1F));
    v55 = v54;
    v71 = v54;
    v56 = v54;
    LOBYTE(v57) = MiPteInShadowRange((UINT64)&v11->OriginalPte.u.Long);
    if( v57 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v55 & 1) != 0 )
      v56 |= 0x8000000000000000ui64;
    v11->OriginalPte.u.Long = v56;
    MiDereferenceControlAreaPfnList((_CONTROL_AREA *)v15, 0i64, v58, 3ui64);
    v41 = 8i64;
    goto LABEL_37;
  }
  if( (v16 & 8) != 0 )
  {
LABEL_36:
    MiUnlinkPageFromList(v11, 0i64);
    v41 = 16i64;
LABEL_37:
    MiInsertPageInList(v11, v41, v40);
    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);
  Priority = (volatile signed __int64 *)(8 * v17);
  if( Priority && _InterlockedIncrement64(Priority + 4) <= 1 )
    __fastfail(0xEu);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
  MiReferencePageForModifiedWrite(v11, 1ui64);
  _InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v12);
  v19 = MiReferenceControlAreaFile((_CONTROL_AREA *)v15);
  v20 = Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages == 0;
  v21 = v19;
  v22 = v19->SectionObjectPointer;
  SectionObjectPointer = v22;
  if( v20 )
    v23 = CcNotifyOfMappedWrite(v22, FileOffset, 0i64);
  else
    v23 = 0;
  v24 = MiBuildMappedCluster(v11, &ModWriterEntry->Mdl, v23);
  ModWriterEntry->PointerMdl = v24;
  v25 = v24;
  ModWriterEntry->ControlArea = (_CONTROL_AREA *)v15;
  MemoryDescriptorList = v24;
  v26.anonymous_0.LowPart = MiStartingOffset(
                              (_SUBSECTION *)v14,
                              (_MMPTE *)(MmGetPfnDb()[(__int64)v24[1].Next].PteLong | 0x8000000000000000ui64),
                              0xFFFFFFFFui64);
  u1 = ModWriterEntry->u1;
  v28 = v26;
  FileOffset = v26;
  v26.anonymous_0.LowPart = v25->ByteCount;
  ModWriterEntry->ByteCount = v26.anonymous_0.LowPart;
  v69 = v26.anonymous_0.LowPart >> 12;
  ModWriterEntry->ChargedPages = (v26.anonymous_0.LowPart >> 12) - 1;
  ByteCount = v25->ByteCount;
  p_FileResource = &ModWriterEntry->FileResource;
  ModWriterEntry->FileResource = 0i64;
  EndingOffset.QuadPart = v28.QuadPart + ByteCount;
  if( (v21->DeviceObject->Characteristics & 0x10) != 0 )
    v31 = (_MODWRITER_FLAGS)(*(_DWORD *)&u1 | 2);
  else
    v31 = (_MODWRITER_FLAGS)(*(_DWORD *)&u1 & 0xFFFFFFFD);
  ModWriterEntry->u1 = v31;
  v32 = 0;
  v33 = *(_DWORD *)(v15 + 56);
  if( (v33 & 4) != 0 )
  {
    MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
LABEL_30:
    v35 = -1073741740;
    goto LABEL_31;
  }
  if( (v33 & 0x10) != 0 )
  {
    MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
    v35 = -1073741672;
LABEL_31:
    v32 = 1;
    goto LABEL_32;
  }
  ModWriterEntry->File = v21;
  if( FsRtlAcquireFileForModWriteEx(v21, &EndingOffset, p_FileResource) < 0 )
  {
    v35 = -1073741740;
    MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
    *p_FileResource = 0i64;
LABEL_47:
    if( (v35 & 0xC0000000) != -1073741824 )
      goto LABEL_33;
LABEL_32:
    v36 = ModWriterEntry;
    ModWriterEntry->u.IoStatus.Information = 0i64;
    p_u = &ModWriterEntry->u;
    ModWriterEntry->u.IoStatus.Status = v35;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(1ui64);
    MiWriteComplete(v36, &p_u->IoStatus, v32);
    __writecr8(CurrentIrql);
    goto LABEL_33;
  }
  v34 = CcNotifyOfMappedWrite(SectionObjectPointer, v28, MemoryDescriptorList->ByteCount);
  if( !v34 )
  {
    FsRtlReleaseFileForModWrite(v21, *p_FileResource);
    MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
    *p_FileResource = 0i64;
    goto LABEL_30;
  }
  if( v34 == 1 )
    *p_FileResource = (_ERESOURCE *)((unsigned __int64)*p_FileResource | 1);
  ModWriterEntry->WriteOffset = v28;
  MappedWriteBurstCount = Partition->Modwriter.MappedWriteBurstCount;
  AvailablePages = Partition->Vp.AvailablePages;
  if( MappedWriteBurstCount )
  {
    if( AvailablePages >= 0x420 )
      v59 = 0;
    else
      v59 = MappedWriteBurstCount - 1;
    Partition->Modwriter.MappedWriteBurstCount = v59;
  }
  else if( AvailablePages < 0x120 )
  {
    Partition->Modwriter.MappedWriteBurstCount = AvailablePages < 0xA0 ? 32 : 8;
  }
  __incgsdword(0x2EB4u);
  HybridPriority = &ModWriterEntry->u;
  __addgsdword(0x2EB0u, v69);
  LOBYTE(v45) = MiControlAreaUsingExtents(v15);
  if( !v45 )
  {
    LOBYTE(ApcContext) = 0;
    LODWORD(v62) = 0;
    LODWORD(v61) = v46;
    v35 = IoAsynchronousPageWrite(
            v21,
            MemoryDescriptorList,
            &FileOffset,
            MiWriteComplete,
            v48,
            v61,
            v62,
            ApcContext,
            (_IO_PRIORITY_HINT)Priority,
            (UINT64)HybridPriority,
            (_BYTE)v48 + 32,
            v64,
            (_IO_STATUS_BLOCK *)FileOffset.QuadPart,
            (_IRP **)MemoryDescriptorList);
    goto LABEL_47;
  }
  MiFlushFileOnlyMdl(v47, (_IO_STATUS_BLOCK *)MemoryDescriptorList);
  v60 = KeGetCurrentIrql();
  __writecr8(1ui64);
  MiWriteComplete(ModWriterEntry, &HybridPriority->IoStatus, 0i64);
  __writecr8(v60);
LABEL_33:
  if( Priority )
    IoDiskIoAttributionDereference((VOID *)Priority);
  return 1;
}

Referenced by:

MiMappedPageWriter