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