WmipBuildTraceDeviceList
INT64 __fastcall WmipBuildTraceDeviceList(INT64 a1, INT64 **a2, UINT64 *a3){
int v5;
INT64 *v6;
UINT64 v7;
unsigned int v8;
unsigned __int8 v9;
unsigned __int64 v10;
INT64 *PoolWithTag;
void **v12;
INT64 *v13;
unsigned int v14;
int v15;
unsigned int v16;
v5 = a1;
v6 = 0i64;
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
KeAcquireSpinLockRaiseToDpc(&WmipRegistrationSpinLock, v7);
v8 = WmipInUseRegEntryCount;
v10 = v9;
if( !WmipInUseRegEntryCount )
{
v16 = -1073741632;
LABEL_15:
KxReleaseSpinLock(&WmipRegistrationSpinLock);
__writecr8(v10);
KeReleaseMutex(&WmipSMMutex, 0);
goto LABEL_17;
}
PoolWithTag = (INT64 *)ExAllocatePoolWithTag(
NonPagedPoolNx,
16i64 * (unsigned int)WmipInUseRegEntryCount,
0x70696D57ui64);
v6 = PoolWithTag;
if( !PoolWithTag )
{
v16 = -1073741670;
goto LABEL_15;
}
v12 = (void **)WmipInUseRegEntryHead;
v13 = PoolWithTag;
v14 = 0;
while( v12 != &WmipInUseRegEntryHead )
{
v15 = (*((int *)v12 + 12) >> 4) & 0xF00000;
if( (v15 & v5) != 0 && ((_DWORD)v12[6] & 0x40000000) != 0 && v12[2] && v14 < v8 )
{
_InterlockedIncrement((volatile signed __int32 *)v12 + 12);
*v13 = (INT64)v12;
*((_DWORD *)v13 + 2) = v15;
v13 += 2;
++v14;
}
v12 = (void **)*v12;
}
KxReleaseSpinLock(&WmipRegistrationSpinLock);
__writecr8(v10);
KeReleaseMutex(&WmipSMMutex, 0);
if( v14 )
{
*(_DWORD *)a3 = v14;
v16 = 0;
*a2 = v6;
return v16;
}
v16 = -1073741632;
LABEL_17:
if( v6 )
WmipFreeTraceDeviceList(v6, 0);
return v16;
}Referenced by:
WmiSetNetworkNotify
WmiTraceRundownNotify