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