MiMapImageForEnclaveUse
NTSTATUS __stdcall MiMapImageForEnclaveUse(VOID *a1, INT64 a2, _KPROCESSOR_MODE a3, INT64 *a4, INT64 *a5){
NTSTATUS result;
_ADAPTER_OBJECT *v8;
_CONTROL_AREA *v9;
_CONTROL_AREA *v10;
int v11;
_FILE_OBJECT *v12;
PVOID *Object;
UINT64 v14;
UINT64 Win32Protect;
PVOID SectionToMap;
_LARGE_INTEGER SectionOffset;
_KAPC_STATE ApcState;
SectionToMap = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
result = ObReferenceObjectByHandle(a1, 4ui64, MmSectionObjectType, a3, &SectionToMap, 0i64);
if( result >= 0 )
{
v8 = (_ADAPTER_OBJECT *)SectionToMap;
v9 = MiSectionControlArea((_SECTION *)SectionToMap);
v10 = v9;
if( ((__int64)v8->AdapterObject.ContiguousTranslationEnd.Buffer & 0x20) != 0 )
{
if( (v9->u2.WritableUserReferences & 0xC0000) != 0 )
goto LABEL_9;
if( (v9->u2.SeImageStub->SecurityContext.Value & 0xFFFFFFFFFFFFFFF8ui64) <= 8 )
{
LODWORD(Object) = 0x40000000;
v12 = MiReferenceControlAreaFile(v9);
v11 = MiValidateSectionCreate(v12, v10, 0xFFFFFFFFui64, (VOID *)a2, (UINT64)Object, 4u);
MiDereferenceControlAreaFile(v10, v12);
if( v11 < 0 )
goto LABEL_10;
if( (v10->u2.WritableUserReferences & 0xC0000) != 0 )
{
LABEL_9:
KiStackAttachProcess(PsSecureSystemProcess, 0i64, &ApcState);
SectionOffset.QuadPart = 0i64;
SectionToMap = 0i64;
LODWORD(Win32Protect) = 2;
LODWORD(v14) = 0;
v11 = MmMapViewOfSection(
v8,
(_EPROCESS *)PsSecureSystemProcess,
(VOID **)a4,
0i64,
0i64,
&SectionOffset,
(UINT64 *)&SectionToMap,
ViewShare,
v14,
Win32Protect);
KiUnstackDetachProcess(&ApcState, 0i64);
*a5 = (INT64)v10;
goto LABEL_10;
}
}
v11 = -1073740760;
}
else
{
v11 = -1073741751;
}
LABEL_10:
HalPutDmaAdapter(v8);
return v11;
}
return result;
}Referenced by:
MiInitializeVsmEnclave
MiLoadSectionIntoVsmEnclave