PsLoadVsmEnclaveData
__int64 __fastcall PsLoadVsmEnclaveData(_EX_PUSH_LOCK *a1, UINT64 a2, unsigned int er8_0, unsigned int a4, INT64 a5){
VOID **PoolWithTag;
NTSTATUS EnclaveData;
unsigned int v12;
int v13;
_ETHREAD *CurrentThread;
unsigned __int64 v15;
_RTL_BALANCED_NODE **v16;
BOOL v17;
_QWORD *bf_0;
_QWORD *v19;
_ETHREAD *v20;
unsigned int SessionId;
unsigned __int8 v22;
int v23;
_KLOCK_ENTRY *v24;
bool v25;
__int64 v26;
int v27;
unsigned int v28;
__int64 v29;
__int64 a3[6];
INT64 v31;
LODWORD(v31) = 0;
if( er8_0 == 4 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x28ui64, 1950708560i64);
if( !PoolWithTag )
return 3221225626i64;
}
else
{
PoolWithTag = 0i64;
}
EnclaveData = VslLoadEnclaveData(a1[3]._bf_0, a2, er8_0, a4, a5, (INT64)&v31);
v12 = EnclaveData;
if( PoolWithTag )
{
if( EnclaveData < 0 )
{
ExFreePoolWithTag(PoolWithTag, 0);
}
else
{
v13 = v31;
*((_DWORD *)PoolWithTag + 9) = 0;
*((_DWORD *)PoolWithTag + 8) = v13;
PoolWithTag[3] = (VOID *)a2;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v15 = (unsigned __int64)&a1[14];
ExAcquirePushLockExclusiveEx(a1 + 14, 0i64);
v16 = (_RTL_BALANCED_NODE **)&a1[13];
v17 = 0;
bf_0 = (_QWORD *)a1[13]._bf_0;
if( bf_0 )
{
while( 1 )
{
if( MiHotPatchImageTreeCompare(a2, (INT64)bf_0) < 0 )
{
v19 = (_QWORD *)*bf_0;
if( !*bf_0 )
{
v17 = 0;
break;
}
}
else
{
v19 = (_QWORD *)bf_0[1];
if( !v19 )
{
v17 = 1;
break;
}
}
bf_0 = v19;
}
}
RtlAvlInsertNodeEx(v16, (UINT64)bf_0, v17, (_RTL_BALANCED_NODE *)PoolWithTag);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v15, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v15);
LODWORD(a3[0]) = 0;
v20 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v15) == 1 )
SessionId = MmGetSessionIdEx(v20->Tcb.ApcState.Process);
else
SessionId = -1;
--v20->Tcb.SpecialApcDisable;
v22 = ++v20->Tcb.AbAllocationRegionCount;
v23 = ((char)v20->Tcb.AbEntrySummary | (char)v20->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v25 = !_BitScanReverse((unsigned int *)&v26, v23);
if( v25 )
goto LABEL_26;
v24 = &v20->Tcb.LockEntries[v26];
v23 &= ~(1 << v26);
if( (v24->AcquiredByte & 1) != 0
&& (v24->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v24->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v15 & 0x7FFFFFFFFFFFFFFCi64)
&& v24->LockState.SessionId == SessionId )
{
v24->AcquiredByte &= ~1u;
if( v24->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
}
if( !v24 )
{
LABEL_26:
if( (*(&v20->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v20, (PVOID)v15, (PVOID)SessionId, 0i64);
goto LABEL_33;
}
v24->CrossThreadReleasableAndBusyByte |= 2u;
if( v24->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v24);
v27 = v24->BoostBitmap.AllFields & 0x1FFFF;
v28 = v24->BoostBitmap.AllFields & 0xFFFE0000;
v24->ThreadLocalFlags &= ~1u;
LODWORD(a3[0]) = v27;
v24->BoostBitmap.AllFields = v28;
v24->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v29 = v24 - v20->Tcb.LockEntries;
if( v22 == 1 )
v20->Tcb.AbEntrySummary |= 1 << v29;
else
_InterlockedOr8((volatile signed __int8 *)&v20->Tcb.AbOrphanedEntrySummary, 1 << v29);
LABEL_33:
--v20->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v20->Tcb, (VOID *)v15, (UINT64 *)a3);
v25 = v20->Tcb.SpecialApcDisable++ == -1;
if( v25 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v20->Tcb.ApcState.ApcListHead[0].Flink != &v20->Tcb.152 )
KiCheckForKernelApcDelivery();
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
}
return v12;
}Referenced by:
MiLoadDataIntoVsmEnclave