MiGetFileHashPage
UINT64 __fastcall MiGetFileHashPage(__int64 a1, unsigned int a2){
__int64 v2;
unsigned __int64 v3;
UINT64 Page;
UINT64 v6;
_DWORD *v7;
void *v8;
unsigned __int64 v9;
struct _KPRCB *CurrentPrcb;
__int64 v12;
bool v13;
signed __int32 v14;
UINT8 OldIrql;
v2 = *(_QWORD *)(a1 + 248);
v3 = 1i64;
OldIrql = 0;
if( (MiAcquireNonPagedResources((_MI_PARTITION *)v2, 1ui64) & 0x80000000) == 0i64 )
{
Page = MiGetPage((_MI_PARTITION *)v2, a2, 0x200ui64);
v6 = Page;
if( Page == -1i64 )
{
MiReturnCommit((_MI_PARTITION *)v2, 1ui64);
if( (ULONG_PTR *)v2 != &MiSystemPartition )
goto LABEL_21;
CurrentPrcb = KeGetCurrentPrcb();
v12 = *((int *)CurrentPrcb + 8391);
if( (_DWORD)v12 == -1 )
goto LABEL_21;
if( (unsigned __int64)(v12 + 1) <= 0x100 )
{
do
{
v14 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v12 + 1, v12);
v13 = (_DWORD)v12 == v14;
LODWORD(v12) = v14;
if( v13 )
return v6;
}
while( v14 != -1 && (unsigned __int64)(v14 + 1i64) <= 0x100 );
}
if( (int)v12 > 192
&& (_DWORD)v12 != -1
&& (_DWORD)v12 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v12) )
{
v3 = (int)v12 - 192 + 1i64;
}
if( v3 )
LABEL_21:
_InterlockedExchangeAdd64((volatile signed __int64 *)(v2 + 7168), v3);
}
else
{
LODWORD(v7) = MiMapPageInHyperSpaceWorker(Page, &OldIrql, 0x80000000ui64);
v8 = v7;
v9 = 1024i64;
if( ((unsigned __int8)v7 & 4) != 0 )
{
*v7 = 0;
v8 = v7 + 1;
v9 = 1023i64;
}
memset(v8, 0, 8 * (v9 >> 1));
if( (v9 & 1) != 0 )
*((_DWORD *)v8 + v9 - 1) = 0;
MiUnmapPageInHyperSpaceWorker(v7, OldIrql, 0x80000000ui64);
_InterlockedAdd64(&qword_140C4F568, 1ui64);
}
return v6;
}
return -1i64;
}Referenced by:
MiMapPageFileHash