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