MiCopyFileOnlyGlobalSubsectionPage

NTSTATUS __stdcall MiCopyFileOnlyGlobalSubsectionPage(
        _MMINPAGE_SUPPORT *InPageSupport,
        INT64 a2,
        _MMPTE *a3,
        INT64 a4,
        UINT64 SpinCount,
        INT64 ProtoPfn,
        INT64 a7){
  unsigned __int64 v7; 
  _MMPFN *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  _MMPTE *v16; 
  int v17; 
  NTSTATUS v18; 
  __int64 v19; 
  __int64 v20; 
  _MI_FAULT_VA_LIST *v21; 
  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;} v22; 
  INT64 v23; 
  _SUBSECTION *v24; 
  _LARGE_INTEGER v25; 
  _MMPFN *v26; 
  __int64 v28; 
  UINT64 v29; 
  _SUBSECTION *Subsection; 
  __int64 v31; 

  Subsection = (_SUBSECTION *)a2;
  v7 = SpinCount;
  v31 = 0i64;
  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);
  v28 = *(_QWORD *)a2;
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(*(_QWORD *)a2 + 72i64));
  ++*(_QWORD *)(v28 + 32);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v28 + 72));
  v16 = &Subsection->SubsectionBase[(unsigned int)(((__int64)a3 - *(_QWORD *)(a7 + 72)) >> 3)];
  if( (((unsigned __int64)a3 ^ (unsigned __int64)v16) & 0xFFFFFFFFF000i64) != 0 )
    v17 = (unsigned int)MiTryLockProtoPoolPageAtDpc(v16, 0xFFFFFFFFF000ui64);
  else
    v17 = (unsigned int)MiTryLockLeafPage(v16, 0xFFFFFFFFF000ui64);
  v18 = v17;
  if( v17 < 0 )
    goto LABEL_26;
  v19 = v31;
  if( (*(_BYTE *)(v31 + 35) & 0x40) != 0 )
  {
    _InterlockedAnd64((volatile signed __int64 *)(v31 + 24), 0x7FFFFFFFFFFFFFFFui64);
    v19 = v31;
    v18 = -1073740023;
  }
  if( v18 < 0 )
  {
LABEL_26:
    LODWORD(v29) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&v29);
      while( v12->u2._bf_0 < 0 );
    }
    MiHandleInPageError(v12);
    MiRemoveLockedPageChargeAndDecRef(v12);
    _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    return v18;
  }
  else
  {
    v20 = (v19 - (__int64)MmGetPfnDb()) / 48;
    if( (a4 & 1) != 0 )
    {
      v21 = (_MI_FAULT_VA_LIST *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
      if( *(_BYTE *)v21 == 1 )
      {
        MiAdvanceFaultList(v21);
        InPageSupport->u1.e1._bf_0 |= 8u;
      }
    }
    LODWORD(v22.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;})v22.Long;
    InPageSupport->PointerPte = a3;
    if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
      InPageSupport->u1.e1._bf_0 |= 0x80u;
    v23 = a7;
    v24 = Subsection;
    InPageSupport->Mdl.Next = 0i64;
    *(_DWORD *)&InPageSupport->Mdl.Size = 4325432;
    InPageSupport->Mdl.StartVa = 0i64;
    *(_QWORD *)&InPageSupport->Mdl.ByteCount = 4096i64;
    InPageSupport->Page[0] = v7;
    v25.anonymous_0.LowPart = MiStartingOffset(v24, a3, *(unsigned int *)(v23 + 64));
    InPageSupport->Pfn = v12;
    v26 = (_MMPFN *)ProtoPfn;
    InPageSupport->ReadOffset = v25;
    InPageSupport->BasePte = a3;
    InPageSupport->ControlArea = (_CONTROL_AREA *)v28;
    InPageSupport->FilePointer = 0i64;
    InPageSupport->ByteCount = 4096;
    MiObtainProtoReference(v26, 1ui64);
    InPageSupport->LockedProtoPfn = v26;
    MiCopyPage(v7, v20, 0i64, 0x44ui64);
    if( v15 != -1 )
      MiFlowThroughInsertNode(InPageSupport, &MmGetPfnDb()[v15]);
    _InterlockedAnd64((volatile signed __int64 *)(v31 + 24), 0x7FFFFFFFFFFFFFFFui64);
    MiUnlockProtoPoolPage((ULONG_PTR)v26, 2u);
    __incgsdword(0x2E98u);
    InPageSupport->IoStatus.Status = 0;
    InPageSupport->IoStatus.Information = 4096i64;
    KeSetEvent((PRKEVENT)&InPageSupport->ListHead[1], 0, 0);
    return 0;
  }
}

Referenced by:

MiResolveMappedFileFault