EmonAddProfileSource
INT64 __fastcall EmonAddProfileSource(UINT8 *a1, _DWORD *a2){
WCHAR *v2;
unsigned int v5;
unsigned int v6;
__int64 v7;
WCHAR *v8;
__int64 v9;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
unsigned int v15;
int v16;
int v17;
int v18;
unsigned __int64 v19;
_DWORD *v20;
__int64 v21;
__int64 v22;
__int64 a4;
a4 = 0i64;
v2 = (WCHAR *)(a1 + 184);
v5 = -1073741823;
v6 = wcsnlen((const wchar_t *)a1 + 92, 0xFEui64) + 1;
v8 = (WCHAR *)HalpMmAllocCtxAlloc(v7, 2 * v6);
v9 = (__int64)v8;
if( !v8 )
return 3221225495i64;
wcsncpy_s(v8, v6, v2, v6);
v12 = HalpMmAllocCtxAlloc(v11, 224i64);
v14 = v12;
if( !v12 )
{
HalpMmAllocCtxFree(v13, v9);
return 3221225495i64;
}
memset(v12, 0i64);
*(_BYTE *)(v14 + 28) = 1;
v15 = *((_DWORD *)a1 + 2);
*(_DWORD *)(v14 + 24) = v15;
if( v15 > 0x7FFFFFFF )
{
*(_DWORD *)(v14 + 24) = 0x7FFFFFFF;
v15 = 0x7FFFFFFF;
}
v16 = *(_DWORD *)(v14 + 24);
*(_BYTE *)(v14 + 29) = 0;
if( v15 < 0x1000 )
v16 = 4096;
*(_DWORD *)(v14 + 24) = v16;
v17 = *a1;
v18 = a1[1] | ((a1[5] & 1 | (8 * (a1[4] & 1 | (4 * (a1[3] & 1 | (2 * (a1[2] & 0xF))))))) << 10) | 0x300;
*(_DWORD *)(v14 + 216) = 37;
*(_DWORD *)(v14 + 208) = v17 | (v18 << 8);
KeCopyAffinityEx(v14 + 32, (unsigned __int16 *)a1 + 8);
*(_QWORD *)(v14 + 200) = v9;
v19 = (unsigned __int8)HalpAcquireHighLevelLock(&EmonProfileSourceDescriptorListLock);
if( HalpInsertProfileSource(v14, &EmonProfileSourceDescriptorListHead, 37i64, &a4) )
{
++EmonProfileSourceDescriptorCount;
if( a2 )
*a2 = *(_DWORD *)v14;
KxReleaseSpinLock(&EmonProfileSourceDescriptorListLock);
__writecr8(v19);
return 0i64;
}
else
{
v20 = (_DWORD *)a4;
if( a4 && *(_DWORD *)(a4 + 208) == *(_DWORD *)(v14 + 208) )
{
KeOrAffinityEx((_KAFFINITY_EX *)(a4 + 32), (_KAFFINITY_EX *)(v14 + 32), (_KAFFINITY_EX *)(a4 + 32));
if( a2 )
*a2 = *v20;
v5 = 0;
}
KxReleaseSpinLock(&EmonProfileSourceDescriptorListLock);
__writecr8(v19);
HalpMmAllocCtxFree(v21, *(_QWORD *)(v14 + 200));
HalpMmAllocCtxFree(v22, v14);
return v5;
}
}Referenced by:
No references.