MiConvertStandbyToProto
INT64 __fastcall MiConvertStandbyToProto(
CHAR *a1,
_QWORD *a2,
INT64 a3,
CHAR a4,
INT64 a5,
UINT64 P2,
INT64 a7,
INT64 a8){
unsigned int v8;
UINT64 v9;
__int64 v10;
__int64 v11;
char v12;
__int64 v13;
MMPTE *v14;
volatile INT64 **v15;
volatile INT64 *v16;
UINT64 v17;
INT64 TransitionPte;
unsigned __int8 v19;
UINT64 *v21;
char v22;
char v23;
UINT64 v24;
char v25;
bool v26;
char *v27;
INT64 v28;
__int64 v29;
UINT64 *v30;
UINT8 *v31;
UINT8 *v32;
_MMPFN *PfnDb;
unsigned __int64 v34;
struct _KPRCB *CurrentPrcb;
__int64 v36;
signed __int32 v37;
INT64 v38;
_MMPFN *v39;
UINT64 v40;
_MMPFN *v41;
UINT64 v42;
__int128 v43;
INT64 ContainingPageTable;
MMPTE *PointerPte;
volatile INT64 *a1a;
UINT64 a2a;
UINT64 SpinCount;
UINT64 *SecondPage;
UINT64 v50;
_MMPFN *v51;
volatile INT64 *v52;
__int64 Pcsa;
unsigned int PrivatePfn;
PrivatePfn = a4;
v8 = *(_DWORD *)(a5 + 40) & 0x1F;
*(_QWORD *)((char *)&v43 + 4) = v8;
v9 = MiMakePrototypePteDirect(a5 + 48) | 0x800;
v50 = v9;
v11 = (__int64)((*(_QWORD *)(v10 + 56) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
SecondPage = (UINT64 *)v11;
LOWORD(v43) = 256;
v12 = 1;
v14 = *(MMPTE **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v13 + 174));
PointerPte = v14;
v16 = *v15;
a1a = *v15;
v52 = *v15;
if( a8 == -1 )
{
BYTE1(v43) = 1;
if( v16 != (volatile INT64 *)v14 )
{
v19 = 1;
LOBYTE(v43) = 1;
if( !MiGetCrossPartitionCombineCharges(v16, 1i64) )
goto LABEL_15;
BYTE1(v43) = 0;
}
v39 = MiLockProtoPoolPage((_MMPTE *)(a5 + 48), 0i64);
v41 = v39;
v51 = v39;
if( v39 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)(P2 + 24), 0x3Fui64) )
{
LOBYTE(v40) = 17;
MiUnlockProtoPoolPage(v39, v40);
}
else
{
if( a7 == (*(_QWORD *)(P2 + 8) | 0x8000000000000000ui64)
&& PointerPte == *(MMPTE **)(qword_140C4E388 + 8 * ((*(_QWORD *)(P2 + 40) >> 39) & 0x3FFi64))
&& (unsigned int)MiRecheckCombineVm(
(_MI_PAGE_COMBINING_SUPPORT *)a2,
(_MMPFN *)PrivatePfn,
(_MMSUPPORT_INSTANCE *)P2) )
{
MiTryLockLeafPage((_MMPTE *)(a5 + 48), v42);
}
MiUnlockNestedProtoPoolPage(v41);
_InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
}
v19 = v43;
goto LABEL_15;
}
*((_QWORD *)&v43 + 1) = (char *)MmGetPfnDb() + 48 * a8;
if( !(unsigned int)MiFillCombinePage(
(_MI_PAGE_COMBINING_SUPPORT *)v16,
*((_MMPFN **)&v43 + 1),
(_MMPFN *)P2,
(VOID *)v11) )
goto LABEL_14;
TransitionPte = MiMakeTransitionPte(a8, v8, v17);
SecondPage = (UINT64 *)((a5 + 48) & 0x7FFFFFFFFFFFFFFFi64);
a2a = 0i64;
ContainingPageTable = MiGetContainingPageTable(a5 + 48);
if( a1a != (volatile INT64 *)PointerPte )
{
if( MiGetCrossPartitionCombineCharges(a1a, 0i64) )
{
v12 = 0;
BYTE1(v43) = 0;
goto LABEL_6;
}
LABEL_14:
v19 = 0;
LABEL_15:
if( !BYTE1(v43) )
MiReturnCrossPartitionCombineCharges(a1a, v19);
return 0i64;
}
LABEL_6:
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(P2 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(P2 + 24) < 0 );
}
if( (**(_BYTE **)(a3 + 56) & 1) == 0
|| (unsigned __int8)((*(_BYTE *)(P2 + 34) & 7) - 2) > 1u
|| PointerPte != *(MMPTE **)(qword_140C4E388 + 8 * ((*(_QWORD *)(P2 + 40) >> 39) & 0x3FFi64))
|| a7 != (*(_QWORD *)(P2 + 8) | 0x8000000000000000ui64)
|| !(unsigned int)MiRecheckCombineVm(
(_MI_PAGE_COMBINING_SUPPORT *)a2,
(_MMPFN *)PrivatePfn,
(_MMSUPPORT_INSTANCE *)P2)
|| ((*(_DWORD *)(P2 + 16) >> 5) & 0x1F) != DWORD1(v43) )
{
goto LABEL_13;
}
if( !(unsigned int)MiUnlinkPageFromList((_MMPFN *)P2, 0i64) )
{
MiDiscardTransitionPteEx(P2, 0i64);
LABEL_13:
_InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_14;
}
v21 = (UINT64 *)(P2 + 16);
if( (*(_BYTE *)(P2 + 34) & 0x10) == 0 && !IS_PTE_NOT_DEMAND_ZERO(*v21) )
*(_BYTE *)(P2 + 34) = v22 | 0x10;
v23 = 0;
if( (*v21 & 2) != 0 )
{
if( v12 && !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET(PointerPte) )
a2a = v24;
else
v23 = 1;
v25 = 1;
}
else
{
v26 = v12 == 0;
v25 = 0;
if( v26 && (*v21 & 4) != 0 )
v23 = 1;
}
if( v23 )
{
a2a = MiCapturePageFileInfoInline(v21, 1i64, 1i64);
*(_BYTE *)(P2 + 34) |= 0x10u;
v21 = (UINT64 *)(P2 + 16);
}
if( v25 )
*v21 &= ~2ui64;
v27 = (char *)MmGetPfnDb() + 48 * ContainingPageTable;
MiLockNestedPageAtDpcInline((INT64)v27);
*((_QWORD *)v27 + 3) ^= (*((_QWORD *)v27 + 3) ^ ((*((_QWORD *)v27 + 3) & 0x3FFFFFFFFFFFFFFFi64) + 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v27 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiLockNestedPageAtDpcInline(*((INT64 *)&v43 + 1));
MiFinalizePageAttribute(*((_MMPFN **)&v43 + 1), (_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(P2 + 34) >> 6), 1ui64);
MiCopyPfnEntryEx(*((INT64 *)&v43 + 1), P2);
if( (unsigned int)MiGetPfnPriority(v28) < 5 )
*(_BYTE *)(*((_QWORD *)&v43 + 1) + 35i64) = *(_BYTE *)(*((_QWORD *)&v43 + 1) + 35i64) & 0xF8 | 5;
*(_QWORD *)(*((_QWORD *)&v43 + 1) + 8i64) = SecondPage;
*(_QWORD *)(*((_QWORD *)&v43 + 1) + 40i64) = ContainingPageTable & 0xFFFFFFFFFi64 | *(_QWORD *)(*((_QWORD *)&v43 + 1)
+ 40i64) & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
*(_QWORD *)(*((_QWORD *)&v43 + 1) + 24i64) &= 0xC000000000000000ui64;
MI_MAKE_PROTECT_WRITE_COPY((_MMPTE *)(*((_QWORD *)&v43 + 1) + 16i64));
if( !BYTE1(v43) )
*(_QWORD *)(a5 + 56) = 1i64;
*(_QWORD *)(a5 + 48) = 0i64;
*(_QWORD *)(a5 + 48) = TransitionPte;
Pcsa = *(_QWORD *)(P2 + 40) & 0xFFFFFFFFFi64;
LODWORD(v29) = MiMapPageInHyperSpaceWorker(Pcsa, 0i64, 0x80000000ui64);
v30 = (UINT64 *)(v29 + (*(_DWORD *)(P2 + 8) & 0xFFF));
*v30 = v9;
MiUnmapPageInHyperSpaceWorker(v30, 0x11u, 0x80000000ui64);
*(_QWORD *)(P2 + 24) |= 0x4000000000000000ui64;
MiPfnReferenceCountIsZero(*((_MMPFN **)&v43 + 1), a8, v31);
_InterlockedAnd64((volatile signed __int64 *)(*((_QWORD *)&v43 + 1) + 24i64), 0x7FFFFFFFFFFFFFFFui64);
if( BYTE1(v43) )
{
if( (*(_QWORD *)(P2 + 16) & 4) != 0 )
{
*(_QWORD *)(P2 + 16) &= ~4ui64;
if( a2a )
a2a &= ~4ui64;
}
}
*(_QWORD *)(P2 + 24) &= 0xC000000000000000ui64;
PfnDb = MmGetPfnDb();
MiPfnReferenceCountIsZero((_MMPFN *)P2, (__int64)(P2 - (_QWORD)PfnDb) / 48, v32);
_InterlockedAnd64((volatile signed __int64 *)(P2 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( BYTE1(v43) )
{
MiReturnCommit((_MI_PARTITION *)PointerPte, 1ui64);
v34 = 1i64;
if( PointerPte != (MMPTE *)&MiSystemPartition )
goto LABEL_58;
CurrentPrcb = KeGetCurrentPrcb();
v36 = *((int *)CurrentPrcb + 8391);
if( (_DWORD)v36 == -1 )
goto LABEL_58;
if( (unsigned __int64)(v36 + 1) <= 0x100 )
{
do
{
v37 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v36 + 1, v36);
v26 = (_DWORD)v36 == v37;
LODWORD(v36) = v37;
if( v26 )
goto LABEL_59;
}
while( v37 != -1 && (unsigned __int64)(v37 + 1i64) <= 0x100 );
}
if( (int)v36 > 192
&& (_DWORD)v36 != -1
&& (_DWORD)v36 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v36) )
{
v34 = (int)v36 - 192 + 1i64;
}
if( v34 )
LABEL_58:
_InterlockedExchangeAdd64((volatile signed __int64 *)PointerPte + 896, v34);
LABEL_59:
if( a1a == (volatile INT64 *)&MiSystemPartition )
_InterlockedExchangeAdd64(&qword_140C4ECF8, 0xFFFFFFFFFFFFFFFFui64);
}
MiLockAndDecrementShareCount((UINT64)PfnDb + 48 * Pcsa, 0);
if( a2a )
MiReleasePageFileInfo(
(INT64)PointerPte,
a2a,
1,
v38,
v43,
*((INT64 *)&v43 + 1),
ContainingPageTable,
(INT64)PointerPte,
(INT64)a1a,
a2a,
SpinCount,
(INT64)SecondPage);
if( (a1[184] & 7) == 0 )
_InterlockedExchangeAdd64(
(volatile signed __int64 *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1272i64),
0xFFFFFFFFFFFFFFFFui64);
return 1i64;
}Referenced by:
MiSharePages