MiCombinePte

NTSTATUS __stdcall MiCombinePte(INT64 a1, INT64 a2, INT64 a3){
  __int64 v4; 
  int v5; 
  _ETHREAD *CurrentThread; 
  _QWORD *v8; 
  __int64 v9; 
  _MI_PAGE_COMBINING_SUPPORT *v10; 
  INT64 v11; 
  unsigned __int64 v12; 
  _UNICODE_STRING *v13; 
  _UNICODE_STRING *v14; 
  UINT8 v15; 
  PWCHAR v16; 
  int v17; 
  __int64 v18; 
  _QWORD *v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 *v23; 
  __int64 v24; 
  int v25; 
  int v26; 
  unsigned __int64 Long; 
  NTSTATUS v28; 
  unsigned __int64 v29; 
  INT64 v30; 
  unsigned __int64 v31; 

  v4 = *(_QWORD *)(a1 + 24);
  v5 = a3;
  if( !*(_QWORD *)(v4 + 104) )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v8 = *(_QWORD **)(a1 + 168);
    v9 = v8[3];
    v10 = *(_MI_PAGE_COMBINING_SUPPORT **)v9;
    if( (*(_BYTE *)(v4 + 184) & 7) != 0
      || (*(_DWORD *)(v4 - 1664 + 1124) & 0xC00u) >= 0xC00 && !MiIsStoreProcess((_EPROCESS *)(v4 - 1664)) )
    {
      if( v5 >= 1 )
        return 0;
      LODWORD(v11) = MI_READ_PTE_LOCK_FREE(a2);
      v30 = v11;
      LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)&v30);
      v31 = (v12 >> 12) & 0xFFFFFFFFFi64;
      v13 = (_UNICODE_STRING *)&MmGetPfnDb()[v31];
      LOBYTE(v17) = MI_PFN_IS_PROTO(v13, v14, v15, v16);
      if( v17 )
        return 0;
      v18 = *(_QWORD *)(v9 + 8);
      if( v18 && *(_DWORD *)(v18 + 4) || (CurrentThread->CrossThreadFlags & 1) != 0 )
        return 4;
      if( MiCombineCandidate(v10, 0i64) == MiCombineNone )
        return 0;
      ++*(_QWORD *)(*(_QWORD *)(v9 + 24) + 16i64);
      v20 = (_QWORD *)(v8[4] + 40i64 * v8[1]);
      if( (v30 & 0x20) != 0 )
      {
        LODWORD(v21) = MiComputeHash64((UINT64 *)((((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64));
        *v20 = v21;
      }
      else
      {
        MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)(v9 + 208), 3i64);
        v23 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + ((v22 >> 9) & 0x7FFFFFFFF8i64));
        if( !v23 )
          return 0;
        v24 = *(_QWORD *)(v9 + 16);
        *(_QWORD *)(v24 + 72) = v23;
        *(_QWORD *)(v24 + 64) = v13;
        LOBYTE(v25) = MiPteInShadowRange((UINT64)v23);
        v26 = v25;
        if( !MiMapArbitraryPage(v10, (_MI_ARBITRARY_PAGE_MAP *)v24, MiCombineNone, 0i64) )
        {
          Long = ZeroPte.u.Long;
          if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
            Long = ZeroPte.u.Long | 0x8000000000000000ui64;
          *v23 = Long;
          return 0;
        }
        v28 = MiPerformCombineScan((_MI_COMBINE_CONTROL_BLOCK *)v9, (_MI_ARBITRARY_PAGE_MAP *)v24, 0i64);
        MiReleaseArbitraryPage((_MI_ARBITRARY_PAGE_MAP *)v24);
        v29 = ZeroPte.u.Long;
        if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          v29 = ZeroPte.u.Long | 0x8000000000000000ui64;
        *v23 = v29;
        if( v28 != 1 )
          return 0;
      }
      v20[1] = v31;
      v20[2] = 0i64;
      v20[4] = 0i64;
      if( ++v8[1] == v8[2] )
        return MiCombineWorkingSetTail(a1);
      return 0;
    }
  }
  return 3;
}

Referenced by:

No references.