MiCrcStillIntact
NTSTATUS __stdcall MiCrcStillIntact(
_MI_PAGE_COMBINING_SUPPORT *Pcs,
_MMSUPPORT_INSTANCE *Vm,
_MI_PAGE_CRCS *PfnCrc,
_MI_COMBINE_DEFER_TYPE DeferType){
UINT64 v4;
unsigned int v5;
_MMPTE *v8;
_MMSUPPORT_INSTANCE *v9;
INT64 v10;
unsigned __int64 v11;
_MMPFN *v12;
_MI_COMBINE_CANDIDATE v13;
_UNICODE_STRING *v14;
UINT8 v15;
wchar_t *v16;
char v18;
int v19;
__int64 bf_0;
__int64 v21;
int v22;
_MMVAD *v23;
_MMVAD *Address;
int v25;
_KTBFLUSH_TYPE v26;
_MMSUPPORT_INSTANCE *v27;
_MI_TB_FLUSH_LIST *TbFlushList;
UINT64 v29;
UINT64 SpinCount;
INT64 v31;
_MMWSLE Wsle[48];
int v33;
v4 = *(_QWORD *)(*(_QWORD *)&DeferType + 8i64);
v5 = (unsigned int)PfnCrc;
memset(Wsle, 0i64, 0xB8u);
v8 = (_MMPTE *)((char *)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64));
if( !MiRecheckVaVm(v9, (VOID *)v4) )
return 0;
LODWORD(v10) = MI_READ_PTE_LOCK_FREE((INT64)v8);
v31 = v10;
if( (v10 & 1) == 0 )
return 0;
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)&v31);
v12 = &MmGetPfnDb()[(v11 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v12->u2._bf_0 < 0 );
}
v13 = MiCombineCandidate(Pcs, (_MMPFN *)v5);
v16 = (wchar_t *)(unsigned int)v13;
if( v13 == MiCombineNone )
{
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return 0;
}
v18 = *((_BYTE *)&v12->u3 + 2);
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (v18 & 7) != 6 )
return 0;
if( v8 != (_MMPTE *)(v12->PteLong | 0x8000000000000000ui64) )
return 0;
LOBYTE(v19) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v12, v14, v15, v16);
if( v19 )
return 0;
bf_0 = v12->u4._bf_0;
if( (bf_0 & 0x1000000000i64) != 0 )
return 0;
if( (*((_BYTE *)&v12->u3 + 3) & 8) != 0 )
return 0;
v21 = bf_0 & 0xFFFFFFFFFi64;
if( v21 == 0xFFFFFFFFDi64 )
return 0;
if( (MiGetWsleContents(v21, v4) & 0xF) == 8 )
return 0;
if( v12->u3.ReferenceCount != 1 )
return 0;
v23 = 0i64;
if( v22 == 1 )
{
Address = MiLocateAddress((VOID *)v4);
if( !Address )
return 0;
LOBYTE(v25) = MiVadSupportsPrivateCommit((INT64)Address);
if( !v25 )
return 0;
}
if( v33 == 2 )
{
if( (v31 & 0x42) == 0 )
return 0;
MiMakeCombineCandidateClean(v8, v23);
}
else if( v33 == 3 )
{
v26 = MiTbFlushType(Vm);
LODWORD(v29) = 0;
LOWORD(Wsle[1]) = 0;
*(_QWORD *)&Wsle[4] = 0i64;
*(_QWORD *)&Wsle[6] = 0i64;
LODWORD(TbFlushList) = *(&stru_140C4DB30 + 654);
Wsle[0] = v26;
Wsle[2] = 20;
if( !MiClearPteAccessed(v27, v12, v8, Wsle, TbFlushList, v29) )
return 0;
}
return 1;
}Referenced by:
MiSharePages