MiLoadSectionIntoVsmEnclave
__int64 __fastcall MiLoadSectionIntoVsmEnclave(
__int64 a1,
__int64 a2,
char a3,
INT64 a4,
char *StartingAddress,
unsigned int Length,
VOID **Base,
_MDL *MemoryDescriptorList,
_QWORD *a9){
VOID **MappedSystemVa;
VOID **v11;
unsigned int v12;
_DWORD *v13;
_MDL *v14;
NTSTATUS EnclaveModule;
char *v16;
INT64 v17;
INT64 v18;
UINT64 v20;
_MDL *Pool;
_KPROCESSOR_MODE v22;
_CONTROL_AREA *v23;
char *v24;
__int64 v25;
_CONTROL_AREA *v26;
__int64 v27;
_CONTROL_AREA *v28;
_QWORD *v29;
UINT64 BugCheckOnFailure;
UINT64 *BugCheckOnFailurea;
UINT64 Priority;
UINT64 Prioritya;
INT64 v34;
INT64 v35;
INT64 v36;
_CONTROL_AREA *v37;
VOID *BaseAddress;
__int64 v39;
_ETHREAD *Thread;
__int64 v41;
__int64 v42;
char *v44;
MappedSystemVa = Base;
v11 = Base;
WORD2(v35) = 0;
v37 = 0i64;
HIDWORD(v36) = 0;
LOBYTE(v35) = 0;
v42 = *(_QWORD *)(a2 + 72);
Thread = (_ETHREAD *)KeGetCurrentThread();
MiUnlockVad(Thread, (_MMVAD_SHORT *)a2);
v12 = 0;
v13 = 0i64;
BaseAddress = 0i64;
v14 = MemoryDescriptorList;
if( Length < 0x10 )
{
EnclaveModule = -1073741820;
LABEL_3:
v16 = 0i64;
goto LABEL_4;
}
if( MemoryDescriptorList )
{
if( (MemoryDescriptorList->MdlFlags & 5) != 0 )
{
MappedSystemVa = (VOID **)MemoryDescriptorList->MappedSystemVa;
}
else
{
LODWORD(Priority) = 1073741840;
LODWORD(BugCheckOnFailure) = 0;
MappedSystemVa = (VOID **)MmMapLockedPagesSpecifyCache(
MemoryDescriptorList,
0,
MmCached,
0i64,
BugCheckOnFailure,
Priority);
}
if( !MappedSystemVa )
goto LABEL_19;
}
else
{
Base = 0i64;
v41 = Length;
LODWORD(v20) = MmSizeOfMdl(v11, Length);
Pool = (_MDL *)MiAllocatePool(64i64, v20, 0x6C646D4Dui64);
v14 = Pool;
if( !v11 )
{
LABEL_19:
EnclaveModule = -1073741670;
goto LABEL_3;
}
Pool->Next = 0i64;
Pool->Size = 8 * ((((unsigned __int64)((unsigned __int16)MappedSystemVa & 0xFFF) + v41 + 4095) >> 12) + 6);
Pool->MdlFlags = 0;
Pool->StartVa = (void *)((unsigned __int64)v11 & 0xFFFFFFFFFFFFF000ui64);
Pool->ByteOffset = (unsigned __int16)MappedSystemVa & 0xFFF;
Pool->ByteCount = Length;
MmProbeAndLockPages(Pool, 0, IoReadAccess);
}
v13 = MiAllocatePool(256i64, 0x30ui64, 0x4D456D4Dui64);
if( !v13 )
goto LABEL_19;
LOBYTE(v22) = a3;
EnclaveModule = MiMapImageForEnclaveUse(*MappedSystemVa, a4, v22, (INT64 *)&BaseAddress, (INT64 *)&v37);
if( EnclaveModule < 0 )
goto LABEL_3;
v23 = v37;
v24 = &StartingAddress[4096 * (unsigned __int64)v37->Segment->TotalNumberOfPtes - 1];
v44 = v24;
MiLockVad(Thread, (_MMVAD_SHORT *)a2);
v12 = 1;
if( MiVadDeleted((_MMVAD_SHORT *)a2)
|| (LODWORD(v25) = MiCountCommittedPages(StartingAddress, v24, (_MMVAD_SHORT *)a2, a1 + 1664), v25) )
{
EnclaveModule = -1073741800;
}
else
{
v12 = 3;
v26 = v23 + 1;
v27 = *(_QWORD *)v26->gap8 << 9;
v39 = v27;
while( 1 )
{
LOBYTE(v34) = 0;
LODWORD(BugCheckOnFailurea) = 0;
EnclaveModule = MiCommitExistingVad(
(_MMVAD_SHORT *)a2,
&StartingAddress[((*(_QWORD *)v26->gap8 << 9) - v27) & 0xFFFFFFFFFFFFF000ui64],
(unsigned __int64)HIDWORD(v26->NumberOfMappedViews) << 12,
4ui64,
BugCheckOnFailurea,
0i64,
v34,
0i64,
(INT64)&v36 + 4,
(INT64)&v35 + 4,
v35,
v36);
if( EnclaveModule < 0 )
break;
v26 = *(_CONTROL_AREA **)&v26->gap8[8];
v27 = v39;
if( !v26 )
{
LODWORD(Prioritya) = -1;
LODWORD(BugCheckOnFailurea) = 0;
v28 = v37;
MiPrefetchControlArea(v37, RtlpInterceptorRoutines, 0i64, 1ui64, (UINT64)BugCheckOnFailurea, Prioritya);
EnclaveModule = VslLoadEnclaveModule(
*(_QWORD *)(v42 + 24),
(__int64)StartingAddress,
v28->u2.SeImageStub->StrongImageReference,
(__int64)BaseAddress,
(INT64)v14,
(__int64)&v35,
(__int64)(v13 + 9),
(__int64)(v13 + 10));
if( EnclaveModule >= 0 )
{
v12 = 1;
if( (_BYTE)v35 )
{
v13[8] = 2;
*((_QWORD *)v13 + 2) = StartingAddress;
v29 = *(_QWORD **)(a2 + 88);
if( *v29 != a2 + 80 )
__fastfail(3u);
*(_QWORD *)v13 = a2 + 80;
*((_QWORD *)v13 + 1) = v29;
*v29 = v13;
*(_QWORD *)(a2 + 88) = v13;
*a9 = v13;
v13 = 0i64;
}
}
break;
}
}
}
v16 = v44;
LABEL_4:
if( (v12 & 1) == 0 )
MiLockVad(Thread, (_MMVAD_SHORT *)a2);
MiUnlockAndDereferenceVad((_MMVAD_SHORT *)a2);
if( BaseAddress )
{
MiUnmapImageForEnclaveUse(BaseAddress);
if( v12 >= 2 )
MiDecommitRegion((_MMVAD_SHORT *)a2, StartingAddress, v16);
}
if( v13 )
ExFreePoolWithTag(v13, 0);
if( v14 && !Base )
{
if( (v14->MdlFlags & 2) != 0 )
MmUnlockPages((INT64)v14, v17, v18);
ExFreePoolWithTag(v14, 0);
}
return(unsigned int)EnclaveModule;
}Referenced by:
NtLoadEnclaveData