EmonAllocateResources
NTSTATUS __stdcall EmonAllocateResources(_XSTATE_CONFIGURATION *a1, INT64 a2, PFN_CLIPSP_CLEAR *a3, INT64 a4, INT64 a5){
__int32 v9;
int v10;
int v11;
UINT64 v12;
_HALP_ALLOC_CONTEXT *v13;
UINT8 *v14;
UINT8 *v15;
int v16;
__int64 v17;
__int64 v18;
__int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
UINT8 **v23;
_HALP_ALLOC_CONTEXT *v24;
_KAFFINITY_ENUMERATION_CONTEXT Context;
UINT64 ProcIndex;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
v9 = 1;
v10 = 0;
*(_QWORD *)a5 = -1i64;
if( a4 )
{
v9 = _InterlockedExchange((_DWORD *)&CmpDummyThreadEvent + 1238, 1);
if( v9 )
{
v10 = -1073741670;
LABEL_27:
if( a4 && !v9 )
{
*(&CmpDummyThreadEvent + 1237) = 0;
*(&CmpDummyThreadEvent + 1238) = 0;
}
return v10;
}
v11 = *(&CmpDummyThreadEvent + 1245);
if( *(_DWORD *)(a4 + 8) )
v11 = *(_DWORD *)(a4 + 8);
*(&CmpDummyThreadEvent + 1237) = v11;
}
v12 = 8 * (unsigned int)HalpQueryMaximumRegisteredProcessorCount() + 40;
v14 = HalpMmAllocCtxAlloc(v13, v12);
v15 = v14;
if( !v14 )
{
v10 = -1073741801;
goto LABEL_27;
}
memset(v14, 0i64, v12);
*((_QWORD *)v15 + 2) = a2;
if( a4 )
*((_QWORD *)v15 + 3) = *(_QWORD *)a4;
Context.CurrentMask = (unsigned __int64)a3[1];
Context.CurrentIndex = 0;
Context.Affinity = (_KAFFINITY_EX *)a3;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v16 )
break;
v10 = EmonMarkCountersReserved((unsigned int)ProcIndex, (UINT64)a1);
if( v10 < 0 )
goto LABEL_26;
v17 = (unsigned int)ProcIndex;
*(_QWORD *)&v15[8 * (unsigned int)ProcIndex + 32] = a1;
if( a4 )
{
v18 = *(&CmpDummyThreadEvent + 614) + 160 * v17;
if( *(&CmpDummyThreadEvent + 4920) )
{
v19 = *(_QWORD *)(v18 + 32);
v20 = *(_QWORD *)(v18 + 48);
}
else
{
v19 = *(unsigned int *)(v18 + 16);
v20 = *(unsigned int *)(v18 + 24);
}
v21 = v19 + (unsigned int)(*(&CmpDummyThreadEvent + 1237) * *(_DWORD *)(a4 + 12));
if( v21 >= v20 )
{
v10 = -1073741811;
LABEL_26:
EmonReleaseProfileResourcesInternal((INT64)v15);
HalpMmAllocCtxFree(v24, v15);
goto LABEL_27;
}
if( !*(&CmpDummyThreadEvent + 4920) )
v21 = (unsigned int)v21;
*(_QWORD *)(v18 + 56) = v21;
v10 = 0;
}
}
v22 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 609);
v23 = (UINT8 **)*(&CmpDummyThreadEvent + 617);
if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 617) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4928) )
__fastfail(3u);
*(_QWORD *)v15 = (char *)&CmpDummyThreadEvent + 4928;
*((_QWORD *)v15 + 1) = v23;
*v23 = v15;
*(&CmpDummyThreadEvent + 617) = v15;
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 609);
__writecr8(v22);
*(_QWORD *)a5 = v15;
return v10;
}Referenced by:
EmonReserveProfileResources