PsInitializeVsmEnclave
__int64 __fastcall PsInitializeVsmEnclave(
__int64 a1,
_DWORD *a2,
unsigned int a3,
VOID **a4,
UINT64 *RemainingTargetSidBufferSize){
_ETHREAD *CurrentThread;
_QWORD *PoolWithQuotaTag;
_EX_PUSH_LOCK *v11;
int v12;
NTSTATUS v13;
__int64 v14;
_QWORD *v16;
_QWORD *v17;
__int64 v18;
_QWORD *v19;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PoolWithQuotaTag = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
v11 = (_EX_PUSH_LOCK *)(a1 + 48);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 48), 0i64);
v12 = *(_DWORD *)(a1 + 44);
if( v12 )
{
if( v12 == 1 )
v13 = -1073740528;
else
v13 = -1073740526;
goto LABEL_19;
}
if( *(_BYTE *)(a1 + 76) )
{
LODWORD(v14) = 0;
LABEL_12:
v13 = VslInitializeEnclave(*(_QWORD *)(a1 + 24), a1 + 80, (INT64)a2, a3, a4, RemainingTargetSidBufferSize);
if( v13 >= 0 )
{
if( !*(_BYTE *)(a1 + 76) )
{
*(_DWORD *)(a1 + 72) = v14;
*PoolWithQuotaTag = 0i64;
if( (unsigned int)v14 > 1 )
{
v16 = PoolWithQuotaTag + 5;
v17 = PoolWithQuotaTag;
v18 = (unsigned int)(v14 - 1);
do
{
*v16 = v17;
v17 += 5;
v16 += 5;
--v18;
}
while( v18 );
}
*(_QWORD *)(a1 + 120) = PoolWithQuotaTag;
v19 = &PoolWithQuotaTag[5 * (unsigned int)(v14 - 1)];
PoolWithQuotaTag = 0i64;
*(_QWORD *)(a1 + 128) = v19;
}
*(_DWORD *)(a1 + 44) = 1;
*(_QWORD *)(a1 + 64) = a1 + 56;
v13 = 0;
*(_QWORD *)(a1 + 56) = a1 + 56;
}
goto LABEL_19;
}
if( a3 != 8 || *a2 != 8 )
return 3221225476i64;
v14 = (unsigned int)a2[1];
PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, 40 * v14, 0x74457350ui64);
if( PoolWithQuotaTag )
goto LABEL_12;
v13 = -1073741670;
LABEL_19:
if( (_InterlockedExchangeAdd64(&v11->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v11);
KeAbPostRelease(v11);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( PoolWithQuotaTag )
ExFreePoolWithTag(PoolWithQuotaTag, 0);
return(unsigned int)v13;
}Referenced by:
MiInitializeVsmEnclave