MiCopyImageExtentContents

NTSTATUS __stdcall MiCopyImageExtentContents(
        _MMINPAGE_SUPPORT *InPageSupport,
        _SUBSECTION *a2,
        _MMPTE *a3,
        INT64 a4,
        UINT64 SpinCount,
        INT64 ProtoPfn,
        INT64 a7){
  unsigned __int64 v7; 
  _MMPFN *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  _CONTROL_AREA *ControlArea; 
  _MI_FAULT_VA_LIST *v17; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v18; 
  UINT64 v19; 
  _LARGE_INTEGER v20; 
  _LARGE_INTEGER v21; 
  unsigned __int64 v22; 
  ULONG_PTR v23; 
  _MMPFN *v24; 
  INT64 v26; 
  _CONTROL_AREA *v27; 

  v7 = SpinCount;
  v12 = &MmGetPfnDb()[SpinCount];
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( v12->u2._bf_0 < 0 );
  }
  LODWORD(v13) = MI_READ_PTE_LOCK_FREE((INT64)a3);
  v14 = v13;
  if( (v13 & 0x400) != 0 )
  {
    v15 = -1i64;
  }
  else
  {
    if( *(&stru_140C4DB30 + 42) )
    {
      if( (v13 & 0x10) != 0 )
        v14 = v13 & 0xFFFFFFFFFFFFFFEFui64;
      else
        v14 = ~*(&stru_140C4DB30 + 42) & v13;
    }
    v15 = (v14 >> 12) & 0xFFFFFFFFFi64;
  }
  MiInitializeTransitionPfn(v7, a3);
  *((_BYTE *)&v12->u3 + 2) = *(_BYTE *)(&v12->u3 + 1) & 0xF8 | 2;
  v12->u3.ReferenceCount = 1;
  *((_BYTE *)&v12->u3 + 2) |= 0x20u;
  v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (unsigned __int64)&InPageSupport->ListHead[1] & -(__int64)(InPageSupport != 0i64);
  *((_BYTE *)&v12->u3 + 3) ^= (*((_BYTE *)&v12->u3 + 3) ^ ((unsigned __int32)InPageSupport->u1.e1._bf_0 >> 9)) & 7;
  _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  ControlArea = a2->ControlArea;
  v27 = a2->ControlArea;
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&a2->ControlArea->ControlAreaLock);
  ++ControlArea->NumberOfPfnReferences;
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
  if( (a4 & 1) != 0 )
  {
    v17 = (_MI_FAULT_VA_LIST *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
    if( *(_BYTE *)v17 == 1 )
    {
      MiAdvanceFaultList(v17);
      InPageSupport->u1.e1._bf_0 |= 8u;
    }
  }
  LODWORD(v18.Long) = MI_READ_PTE_LOCK_FREE((INT64)a3);
  InPageSupport->PteContents.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v18.Long;
  InPageSupport->PointerPte = a3;
  if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
    InPageSupport->u1.e1._bf_0 |= 0x80u;
  if( a7 )
    v19 = *(unsigned int *)(a7 + 64);
  else
    v19 = 0xFFFFFFFFi64;
  v20.anonymous_0.LowPart = MiStartingOffset(a2, a3, v19);
  v21 = v20;
  LODWORD(v22) = MiEndingOffsetWithLock(a2);
  v23 = 4096;
  if( v21.QuadPart + 4096 > v22 )
    v23 = (v22 - v21.anonymous_0.LowPart + 511) & 0xFFFFFE00;
  InPageSupport->BasePte = a3;
  InPageSupport->Pfn = v12;
  InPageSupport->FilePointer = 0i64;
  InPageSupport->ControlArea = v27;
  InPageSupport->ReadOffset = v21;
  InPageSupport->Mdl.Next = 0i64;
  *(_DWORD *)&InPageSupport->Mdl.Size = 4325432;
  InPageSupport->Mdl.StartVa = 0i64;
  *(_QWORD *)&InPageSupport->Mdl.ByteCount = 4096i64;
  InPageSupport->Page[0] = v7;
  InPageSupport->IoStatus.Information = 4096i64;
  InPageSupport->ByteCount = 4096;
  if( v15 != -1 )
    MiFlowThroughInsertNode(InPageSupport, &MmGetPfnDb()[v15]);
  v24 = (_MMPFN *)ProtoPfn;
  MiObtainProtoReference((_MMPFN *)ProtoPfn, 0i64);
  InPageSupport->LockedProtoPfn = v24;
  MiUnlockProtoPoolPage((ULONG_PTR)v24, 2u);
  LODWORD(v26) = 1;
  MiFillPageWithImageExtentContents(
    (__int64)v27->u2.SeImageStub->u1.ImageFileExtents & 0xFFFFFFF0,
    v7,
    v21.anonymous_0.LowPart,
    v23,
    v26);
  __incgsdword(0x2E98u);
  InPageSupport->IoStatus.Status = 0;
  return KeSetEvent((PRKEVENT)&InPageSupport->ListHead[1], 0, 0);
}

Referenced by:

MiResolveMappedFileFault