MiCrcStillIntact
__int64 __fastcall MiCrcStillIntact(_QWORD *a1, __int64 a2, unsigned int a3, __int64 a4, int a5){
UINT64 v5;
char *v9;
INT64 v10;
char *v11;
unsigned int v12;
UNICODE_STRING *v13;
UINT8 v14;
WCHAR *v15;
char v17;
int v18;
__int64 v19;
__int64 v20;
int v21;
INT64 v22;
RTL_BALANCED_NODE *Address;
int v24;
INT64 v25;
INT64 v26;
INT64 v27;
UINT64 SpinCount;
INT64 v29;
int result;
__int16 result_4;
int v32;
__int64 v33;
__int64 v34;
v5 = *(_QWORD *)(a4 + 8);
memset((INT64)&result, 0i64);
v9 = (char *)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64);
if( !(unsigned int)MiRecheckVaVm(v10, v5) )
return 0i64;
v29 = MI_READ_PTE_LOCK_FREE((INT64)v9);
if( (v29 & 1) == 0 )
return 0i64;
v11 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v29) >> 12) & 0xFFFFFFFFFi64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v11 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v11 + 3) < 0 );
}
v12 = MiCombineCandidate((_MI_PAGE_COMBINING_SUPPORT *)a1, (_MMPFN *)a3);
v15 = (WCHAR *)v12;
if( !v12 )
{
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
return 0i64;
}
v17 = v11[34];
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( (v17 & 7) != 6 )
return 0i64;
if( v9 != (char *)(*((_QWORD *)v11 + 1) | 0x8000000000000000ui64) )
return 0i64;
LOBYTE(v18) = MI_PFN_IS_PROTO((UNICODE_STRING *)v11, v13, v14, v15);
if( v18 )
return 0i64;
v19 = *((_QWORD *)v11 + 5);
if( (v19 & 0x1000000000i64) != 0 )
return 0i64;
if( (v11[35] & 8) != 0 )
return 0i64;
v20 = v19 & 0xFFFFFFFFFi64;
if( v20 == 0xFFFFFFFFDi64 )
return 0i64;
if( (MiGetWsleContents(v20, v5) & 0xF) == 8 )
return 0i64;
if( *((_WORD *)v11 + 16) != 1 )
return 0i64;
v22 = 0i64;
if( v21 == 1 )
{
Address = MiLocateAddress(v5);
if( !Address || !MiVadSupportsPrivateCommit((INT64)Address) )
return 0i64;
}
if( a5 == 2 )
{
if( (v29 & 0x42) == 0 )
return 0i64;
MiMakeCombineCandidateClean((INT64)v9, v22);
}
else if( a5 == 3 )
{
v24 = MiTbFlushType(a2);
LODWORD(v27) = 0;
result_4 = 0;
v33 = 0i64;
v34 = 0i64;
LODWORD(v26) = dword_140C4E568;
result = v24;
v32 = 20;
if( !(unsigned int)MiClearPteAccessed(v25, (INT64)v11, (UINT64)v9, (INT64)&result, v26, v27) )
return 0i64;
}
return 1i64;
}Referenced by:
MiSharePages