MiValidatePagefilePageHash
__int64 __fastcall MiValidatePagefilePageHash(__int64 a1){
__int64 v1;
__int64 v2;
__int64 *v3;
unsigned __int64 v4;
unsigned __int64 v5;
char *v6;
unsigned __int64 v7;
__int64 v8;
char *v9;
_MMPFN *PfnDb;
char *v11;
unsigned __int64 v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
ULONG_PTR v16;
unsigned int PagingFileOffset;
ULONG_PTR v18;
__int64 v20;
ULONG_PTR BugCheckParameter4;
int v22;
char *v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned int v27;
ULONG_PTR v28[8];
v1 = a1 + 272;
if( *(_QWORD *)(a1 + 256) )
v1 = *(_QWORD *)(a1 + 256);
v2 = 0i64;
v27 = 0;
v25 = 0i64;
v3 = (__int64 *)(v1 + 48);
v4 = 8
* (((unsigned __int64)((*(_DWORD *)(v1 + 32) + *(_DWORD *)(v1 + 44)) & 0xFFF) + *(_QWORD *)(a1 + 88) + 4095i64) >> 12);
v5 = v4 + v1 + 48;
v24 = v4;
v26 = v5;
if( (*(_BYTE *)(v1 + 10) & 5) != 0 )
v6 = *(char **)(v1 + 24);
else
v6 = (char *)MmMapLockedPagesSpecifyCache((PMDL)v1, 0, MmCached, 0i64, 0, 0xC0000010);
if( (unsigned __int64)v3 < v5 )
{
v7 = v5;
while( 1 )
{
v8 = *v3;
v9 = v6;
v23 = v6;
PfnDb = MmGetPfnDb();
v11 = (char *)PfnDb + 48 * *v3;
if( v11 != (char *)qword_140C4EAB0 )
break;
LABEL_23:
v4 -= 8i64;
v6 = v9 + 4096;
v2 = (unsigned int)(v2 + 1);
v24 = v4;
++v3;
if( !v9 )
v6 = 0i64;
if( (unsigned __int64)v3 >= v7 )
return 0i64;
}
v12 = (unsigned __int8)MiLockPageInline((INT64)PfnDb + 48 * v8);
if( (*((_QWORD *)v11 + 3) & 0x4000000000000000i64) != 0 )
{
LABEL_20:
if( (_BYTE)v12 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
}
v7 = v26;
goto LABEL_23;
}
v13 = (*((_DWORD *)v11 + 4) >> 5) & 0x1F;
if( (dword_140CFA180 & 1) == 0
&& v13 != 31
&& (v13 >> 3 == 3 && ((*((_DWORD *)v11 + 4) >> 5) & 7) != 0 || v13 >> 3 == 1) )
{
v9 = v6;
goto LABEL_20;
}
v14 = MiComputePageHash((_MMPFN *)v11, v6);
v15 = v25;
v16 = v14;
if( !v25 )
{
v15 = *(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v11 + 5) >> 39) & 0x3FFi64))
+ 8i64 * ((unsigned __int8)HIBYTE(*((_WORD *)v11 + 8)) >> 4)
+ 6944);
v25 = v15;
}
PagingFileOffset = MiGetPagingFileOffset((MMPTE *)(v11 + 16));
v18 = PagingFileOffset;
if( !PagingFileOffset )
{
v25 = 0i64;
LABEL_19:
v4 = v24;
v9 = v23;
goto LABEL_20;
}
if( (unsigned int)v2 >= v27 )
{
v20 = v24 >> 3;
if( (unsigned int)(v24 >> 3) > 0x10 )
LODWORD(v20) = 16;
v27 = v20;
MiObtainPagefileHashes(v15, v18, v20, v28);
v2 = 0i64;
}
BugCheckParameter4 = *((unsigned int *)v28 + v2);
if( (_DWORD)v16 == (_DWORD)BugCheckParameter4
|| (*((_QWORD *)v11 + 3) & 0x4000000000000000i64) != 0
|| (_DWORD)BugCheckParameter4 == 2 )
{
goto LABEL_19;
}
if( (_DWORD)BugCheckParameter4 )
{
if( byte_140C4E5C0 == 1 )
goto LABEL_19;
v22 = -1073741761;
}
else
{
v22 = MiComparePageHash(v25, v18, v16);
}
if( v22 < 0 )
{
++dword_140C4E508;
qword_140C4E4B0 = v8;
KeBugCheckEx(0x1Au, 0x3Fui64, v18, v16, BugCheckParameter4);
}
goto LABEL_19;
}
return 0i64;
}Referenced by:
MiMakeOutswappedPageResident
MiWaitForInPageComplete