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