MiInitializeVsmEnclave
INT64 __stdcall MiInitializeVsmEnclave(_EPROCESS *Process){
__int64 v1;
__int64 v2;
unsigned int v3;
INT64 v4;
unsigned int v5;
__int64 v6;
__int64 v7;
INT64 v9;
_ETHREAD *CurrentThread;
int v11;
VOID *v12;
struct _DMA_ADAPTER *v13;
INT64 v15[2];
INT64 a5;
v4 = *(_QWORD *)(v1 + 72);
v15[0] = 0i64;
v5 = v3;
a5 = 0i64;
v6 = v2;
v7 = v1;
v9 = 0i64;
if( _InterlockedIncrement64((volatile signed __int64 *)(v4 + 16)) <= 1 )
__fastfail(0xEu);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
MiUnlockVad((__int64)CurrentThread, v1);
if( *(_BYTE *)(v4 + 76) )
{
if( v5 < 0x38 )
{
v11 = -1073741820;
goto LABEL_10;
}
v12 = *(VOID **)(v6 + 48);
if( v12 )
{
v13 = (struct _DMA_ADAPTER *)PsReferencePrimaryToken((PEPROCESS)Process);
v11 = MiMapImageForEnclaveUse(v12, (INT64)v13, *((_BYTE *)CurrentThread + 562), &a5, v15);
HalPutDmaAdapter(v13);
if( v11 < 0 )
goto LABEL_10;
v9 = *(_QWORD *)(*(_QWORD *)(v15[0] + 96) + 56i64);
}
}
v11 = PsInitializeVsmEnclave(v4, (_DWORD *)v6, v5, v9, a5);
LABEL_10:
PsDereferenceVsmEnclave((PVOID)v4);
if( a5 )
MiUnmapImageForEnclaveUse((PVOID)a5);
MiLockVad((__int64)CurrentThread, v7);
return(unsigned int)v11;
}Referenced by:
MiInitializeEnclave