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