MiResolveProtoCombine

INT64 __fastcall MiResolveProtoCombine(UINT64 a1, INT64 a2, INT64 *a3){
  UINT64 v3; 
  _MMPFN *v5; 
  UINT64 v6; 
  _MMPFN *v7; 
  INT64 v8; 
  __int64 v9; 
  INT64 v10; 
  UINT64 v11; 
  __int64 v12; 
  char *v13; 
  UINT64 ContainingPageTable; 
  __int64 v15; 
  UINT64 v16; 
  unsigned int v17; 
  char v18; 
  __int64 ValidPte; 
  char v21; 
  UINT64 TransitionPteValid; 
  int v23; 
  INT64 v24; 
  INT64 v25; 
  INT64 v26; 
  INT64 v27; 
  INT64 v28; 
  UINT64 v29; 
  INT64 v30; 
  _BYTE savedregs[56]; 
  UINT64 SpinCount; 
  v30 = 0i64;
  v3 = a1;
  if( !MiLockProtoPoolPage((_MMPTE *)a3, 0i64) )
    return 0i64;
  v5 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * MiGetContainingPageTable((UINT64)a3));
  v7 = MiLockLeafPage((_MMPTE *)a3, 0i64);
  if( !v7 )
    goto LABEL_25;
  v8 = MI_READ_PTE_LOCK_FREE((INT64)a3);
  v29 = v8;
  if( (v8 & 1) == 0 )
  {
    if( (v8 & 0x400) == 0 && (v8 & 0x800) != 0 )
    {
      v9 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64));
      if( (*((_BYTE *)v7 + 34) & 0x20) == 0 )
      {
        if( (unsigned int)MiUnlinkPageFromList(v7, 0i64) )
        {
          __incgsdword(0x2E98u);
          *((_QWORD *)v7 + 3) &= 0xC000000000000000ui64;
          v21 = *((_BYTE *)v7 + 34);
          ++*((_WORD *)v7 + 16);
          *((_BYTE *)v7 + 34) = v21 & 0xF8 | 6;
          TransitionPteValid = MiMakeTransitionPteValid((UINT64)a3);
          v23 = *((_DWORD *)v7 + 4);
          v24 = TransitionPteValid;
          v29 = TransitionPteValid;
          if( (v23 & 0x400) == 0 && (unsigned int)MiIsPteInStore(v9, *((_QWORD *)v7 + 2)) )
            v30 = MiCaptureDirtyBitToPfn((INT64)v7);
          *a3 = v24;
          v3 = a1;
          goto LABEL_5;
        }
        MiDiscardTransitionPteEx((UINT64)v7, 0i64);
      }
    }
    _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_25:
    LOBYTE(v6) = 17;
    MiUnlockProtoPoolPage(v5, v6);
    return 0i64;
  }
  v9 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64));
LABEL_5:
  *((_QWORD *)v7 + 3) ^= (*((_QWORD *)v7 + 3) ^ (*((_QWORD *)v7 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
  MiUnlockProtoPoolPage(v5, 0x3FFFFFFFFFFFFF11ui64);
  if( v30 )
    MiReleasePageFileInfo(v9, v30, 1, v10, v25, v26, v27, v28, v29, v30, *(INT64 *)savedregs, *(INT64 *)&savedregs[8]);
  v11 = v29;
  MiPteInShadowRange((UINT64)&v29);
  v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
  v13 = (char *)MmGetPfnDb() + 48 * v12;
  v30 = *((_QWORD *)v13 + 2);
  ContainingPageTable = MiGetContainingPageTable(v3);
  v16 = v15 + 48 * ContainingPageTable;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v16 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)(v16 + 24) < 0 );
  }
  *(_QWORD *)(v16 + 24) ^= (*(_QWORD *)(v16 + 24) ^ (*(_QWORD *)(v16 + 24) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v16 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v17 = (unsigned __int8)MI_READ_PTE_LOCK_FREE((INT64)&v30) >> 5;
  v18 = (unsigned __int8)v13[34] >> 6;
  if( v18 != 1 )
  {
    if( v18 )
    {
      if( v18 == 2 )
        v17 |= 0x18u;
    }
    else
    {
      v17 |= 8u;
    }
  }
  ValidPte = MiMakeValidPte(v3, v12, v17);
  LODWORD(v26) = 0;
  if( (unsigned int)MiAllocateWsle(a2, v3, v13, 0, ValidPte, v26, 0i64) )
    return 1i64;
  MiLockAndDecrementShareCount((UINT64)v13, 0);
  MiLockAndDecrementShareCount(v16, 0);
  return 0i64;
}

Referenced by:

MiConvertPrivateToProto