MiComparePageHash
NTSTATUS __stdcall MiComparePageHash(_MMPAGING_FILE *PagingFile, UINT64 PageFileOffset, UINT64 PageHashValue){
INT64 *p_SpinLock;
__int64 v4;
NTSTATUS v6;
unsigned int v7;
int v8;
unsigned __int64 v9;
unsigned __int64 v10;
UINT64 v11;
UINT64 v12;
UINT64 v14;
p_SpinLock = (INT64 *)&PagingFile->SpinLock;
v4 = (unsigned int)PageFileOffset;
v6 = 0;
v7 = PageHashValue;
v8 = 0;
v9 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&PagingFile->SpinLock);
v10 = (unsigned __int64)&PagingFile->PageHash[v4];
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64));
v14 = v11;
v12 = v11;
if( (v11 & 1) != 0 && *(_DWORD *)v10 != v7 )
{
MiPteInShadowRange((UINT64)&v14);
if( (*(_BYTE *)(&MmGetPfnDb()[(v12 >> 12) & 0xFFFFFFFFFi64].u3 + 1) & 0x10) != 0 )
{
if( !*(&stru_140C4DB30 + 2704) )
v8 = -1073741761;
}
else
{
*(_DWORD *)v10 = v7;
}
ExReleaseSpinLockExclusiveFromDpcLevel(p_SpinLock);
v6 = v8;
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel(p_SpinLock);
}
__writecr8(v9);
return v6;
}Referenced by:
MiValidatePagefilePageHash