MmGetCacheAttributeEx

INT64 __fastcall MmGetCacheAttributeEx(UINT64 a1, INT64 a2, _DWORD *a3){
  ULONG_PTR v5; 
  int v6; 
  RTL_BALANCED_NODE *v7; 
  if( (a2 & 0xFFFFFFFE) != 0 )
    return 3221225712i64;
  v5 = a1 >> 12;
  if( a1 >> 12 <= 0xFFFFFFFFFi64 && ((*((_QWORD *)MmGetPfnDb() + 6 * v5 + 5) >> 50) & 1) != 0 )
  {
    if( !*((_WORD *)MmGetPfnDb() + 24 * v5 + 16) && (struct _KTHREAD *)qword_140C4E448 != KeGetCurrentThread() )
      KeBugCheckEx(0x1Au, 0x1232ui64, v5, *((_BYTE *)MmGetPfnDb() + 48 * v5 + 34) & 7, 0i64);
    v6 = *((unsigned __int8 *)MmGetPfnDb() + 48 * v5 + 34) >> 6;
  }
  else
  {
    if( (a2 & 1) == 0 )
      return 3221225793i64;
    v7 = MiLookupIoPageNode(v5);
    if( v7 )
      v6 = *((unsigned __int16 *)v7[2].Children[0]->Children + (v5 & 0xFFFFFFFFFi64) - v7[1].ParentValue) >> 14;
    else
      v6 = 3;
  }
  switch( v6 )
  {
    case 1:
      *a3 = 1;
      return 0i64;
    case 0:
      *a3 = 0;
      return 0i64;
    case 2:
      *a3 = 2;
      return 0i64;
  }
  return 3221225711i64;
}

Referenced by:

MmGetCacheAttribute