MiInitializeSharedUserData

NTSTATUS __stdcall MiInitializeSharedUserData(){
  unsigned __int64 v0; 
  unsigned __int64 SharedPageVa; 
  _MMPTE *PteBase; 
  INT64 v3; 
  unsigned __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  char *Pool; 
  char *v8; 
  unsigned __int64 i; 
  _XSTATE_CONFIGURATION *v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  INT64 v13; 
  INT64 *v14; 
  char v15; 
  INT64 v16; 
  int v17; 
  _MMPFN *v18; 
  unsigned __int64 v19; 
  __int64 v21[7]; 
  INT64 v22; 

  v21[0] = 0xFFFFF78000000000ui64;
  v0 = 1i64;
  SharedPageVa = (unsigned __int64)HvlGetSharedPageVa();
  v21[1] = SharedPageVa;
  PteBase = MmGetPteBase();
  if( SharedPageVa )
  {
    LODWORD(v3) = MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((SharedPageVa >> 9) & 0x7FFFFFFFF8i64));
    v22 = v3;
    if( (v3 & 1) != 0 )
    {
      LODWORD(v4) = MI_READ_PTE_LOCK_FREE((INT64)&v22);
      if( (MmGetPfnDb()[(v4 >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) != 0 )
      {
        v0 = 2i64;
        v5 = ExGenRandom(ExGenRandomDomainUserVisible) & 0xF;
        v6 = 15i64;
        if( v5 )
          v6 = v5;
        *(&stru_140C4DB30 + 11) = (v6 + 524256) << 12;
      }
    }
  }
  Pool = (char *)MiAllocatePool(274i64, 8 * v0, 0x74536D4Dui64);
  v8 = Pool;
  if( Pool )
  {
    for( i = 0i64; i < v0; ++i )
    {
      v10 = (_XSTATE_CONFIGURATION *)((char *)PteBase + (((unsigned __int64)v21[i] >> 9) & 0x7FFFFFFFF8i64));
      LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)v10);
      v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
      LODWORD(v13) = MiMakeValidPte(v10, v12, 536870913i64);
      v22 = v13;
      v14 = (INT64 *)&v8[8 * i];
      v15 = v13;
      v16 = v13;
      LOBYTE(v17) = MiPteInShadowRange((UINT64)v14);
      if( v17 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
        v16 |= 0x8000000000000000ui64;
      *v14 = v16;
      *((_QWORD *)&stru_140C4DB30 + i + 9) = v14;
      v18 = &MmGetPfnDb()[v12];
      v19 = MiLockPageInline(v18);
      v18->OriginalPte.u.Long = MiSwizzleInvalidPte(128i64);
      v18->u4._bf_0 |= 0x8000000000000000ui64;
      v18->PteLong = (unsigned __int64)v14;
      _InterlockedAnd64(&v18->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v19);
      PteBase = MmGetPteBase();
    }
    LODWORD(Pool) = 1;
  }
  return(int)Pool;
}

Referenced by:

MiInitSystem