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