MiCopyImageExtentContents

NTSTATUS __fastcall MiCopyImageExtentContents(
        _MMINPAGE_SUPPORT *InPageSupport,
        _SUBSECTION *a2,
        _MMPTE *a3,
        INT64 a4,
        INT64 SpinCount,
        INT64 a6,
        INT64 a7){
  INT64 v7; 
  char *v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  _QWORD *v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  _MMPFN *v19; 
  UINT64 v20; 
  __int64 v22; 
  v7 = SpinCount;
  v12 = (char *)MmGetPfnDb() + 48 * SpinCount;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)&SpinCount);
    while( *((__int64 *)v12 + 3) < 0 );
  }
  v13 = MI_READ_PTE_LOCK_FREE((INT64)a3);
  if( (v13 & 0x400) != 0 )
  {
    v14 = -1i64;
  }
  else
  {
    if( qword_140C4DC80 )
    {
      if( (v13 & 0x10) != 0 )
        v13 &= ~0x10ui64;
      else
        v13 &= ~qword_140C4DC80;
    }
    v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
  }
  MiInitializeTransitionPfn(v7, a3);
  v12[34] = v12[34] & 0xF8 | 2;
  *((_WORD *)v12 + 16) = 1;
  v12[34] |= 0x20u;
  *(_QWORD *)v12 = ((unsigned __int64)InPageSupport + 32) & -(__int64)(InPageSupport != 0i64);
  v12[35] ^= (v12[35] ^ (*((_DWORD *)InPageSupport + 48) >> 9)) & 7;
  _InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v15 = *(_QWORD *)a2;
  v22 = *(_QWORD *)a2;
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(*(_QWORD *)a2 + 72i64));
  ++*(_QWORD *)(v15 + 32);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
  if( (a4 & 1) != 0 )
  {
    v16 = (_QWORD *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
    if( *(_BYTE *)v16 == 1 )
    {
      MiAdvanceFaultList(v16);
      *((_DWORD *)InPageSupport + 48) |= 8u;
    }
  }
  *((_QWORD *)InPageSupport + 21) = MI_READ_PTE_LOCK_FREE((INT64)a3);
  *((_QWORD *)InPageSupport + 29) = a3;
  if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
    *((_DWORD *)InPageSupport + 48) |= 0x80u;
  if( a7 )
    v17 = *(_DWORD *)(a7 + 64);
  else
    v17 = -1;
  v18 = MiStartingOffset((__int64)a2, (unsigned __int64)a3, v17);
  MiEndingOffsetWithLock((__int64)a2);
  *((_QWORD *)InPageSupport + 30) = a3;
  *((_QWORD *)InPageSupport + 31) = v12;
  *((_QWORD *)InPageSupport + 25) = 0i64;
  *((_QWORD *)InPageSupport + 26) = v22;
  *((_QWORD *)InPageSupport + 12) = v18;
  *((_QWORD *)InPageSupport + 34) = 0i64;
  *((_DWORD *)InPageSupport + 70) = 4325432;
  *((_QWORD *)InPageSupport + 38) = 0i64;
  *((_QWORD *)InPageSupport + 39) = 4096i64;
  *((_QWORD *)InPageSupport + 40) = v7;
  *((_QWORD *)InPageSupport + 11) = 4096i64;
  *((_DWORD *)InPageSupport + 46) = 4096;
  if( v14 != -1 )
    MiFlowThroughInsertNode(InPageSupport, (_MMPFN *)((char *)MmGetPfnDb() + 48 * v14));
  v19 = (_MMPFN *)a6;
  MiObtainProtoReference(a6, 0);
  LOBYTE(v20) = 2;
  *((_QWORD *)InPageSupport + 20) = v19;
  MiUnlockProtoPoolPage(v19, v20);
  MiFillPageWithImageExtentContents((PVOID)(*(_QWORD *)(*(_QWORD *)(v22 + 96) + 48i64) & 0xFFFFFFFFFFFFFFF0ui64), v7);
  __incgsdword(0x2E98u);
  *((_DWORD *)InPageSupport + 20) = 0;
  return KeSetEvent((PRKEVENT)((char *)InPageSupport + 32), 0);
}

Referenced by:

MiResolveMappedFileFault