MiWritePageFileHash

void __fastcall MiWritePageFileHash(__int64 a1, __int64 a2, _QWORD *a3, unsigned int a4, unsigned int a5){
  unsigned int v9; 
  char *v10; 
  unsigned int v11; 
  _QWORD *v12; 
  char *v13; 
  int v14; 
  char *v15; 
  __int64 v16; 
  unsigned int v17; 
  int v18; 
  unsigned __int64 v19; 
  _DWORD *v20; 
  int *v21; 
  __int64 v22; 
  int v23; 
  int v24[16]; 
  v9 = 0;
  if( a2 )
  {
    if( (*(_BYTE *)(a2 + 10) & 5) != 0 )
      v10 = *(char **)(a2 + 24);
    else
      v10 = (char *)MmMapLockedPagesSpecifyCache((PMDL)a2, 0, MmCached, 0i64, 0, 0xC0000010);
    if( v10 )
      v10 += 4096 * (((__int64)a3 - a2 - 48) >> 3);
  }
  else
  {
    v10 = 0i64;
  }
  v11 = 0;
  while( 1 )
  {
    v12 = a3;
    v13 = v10;
    if( v11 >= a5 )
      break;
    v24[v9] = 0;
    if( a3 && *a3 != qword_140C4EAA8 )
    {
      v14 = 1;
      v15 = (char *)MmGetPfnDb() + 48 * *a3;
      v16 = (*((_QWORD *)v15 + 2) >> 5) & 0x1Fi64;
      if( (dword_140CFA180 & 1) != 0 || (_DWORD)v16 == 31 )
        goto LABEL_16;
      v17 = (unsigned int)v16 >> 3;
      if( (unsigned int)v16 >> 3 == 3 && ((*((_QWORD *)v15 + 2) >> 5) & 7) != 0 )
        v14 = 0;
      v18 = 0;
      if( v17 != 1 )
        v18 = v14;
      if( v18 == 1 )
LABEL_16:
        v24[v9] = MiComputePageHash((_MMPFN *)v15, v10);
      else
        v24[v9] = 2;
    }
    if( ++v9 == 16 )
      goto LABEL_24;
LABEL_18:
    ++v11;
    v10 = v13 + 4096;
    ++a3;
    if( !v13 )
      v10 = 0i64;
    if( !v12 )
      a3 = 0i64;
  }
  if( v9 )
  {
LABEL_24:
    v19 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 232));
    v20 = (_DWORD *)(*(_QWORD *)(a1 + 216) + 4i64 * a4);
    v21 = v24;
    v22 = v9;
    do
    {
      v23 = *v21++;
      *v20++ = v23;
      --v22;
    }
    while( v22 );
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 232));
    __writecr8(v19);
    a4 += v9;
    v9 = 0;
    goto LABEL_18;
  }
}

Referenced by:

MiMapPageFileHash