MiLoadDataIntoVsmEnclave
NTSTATUS __fastcall MiLoadDataIntoVsmEnclave(
INT64 a1,
INT64 a2,
INT64 *a3,
INT64 a4,
UINT64 StartingAddress,
INT64 a6,
UINT64 *a7,
VOID *Base,
INT64 a9,
UINT64 Protect,
_QWORD *a11){
INT64 v12;
NTSTATUS result;
unsigned int v14;
unsigned int ProtectionMask;
__int64 v16;
NTSTATUS VsmEnclaveData;
INT64 v18;
UINT64 *v19;
UINT64 *a5;
CHAR AccessMode;
_KAPC_STATE ApcState;
AccessMode = a4;
memset(&ApcState, 0, sizeof(ApcState));
v12 = 0i64;
*a11 = 0i64;
if( a9 != 4096 )
return -1073741582;
if( (_DWORD)a6 != 4 )
return -1073741820;
v14 = *(_DWORD *)a7;
if( !*(_DWORD *)a7 )
return -1073741811;
if( v14 > 2 )
{
if( v14 == 3 )
goto LABEL_10;
if( v14 != 4 )
{
if( v14 == 5 )
{
LABEL_10:
if( Base )
return -1073741583;
goto LABEL_14;
}
return -1073741811;
}
}
if( !Base )
return -1073741819;
LABEL_14:
ProtectionMask = MiMakeProtectionMask(Protect & 0x5FFFFFFF);
if( (ProtectionMask & 7) == 0 || ProtectionMask > 7 || (ProtectionMask & 5) == 5 )
return -1073741755;
if( (ProtectionMask & 2) != 0
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2512i64) & 0x100) != 0
&& (*((_DWORD *)KeGetCurrentThread() + 324) & 0x40000) == 0 )
{
return -1073740284;
}
if( MiCountCommittedPages(StartingAddress, StartingAddress + 4095, (__int64)a3, v16 + 1664) )
return -1073741791;
LODWORD(a5) = 0;
result = MiCommitExistingVad((_MMVAD_SHORT *)a3, (PVOID)StartingAddress, 0x1000ui64, (unsigned int)Protect, a5);
VsmEnclaveData = result;
if( result >= 0 )
{
if( Base )
{
MmSizeOfMdl(Base, 0x1000ui64);
LODWORD(v18) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v12 = v18;
if( !v18 )
{
VsmEnclaveData = -1073741670;
LABEL_37:
MiDecommitRegion((_MMVAD_SHORT *)a3, (PVOID)StartingAddress, (PVOID)(StartingAddress + 4095));
LABEL_38:
if( v12 )
{
if( (*(_BYTE *)(v12 + 10) & 2) != 0 )
MmUnlockPages((_MDL *)v12);
ExFreePoolWithTag((PVOID)v12, 0);
}
return VsmEnclaveData;
}
*(_QWORD *)v18 = 0i64;
*(_WORD *)(v18 + 8) = 8 * (((unsigned __int16)(((unsigned __int16)Base & 0xFFF) + 0x1FFF) >> 12) + 6);
*(_WORD *)(v18 + 10) = 0;
*(_QWORD *)(v18 + 32) = (unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64;
*(_DWORD *)(v18 + 44) = (unsigned __int16)Base & 0xFFF;
*(_DWORD *)(v18 + 40) = 4096;
KiStackAttachProcess((_KPROCESS *)a2, 0i64, &ApcState);
if( AccessMode == 1 && ((unsigned __int64)Base + 4096 > 0x7FFFFFFF0000i64 || (char *)Base + 4096 < Base) )
MEMORY[0x7FFFFFFF0000] = 0;
MmProbeAndLockPages((_MDL *)v12, AccessMode, IoReadAccess);
v19 = a7;
KiUnstackDetachProcess(&ApcState, 0i64);
if( VsmEnclaveData < 0 )
goto LABEL_37;
}
else
{
v19 = a7;
}
VsmEnclaveData = PsLoadVsmEnclaveData(a3[9], StartingAddress, *(unsigned int *)v19, (unsigned int)Protect, v12);
if( VsmEnclaveData >= 0 )
*a11 = 4096i64;
if( VsmEnclaveData >= 0 )
goto LABEL_38;
goto LABEL_37;
}
return result;
}Referenced by:
NtLoadEnclaveData