MiMakeValidPte
NTSTATUS __stdcall MiMakeValidPte(_XSTATE_CONFIGURATION *a1, INT64 a2, INT64 a3){
int v3;
INT64 v4;
unsigned __int64 PteBase;
INT64 v7;
unsigned __int64 v8;
unsigned int v9;
unsigned int v10;
NTSTATUS result;
_MMPTE *PteLimit;
unsigned __int64 v13;
int v14;
int v15;
unsigned __int64 v16;
v3 = a3;
v4 = a3 & 0x1F;
PteBase = (unsigned __int64)MmGetPteBase();
v7 = (a2 & 0xFFFFFFFFFi64) << 12;
v8 = v7 | MmProtectToPteMask[v4] & 0xFFFF000000000E7Fui64 | 0x21;
if( (unsigned __int64)a1 < PteBase )
goto LABEL_2;
PteLimit = MmGetPteLimit();
if( a1 > (_XSTATE_CONFIGURATION *)PteLimit )
goto LABEL_2;
v13 = (__int64)(((_QWORD)a1 << 25) - (PteBase << 25)) >> 16;
if( a1 >= (_XSTATE_CONFIGURATION *)MmGetPdeBase() && a1 <= (_XSTATE_CONFIGURATION *)MmGetPdeLimit() )
{
if( a1 == (_XSTATE_CONFIGURATION *)MmGetPxeSelfRef() )
{
v8 = v7 | MmProtectToPteMask[v4] & 0xFFFF000000000E7Fui64 | 0x8000000000000021ui64;
}
else if( (a3 & 0x4000000) == 0 )
{
v8 = v7 & 0x7FFFFFFFFFFFFFFFi64 | MmProtectToPteMask[v4] & 0x7FFF000000000E7Fi64 | 0x21;
}
if( MiUserPdeOrAbove((UINT64)a1) )
LODWORD(v8) = v8 | 4;
}
v14 = v8;
LODWORD(v8) = v8 | 4;
if( (unsigned __int64)a1 > PteBase + 0x3FFFFFFF78i64 )
LODWORD(v8) = v14;
if( (v3 & 0x4000000) != 0 )
{
LODWORD(v16) = MiGetLeafVa((__int64)(((_QWORD)a1 << 25) - (PteBase << 25)) >> 16);
v13 = v16;
}
if( v13 < 0xFFFF800000000000ui64 )
{
v15 = *(&stru_140C4DB30 + 537);
goto LABEL_25;
}
if( *((_BYTE *)&stru_140C4DB30 + ((v13 >> 39) & 0x1FF) + 6872) != 1
&& (v13 < PteBase || v13 > (unsigned __int64)PteLimit) )
{
if( v13 < *(&stru_140C4DB30 + 937) || v13 > *(&stru_140C4DB30 + 175) )
v15 = *(&stru_140C4DB30 + 536);
else
v15 = *(&stru_140C4DB30 + 537);
LABEL_25:
if( !v15 )
goto LABEL_3;
LABEL_2:
LODWORD(v8) = v8 | 0x100;
}
LABEL_3:
v9 = v8 | 0x42;
if( v3 >= 0 || (v4 & 5) != 4 )
v9 = v8;
if( (v3 & 0x40000000) != 0 )
v9 &= ~4u;
if( (v3 & 0x20000000) != 0 )
v9 ^= ((unsigned __int16)v9 ^ (unsigned __int16)(*(&stru_140C4DB30 + 536) << 8)) & 0x100;
v10 = v9 & 0xFFFFFEFF;
if( (v3 & 0x8000000) == 0 )
v10 = v9;
result = v10 | 0x80;
if( (v3 & 0x4000000) == 0 )
return v10;
return result;
}Referenced by:
MiAddPagesToEnclave
MiAllocateKernelStackPages
MiAllocateTopLevelPage
MiAssignNonPagedPoolPte
MiBuildForkPageTable
MiBuildReservationCluster
MiCaptureSparsePages
MiCompleteRestrictedImageFault
MiCopyDataPageToImagePage
MiCopyPagesIntoEnclave
MiCopySinglePage
MiCopyToUserVa
MiCreateHardwareEnclave
MiCreateSharedZeroPages
MiDecommitHardwareEnclavePages
MiDecrementAndInsertStandbyPages
MiDeletePteRun
MiDemoteValidLargePageOneLevel
MiEnableLargeSubsection
MiFillGapPtes
MiFillPageWithImageExtentContents
MiFillPhysicalPages
MiFillSystemPtes
MiFinishLastForkPageTable
MiGetPageChain
MiGetPteFromCopyList
MiGetUltraMapping
MiHugePageOperation
MiInitializeDummyPages
MiInitializeDynamicBitmap
MiInitializeEnclaveMetadataPage
MiInitializeGapFrames
MiInitializeNewUltraHugeContext
MiInitializeProtoPfn
MiInitializeShadowPageTable
MiInitializeSharedUserData
MiInitializeSlowPte
MiInitializeSystemPageTable
MiInitializeTbFlush
MiInitializeUnusablePfns
MiInsertLargeUserMapping
MiInsertLargeVadMapping
MiInsertPhysicalPteMapping
MiLinkPoolCommitChain
MiMakeLargePageTable
MiMakeOutswappedPageResident
MiMakeSystemCachePteValid
MiMakeTransitionPteValid
MiMapArbitraryPage
MiMapBBTMemory
MiMapDummyPages
MiMapFrame
MiMapMdlCommon
MiMapMemoryDumpMdl
MiMapNewSession
MiMapPageFileHash
MiMapPageInHyperSpaceWorker
MiMapRetpolineStubs
MiMapSinglePage
MiMapWithLargePages
MiPrivateFixup
MiProtectAweRegion
MiProtectEnclavePages
MiProtectLargeKernelHalRange
MiReadyStandbyPageForActive
MiRelocateImagePfn
MiReplacePfnWithGapMapping
MiResolveProtoCombine
MiScrubNodeLargePageList
MiScrubPage
MiSetProtectionOnTransitionPte
MiSetSystemCodeProtection
MiTimeSingleLargePageZeroWorker
MiUnlinkStandbyPfn
MiUnmapMdlCommon
MiUpdateImagePfnImportRelocations
MiUpdateLargePageSectionPfns
MiValidateImagePfn
MiWriteAwePtes
MiWsleFree
MiZeroLargePage
MiZeroPhysicalPage
MiZeroWithSystemPtes
MiZeroWithUltraSpace
MmAllocateIndependentPagesEx
MmAllocateNonCachedMemory
MmChangeKernelCfgBitmap
MmCheckCachedPageStates
MmCreateProcessAddressSpace
MmMapHotPatchTablePage
MmProtectMdlSystemAddress
MmProtectPool
MmReadProcessPageTables
MmSetPageProtection
MxCopyPage
MxMapVa
MxSwapPages