MiComputePageHash

NTSTATUS __stdcall MiComputePageHash(_MMPFN *Pfn1, VOID *MappingVa){
  _QWORD *v2; 
  _QWORD *v3; 
  unsigned __int8 CurrentIrql; 
  unsigned int PagingFileOffset; 
  __int64 v7; 
  _QWORD *v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  NTSTATUS result; 

  v2 = 0i64;
  v3 = MappingVa;
  if( MappingVa )
  {
    CurrentIrql = 17;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v2 = MiMapPageInHyperSpaceWorker(Pfn1 - MmGetPfnDb(), 0i64, 0i64);
    v3 = v2;
  }
  PagingFileOffset = MiGetPagingFileOffset(&Pfn1->OriginalPte);
  v7 = v3[1];
  v8 = v3 + 2;
  v9 = v3[2];
  v10 = v3[3];
  v11 = *v3 + PagingFileOffset;
  do
  {
    v8 += 4;
    v7 += *(v8 - 1);
    v11 += *(v8 - 2);
    v9 += *v8;
    v10 += v8[1];
  }
  while( v8 - 2 != v3 + 508 );
  v12 = v7 + v10 + v9 + v11;
  if( v2 )
  {
    MiUnmapPageInHyperSpaceWorker(v2, 0x11u, 0i64);
    __writecr8(CurrentIrql);
  }
  result = v12 + HIDWORD(v12);
  if( (unsigned int)(v12 + HIDWORD(v12)) < 3 )
    return 3;
  return result;
}

Referenced by:

MiValidatePagefilePageHash
MiWritePageFileHash