MiGetPteFromCopyList
_MMPTE *__stdcall MiGetPteFromCopyList(_MMPTE_COPY_LIST *PteCopyList, UINT64 DestinationPage, UINT64 SourcePage){
int v6;
int v7;
__int64 v8;
int v9;
struct {unsigned __int16 ReferenceCount;} *v10;
_XSTATE_CONFIGURATION *v11;
char v12;
unsigned __int64 v13;
unsigned __int64 v14;
int v15;
char v16;
unsigned __int64 v17;
unsigned __int64 v18;
int v19;
UINT64 v21;
__int64 v22;
_MI_TB_FLUSH_LIST TbFlushList[48];
memset(TbFlushList, 0i64, 0xB8u);
v6 = 2;
v7 = 1;
if( SourcePage == -1i64 )
v6 = 1;
v8 = (unsigned int)*PteCopyList;
if( (int)v8 + v6 > (unsigned int)PteCopyList[1] )
{
v21 = (unsigned int)*PteCopyList;
TbFlushList[2] = 20;
v22 = *((_QWORD *)PteCopyList + 2) << 25;
*(_QWORD *)&TbFlushList[6] = 0i64;
MiInsertTbFlushEntry(TbFlushList, (VOID *)((v22 - ((_QWORD)MmGetPteBase() << 25)) >> 16), v21, 0i64);
MiFlushTbList(TbFlushList);
v8 = 0i64;
}
v9 = 4;
v10 = &MmGetPfnDb()->u3 + 1;
v11 = (_XSTATE_CONFIGURATION *)(*((_QWORD *)PteCopyList + 2) + 8 * v8);
*PteCopyList = v8 + v6;
v12 = LOBYTE(v10[24 * DestinationPage].ReferenceCount) >> 6;
if( v12 )
{
if( v12 == 2 )
v9 = 28;
}
else
{
v9 = 12;
}
LODWORD(v13) = MiMakeValidPte(v11, DestinationPage, v9 | 0xA0000000);
v14 = v13;
LOBYTE(v15) = MiPteInShadowRange((UINT64)v11);
if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
v14 |= 0x8000000000000000ui64;
v11->EnabledFeatures = v14;
if( SourcePage != -1i64 )
{
v16 = LOBYTE(v10[24 * SourcePage].ReferenceCount) >> 6;
if( v16 )
{
if( v16 == 2 )
v7 = 25;
}
else
{
v7 = 9;
}
LODWORD(v17) = MiMakeValidPte(v11, SourcePage, v7 | 0x20000000u);
v18 = v17;
LOBYTE(v19) = MiPteInShadowRange((UINT64)&v11->EnabledVolatileFeatures);
if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v18 & 1) != 0 )
v18 |= 0x8000000000000000ui64;
v11->EnabledVolatileFeatures = v18;
}
return(_MMPTE *)v11;
}Referenced by:
MiAddPagesToEnclave
MiCopyPage
MiCopyPagesIntoEnclave
MiFillPerSessionProtos
MiSwapStackPage