KeAddEnclavePage
NTSTATUS __stdcall KeAddEnclavePage(
PVOID EnclaveControlAddress,
PVOID SourceAddress,
PVOID DestinationAddress,
PVOID EnclaveAddress,
UINT64 PageType,
UINT64 *ReturnedError){
_DWORD *v6;
ULONG_PTR v11;
unsigned int v12;
int v13;
int v14;
int v15;
int v17;
bool v18;
int v19;
v6 = (_DWORD *)((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64);
memset(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 64, 0i64);
v11 = KeFeatureBits;
*(_DWORD *)ReturnedError = 0;
if( (v11 & 0x10000000000i64) == 0 )
return -1073741637;
if( (PageType & 0x40) != 0 )
{
if( (KeFeatureBits & 0x80000000000i64) == 0 )
return -1073741800;
v12 = 13;
if( (PageType & 0xF) != 3 )
return -1073741755;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x28) = 0i64;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x30) = 0i64;
}
else
{
v12 = 1;
v13 = PageType & 1 | 2;
if( (PageType & 2) == 0 )
v13 = PageType & 1;
v14 = v13 | 4;
if( (PageType & 4) == 0 )
v14 = v13;
if( (PageType & 8) != 0 )
v15 = v14 | 0x100;
else
v15 = v14 | 0x200;
*(_DWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x40) = v15;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x28) = SourceAddress;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x30) = ((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64)
+ 64;
}
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x20) = EnclaveAddress;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x38) = EnclaveControlAddress;
KiEncls(v12);
if( (PageType & 0x50) == 0 )
{
v17 = 4096;
*v6 = 4096;
do
{
KiEncls(6ui64);
DestinationAddress = (char *)DestinationAddress + 256;
*(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 8) = DestinationAddress;
v18 = v17 == 256;
v17 -= 256;
*v6 = v17;
}
while( !v18 );
}
return 0;
}Referenced by:
MiAddPagesToEnclave
MiCopyPagesIntoEnclave