WmipBuildInstanceSet

__int64 __fastcall WmipBuildInstanceSet(__int64 a1, __int64 a2, unsigned int a3, __int64 a4, int a5){
  __int64 v5; 
  unsigned int v6; 
  unsigned int v9; 
  WCHAR *v11; 
  int v12; 
  ULONGLONG v13; 
  unsigned __int16 *v14; 
  signed int v15; 
  ULONGLONG v17; 
  unsigned __int64 v18; 
  WCHAR *PoolWithTag; 
  WCHAR *v20; 
  UINT64 v21; 
  int v22; 
  UINT64 v23; 
  unsigned __int64 v24; 
  unsigned int v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  ULONGLONG v28; 
  ULONGLONG v29; 
  unsigned int v30; 
  WCHAR **v31; 
  WCHAR **v32; 
  WCHAR *v33; 
  unsigned int v34; 
  UINT64 v35; 
  unsigned __int16 *v36; 
  unsigned __int64 v37; 
  __int64 v38; 
  ULONGLONG pullResult; 
  unsigned __int16 *v40; 
  unsigned int v41; 
  v41 = a3;
  v5 = *(unsigned int *)(a1 + 20);
  v6 = a3;
  *(_DWORD *)(a4 + 80) = a5;
  v9 = *(_DWORD *)(a4 + 16) & 0xFFFD7FF8;
  *(_DWORD *)(a4 + 72) = v5;
  *(_DWORD *)(a4 + 16) = v9;
  *(_DWORD *)(a4 + 76) = 0;
  v11 = 0i64;
  v12 = *(_DWORD *)(a1 + 16);
  pullResult = 0i64;
  if( (v12 & 1) != 0 )
  {
    v9 |= 4u;
    *(_DWORD *)(a4 + 16) = v9;
    v12 = *(_DWORD *)(a1 + 16);
  }
  if( (v12 & 0x80000) != 0 )
  {
    v9 |= 0x1000u;
    *(_DWORD *)(a4 + 16) = v9;
    v12 = *(_DWORD *)(a1 + 16);
    if( (v12 & 0x1000) != 0 )
    {
      v9 |= 0x80000u;
      *(_DWORD *)(a4 + 16) = v9;
      v12 = *(_DWORD *)(a1 + 16);
    }
  }
  if( (v12 & 0x40) != 0 )
  {
    *(_DWORD *)(a4 + 16) = v9 | 0x8000;
    v12 = *(_DWORD *)(a1 + 16);
  }
  v13 = *(unsigned int *)(a1 + 24);
  v14 = (unsigned __int16 *)(v13 + a2);
  v40 = (unsigned __int16 *)(v13 + a2);
  if( (v12 & 4) == 0 )
  {
    if( (v12 & 8) == 0 )
      goto LABEL_8;
    if( (int)WmipValidateWmiRegInfoString((WMIREGINFOW *)a2, a3, (unsigned int)v13, (WCHAR **)&pullResult) >= 0 )
    {
      v17 = pullResult;
      if( pullResult )
      {
        v18 = (unsigned __int64)*(unsigned __int16 *)pullResult >> 1;
        PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2 * v18 + 6, 0x70696D57ui64);
        v20 = PoolWithTag;
        if( PoolWithTag )
        {
          RtlStringCchCopyNW(PoolWithTag + 2, v18 + 1, (const WCHAR *)(v17 + 2), v18);
          *(_DWORD *)v20 = WmipDetermineInstanceBaseIndex((const _GUID *)a1, v20 + 2, v21);
          v22 = *(_DWORD *)(a4 + 16) | 1;
          *(_QWORD *)(a4 + 88) = v20;
          *(_DWORD *)(a4 + 16) = v22;
          if( (*(_DWORD *)(a1 + 16) & 0x20) != 0 )
            *(_DWORD *)(a4 + 16) = v22 | 0x20000;
          goto LABEL_8;
        }
        return(unsigned int)-1073741670;
      }
    }
    return(unsigned int)-1073741811;
  }
  v23 = 1i64;
  v24 = 0i64;
  v25 = 0;
  if( (_DWORD)v5 )
  {
    while( 1 )
    {
      pullResult = 0i64;
      if( (int)WmipValidateWmiRegInfoString((WMIREGINFOW *)a2, v6, (unsigned int)v13, (WCHAR **)&pullResult) < 0
        || !pullResult )
      {
        return(unsigned int)-1073741811;
      }
      v26 = (unsigned __int64)*(unsigned __int16 *)pullResult >> 1;
      v27 = v26;
      if( v26 <= v24 )
        v27 = v24;
      v24 = v27;
      v23 += 2 * v26 + 22;
      v28 = -1i64;
      v29 = v26 + 1;
      if( v29 )
        v28 = v29;
      v15 = v29 == 0 ? 0xC0000095 : 0;
      pullResult = v28;
      if( !v29 )
        return(unsigned int)v15;
      v15 = RtlULongLongMult(v28, 2ui64, &pullResult);
      if( v15 < 0 )
        return(unsigned int)v15;
      if( v13 + pullResult < v13 )
        return v30;
      v6 = v41;
      ++v25;
      LODWORD(v13) = v13 + pullResult;
      if( v25 >= (unsigned int)v5 )
      {
        v14 = v40;
        break;
      }
    }
  }
  v31 = (WCHAR **)ExAllocatePoolWithTag(PagedPool, v23, 0x70696D57ui64);
  v32 = v31;
  if( !v31 )
    return(unsigned int)-1073741670;
  *(_DWORD *)(a4 + 16) |= 2u;
  *(_QWORD *)(a4 + 88) = v31;
  v11 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2 * v24 + 2, 0x70696D57ui64);
  if( !v11 )
    return(unsigned int)-1073741670;
  v33 = (WCHAR *)&v32[v5];
  v34 = 0;
  if( (_DWORD)v5 )
  {
    v35 = v24 + 1;
    v36 = v14;
    v40 = (unsigned __int16 *)(v24 + 1);
    do
    {
      *v32 = v33;
      v37 = (unsigned __int64)*v14 >> 1;
      pullResult = (ULONGLONG)(v36 + 1);
      RtlStringCchCopyNW(v11, v35, v36 + 1, v37);
      v15 = WmipMangleInstanceName((const _GUID *)a1, v11, v37 + 7, v33);
      if( v15 < 0 )
        goto LABEL_9;
      v38 = -1i64;
      do
        ++v38;
      while( v33[v38] );
      v35 = (UINT64)v40;
      v33 += v38 + 1;
      ++v34;
      ++v32;
      v14 = (unsigned __int16 *)(pullResult + 2 * v37);
      v36 = v14;
    }
    while( v34 < (unsigned int)v5 );
  }
LABEL_8:
  v15 = 0;
LABEL_9:
  if( v11 )
    ExFreePoolWithTag(v11, 0);
  return(unsigned int)v15;
}

Referenced by:

WmipAddDataSource
WmipUpdateAddGuid
WmipUpdateModifyGuid