MiLoadDataIntoVsmEnclave
NTSTATUS __stdcall MiLoadDataIntoVsmEnclave(
INT64 a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 StartingAddress,
INT64 a6,
INT64 a7,
PVOID Base,
INT64 a9,
INT64 Protect,
INT64 a11){
INT64 v12;
NTSTATUS result;
unsigned int v14;
unsigned int ProtectionMask;
__int64 v16;
__int64 v17;
NTSTATUS VsmEnclaveData;
UINT64 v19;
_WORD *Pool;
_KPROCESSOR_MODE v21;
unsigned int *v22;
INT64 v23;
INT64 v24;
UINT64 *ChangeProtection;
INT64 v26;
INT64 v27;
INT64 v28;
INT64 v29;
_QWORD *v30;
PVOID Process;
_WORD *v32;
INT64 v33;
INT64 v34;
INT64 v35;
INT64 v36;
_KAPC_STATE ApcState;
LOBYTE(v27) = a4;
Process = (PVOID)a2;
v33 = a3;
v34 = StartingAddress;
v29 = a7;
v35 = a7;
v30 = (_QWORD *)a11;
WORD2(v27) = 0;
LODWORD(v28) = 0;
memset(&ApcState, 0, sizeof(ApcState));
v12 = 0i64;
*(_QWORD *)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
&& (KeGetCurrentThread()->ApcState.Process->MitigationFlags & 0x100) != 0
&& (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[8] & 0x40000) == 0 )
{
return -1073740284;
}
v36 = StartingAddress + 4095;
LODWORD(v17) = MiCountCommittedPages(
(PVOID)StartingAddress,
(PVOID)(StartingAddress + 4095),
(_MMVAD_SHORT *)a3,
v16 + 1664);
if( v17 )
return -1073741791;
LOBYTE(v26) = 0;
LODWORD(ChangeProtection) = 0;
result = MiCommitExistingVad(
(_MMVAD_SHORT *)a3,
(VOID *)StartingAddress,
0x1000ui64,
(unsigned int)Protect,
ChangeProtection,
0i64,
v26,
0i64,
(INT64)&v28,
(INT64)&v27 + 4,
v27,
v28);
VsmEnclaveData = result;
if( result >= 0 )
{
if( Base )
{
LODWORD(v19) = MmSizeOfMdl(Base, 4096);
Pool = MiAllocatePool(64i64, v19, 0x6C646D4Dui64);
v12 = (INT64)Pool;
v32 = Pool;
if( !Pool )
{
VsmEnclaveData = -1073741670;
LABEL_37:
MiDecommitRegion((_MMVAD_SHORT *)a3, (VOID *)StartingAddress, (VOID *)(StartingAddress + 4095));
LABEL_38:
if( v12 )
{
if( (*(_BYTE *)(v12 + 10) & 2) != 0 )
MmUnlockPages(v12, v23, v24);
ExFreePoolWithTag((PVOID)v12, 0);
}
return VsmEnclaveData;
}
*(_QWORD *)Pool = 0i64;
Pool[4] = 8 * (((unsigned __int16)(((unsigned __int16)Base & 0xFFF) + 0x1FFF) >> 12) + 6);
Pool[5] = 0;
*((_QWORD *)Pool + 4) = (unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64;
*((_DWORD *)Pool + 11) = (unsigned __int16)Base & 0xFFF;
*((_DWORD *)Pool + 10) = 4096;
KiStackAttachProcess(Process, 0i64, &ApcState);
LOBYTE(v21) = v27;
if( (_BYTE)v27 == 1 && ((unsigned __int64)Base + 4096 > 0x7FFFFFFF0000i64 || (char *)Base + 4096 < Base) )
MEMORY[0x7FFFFFFF0000] = 0;
MmProbeAndLockPages((PMDL)v12, v21, IoReadAccess);
v22 = (unsigned int *)v29;
KiUnstackDetachProcess(&ApcState, 0i64);
if( VsmEnclaveData < 0 )
goto LABEL_37;
}
else
{
v22 = (unsigned int *)v29;
}
VsmEnclaveData = PsLoadVsmEnclaveData(*(_EX_PUSH_LOCK **)(a3 + 72), StartingAddress, *v22, Protect, v12);
if( VsmEnclaveData >= 0 )
*v30 = 4096i64;
if( VsmEnclaveData >= 0 )
goto LABEL_38;
goto LABEL_37;
}
return result;
}Referenced by:
NtLoadEnclaveData