MiCopyFileOnlyGlobalSubsectionPage

INT64 __fastcall MiCopyFileOnlyGlobalSubsectionPage(
        INT64 a1,
        INT64 *a2,
        UINT64 r8_0,
        INT64 r9_0,
        INT64 a5,
        INT64 a6,
        INT64 a7){
  INT64 v7; 
  char *v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  INT64 *v15; 
  INT64 v16; 
  int v17; 
  UINT64 v18; 
  int v19; 
  _MMPFN *v20; 
  __int64 v21; 
  _QWORD *v22; 
  INT64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  _MMPFN *v26; 
  INT64 v27; 
  UINT64 v28; 
  _MMPFN *a3; 
  INT64 v31; 
  UINT64 SpinCount; 
  INT64 *v33; 
  _MMPFN *a4; 
  v33 = a2;
  v7 = a5;
  a4 = 0i64;
  a3 = 0i64;
  v12 = (char *)MmGetPfnDb() + 48 * a5;
  LODWORD(a5) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)&a5);
    while( *((__int64 *)v12 + 3) < 0 );
  }
  v13 = MI_READ_PTE_LOCK_FREE(r8_0);
  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, (MMPTE *)r8_0);
  v12[34] = v12[34] & 0xF8 | 2;
  *((_WORD *)v12 + 16) = 1;
  v12[34] |= 0x20u;
  *(_QWORD *)v12 = (a1 + 32) & -(__int64)(a1 != 0);
  v12[35] ^= (v12[35] ^ (*(_DWORD *)(a1 + 192) >> 9)) & 7;
  _InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v31 = *a2;
  v15 = (INT64 *)(v31 + 72);
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v31 + 72));
  ++*(_QWORD *)(v31 + 32);
  ExReleaseSpinLockExclusiveFromDpcLevel(v15);
  v16 = v33[1] + 8i64 * (unsigned int)((__int64)(r8_0 - *(_QWORD *)(a7 + 72)) >> 3);
  if( ((r8_0 ^ v16) & 0xFFFFFFFFF000i64) != 0 )
    v17 = MiTryLockProtoPoolPageAtDpc((INT64 *)v16, 0xFFFFFFFFF000i64, &a3, &a4);
  else
    v17 = (unsigned int)MiTryLockLeafPage((_MMPTE *)v16, 0xFFFFFFFFF000ui64);
  v19 = v17;
  if( v17 < 0 )
    goto LABEL_30;
  v20 = a4;
  if( (*((_BYTE *)a4 + 35) & 0x40) != 0 )
  {
    _InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( a3 )
    {
      LOBYTE(v18) = 2;
      MiUnlockProtoPoolPage(a3, v18);
    }
    v20 = a4;
    v19 = -1073740023;
  }
  if( v19 < 0 )
  {
LABEL_30:
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v12 + 3) < 0 );
    }
    MiHandleInPageError((UINT64)v12);
    MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v12);
    _InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
    return(unsigned int)v19;
  }
  else
  {
    v21 = (v20 - MmGetPfnDb()) / 48;
    if( (r9_0 & 1) != 0 )
    {
      v22 = (_QWORD *)(r9_0 & 0xFFFFFFFFFFFFFFFEui64);
      if( *(_BYTE *)v22 == 1 )
      {
        MiAdvanceFaultList(v22);
        *(_DWORD *)(a1 + 192) |= 8u;
      }
    }
    *(_QWORD *)(a1 + 168) = MI_READ_PTE_LOCK_FREE(r8_0);
    *(_QWORD *)(a1 + 232) = r8_0;
    if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
      *(_DWORD *)(a1 + 192) |= 0x80u;
    v23 = a7;
    v24 = (__int64)v33;
    *(_QWORD *)(a1 + 272) = 0i64;
    *(_DWORD *)(a1 + 280) = 4325432;
    *(_QWORD *)(a1 + 304) = 0i64;
    *(_QWORD *)(a1 + 312) = 4096i64;
    *(_QWORD *)(a1 + 320) = v7;
    v25 = MiStartingOffset(v24, r8_0, *(_DWORD *)(v23 + 64));
    *(_QWORD *)(a1 + 248) = v12;
    v26 = (_MMPFN *)a6;
    *(_QWORD *)(a1 + 96) = v25;
    v27 = v31;
    *(_QWORD *)(a1 + 240) = r8_0;
    *(_QWORD *)(a1 + 208) = v27;
    *(_QWORD *)(a1 + 200) = 0i64;
    *(_DWORD *)(a1 + 184) = 4096;
    MiObtainProtoReference((INT64)v26, 1);
    *(_QWORD *)(a1 + 160) = v26;
    MiCopyPage(v7, v21, 0i64, 68);
    if( v14 != -1 )
      MiFlowThroughInsertNode((_MMINPAGE_SUPPORT *)a1, (_MMPFN *)((char *)MmGetPfnDb() + 48 * v14));
    _InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( a3 )
    {
      LOBYTE(v28) = 2;
      MiUnlockProtoPoolPage(a3, v28);
    }
    LOBYTE(v28) = 2;
    MiUnlockProtoPoolPage(v26, v28);
    __incgsdword(0x2E98u);
    *(_DWORD *)(a1 + 80) = 0;
    *(_QWORD *)(a1 + 88) = 4096i64;
    KeSetEvent((PRKEVENT)(a1 + 32), 0);
    return 0i64;
  }
}

Referenced by:

MiResolveMappedFileFault