WmipAddDataSource
NTSTATUS __stdcall WmipAddDataSource(
_REGENTRY *RegEntry,
WMIREGINFOW *WmiRegInfo,
UINT64 BufferSize,
WCHAR *RegPath,
WCHAR *ResourceName){
__int64 v5;
unsigned int v6;
_QWORD *v9;
_QWORD *v10;
WMIREGGUIDW *p_Data2;
ULONG v12;
ULONG Flags;
int v14;
_QWORD *v15;
char v16;
NTSTATUS v17;
_GUID *v18;
tagInstanceSet *v19;
WCHAR *v20;
WCHAR *v21;
char *v23;
_QWORD **v24;
_QWORD *v25;
_QWORD *v26;
_QWORD *v27;
__int64 v28;
tagInstanceSet *v29;
bool v30;
_QWORD *v31;
__int64 v32;
_QWORD *v33;
_QWORD *v34;
_QWORD *v35;
_QWORD *v36;
__int64 v37;
_QWORD *v38;
UINT8 *NewMofResource;
char v40[8];
tagInstanceSet *BinaryMofInstanceSet;
__int128 v42;
__int128 v43;
char v44;
unsigned int v45;
v45 = BufferSize;
v5 = *((_QWORD *)RegEntry + 4);
BinaryMofInstanceSet = 0i64;
v40[0] = 0;
v6 = BufferSize;
v44 = 0;
v42 = 0i64;
v43 = 0i64;
if( !v5 )
{
v9 = WmipAllocEntry((__int64)&stru_140C00F40 + 7664);
v5 = (__int64)v9;
if( v9 )
{
v10 = v9 + 5;
*(_DWORD *)(v5 + 64) = 4;
v10[1] = v10;
*v10 = v10;
*(_QWORD *)(v5 + 72) = v5 + 80;
*(_OWORD *)(v5 + 80) = 0i64;
*(_OWORD *)(v5 + 96) = 0i64;
}
if( !v5 )
return -1073741670;
*(_DWORD *)(v5 + 56) = RegEntry[14];
v44 = 1;
}
p_Data2 = (WMIREGGUIDW *)&WmiRegInfo->WmiRegGuid[0].Guid.Data2;
v12 = 0;
if( !WmiRegInfo->GuidCount )
{
LABEL_10:
v14 = RegEntry[12] & 0x40000000;
if( v14 )
{
*((_QWORD *)&v42 + 1) = &v42;
*(_QWORD *)&v42 = &v42;
*((_QWORD *)&v43 + 1) = &v43;
*(_QWORD *)&v43 = &v43;
}
v15 = (_QWORD *)((unsigned __int64)&v42 & -(__int64)(v14 != 0));
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v16 = v44;
v17 = WmipLinkDataSourceToList(v5, v44, (__int64)v15);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
if( v15 )
{
while( 1 )
{
v23 = (char *)*v15;
if( (_QWORD *)*v15 == v15 )
break;
if( *((_QWORD **)v23 + 1) != v15 )
goto LABEL_61;
v34 = *(_QWORD **)v23;
if( *(char **)(*(_QWORD *)v23 + 8i64) != v23 )
goto LABEL_61;
*v15 = v34;
v34[1] = v15;
WmipLegacyEtwWorker(*((VOID **)v23 + 2));
v35 = v23 + 40;
while( 1 )
{
v36 = (_QWORD *)*v35;
if( (_QWORD *)*v35 == v35 )
break;
if( (_QWORD *)v36[1] != v35 )
goto LABEL_61;
v37 = *v36;
if( *(_QWORD **)(*v36 + 8i64) != v36 )
goto LABEL_61;
*v35 = v37;
*(_QWORD *)(v37 + 8) = v35;
KeSetEvent((PRKEVENT)(v36 + 2), 0, 0);
}
ExFreePoolWithTag(v23, 0x70696D57u);
}
v24 = (_QWORD **)(v15 + 2);
while( 1 )
{
v25 = *v24;
if( *v24 == v24 )
break;
if( (_QWORD **)v25[1] != v24 )
goto LABEL_61;
v38 = (_QWORD *)*v25;
if( *(_QWORD **)(*v25 + 8i64) != v25 )
goto LABEL_61;
*v24 = v38;
v38[1] = v24;
KeWaitForSingleObject((UINT64)(v25 + 4), 0, 0, 0, 0i64);
ExFreePoolWithTag(v25, 0x70696D57u);
}
}
if( v17 >= 0 )
{
v19 = BinaryMofInstanceSet;
*((_QWORD *)RegEntry + 4) = v5;
if( v19 )
WmipGenerateBinaryMofNotification(v19, &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, v18);
if( RegPath )
v20 = WmipCountedToSz(RegPath);
else
v20 = 0i64;
if( ResourceName )
v21 = WmipCountedToSz(ResourceName);
else
v21 = 0i64;
if( v20 )
{
if( *v20 && v21 && *v21 && WmipAddMofResource((tagDATASOURCE *)v5, v20, 0, v21, (UINT8 *)v40) >= 0 && v40[0] )
WmipGenerateMofResourceNotification(v20, v21, &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, 1ui64);
ExFreePoolWithTag(v20, 0);
}
if( v21 )
ExFreePoolWithTag(v21, 0);
WmipGenerateRegistrationNotification((tagDATASOURCE *)v5, 1ui64);
v5 = 0i64;
v17 = 0;
}
goto LABEL_28;
}
while( 1 )
{
Flags = p_Data2->Flags;
if( (Flags & 0x10000) != 0 || (Flags & 0x81000) == 0x80000 )
goto LABEL_9;
v26 = WmipAllocEntry((__int64)&stru_140C00F40 + 4496);
v27 = v26;
if( !v26 )
break;
*((_DWORD *)v26 + 4) |= 8u;
v26[7] = p_Data2;
v26[8] = v5;
LODWORD(NewMofResource) = *(_DWORD *)(v5 + 56);
v17 = WmipBuildInstanceSet(p_Data2, WmiRegInfo, v6, (tagInstanceSet *)v26, (UINT64)NewMofResource);
v28 = *(_QWORD *)&p_Data2->Guid.Data1 - WmipBinaryMofGuid;
if( *(_QWORD *)&p_Data2->Guid.Data1 == WmipBinaryMofGuid )
v28 = *(_QWORD *)p_Data2->Guid.Data4 - 0x102906C9A000F0B2i64;
v29 = BinaryMofInstanceSet;
v30 = v28 == 0;
v31 = (_QWORD *)(v5 + 40);
v32 = *(_QWORD *)(v5 + 40);
if( v30 )
v29 = (tagInstanceSet *)v27;
v33 = v27 + 5;
BinaryMofInstanceSet = v29;
if( *(_QWORD **)(v32 + 8) != v31 )
LABEL_61:
__fastfail(3u);
*v33 = v32;
v33[1] = v31;
*(_QWORD *)(v32 + 8) = v33;
*v31 = v33;
if( v17 < 0 )
goto LABEL_47;
v6 = v45;
LABEL_9:
++v12;
p_Data2 = (WMIREGGUIDW *)((char *)p_Data2 + 32);
if( v12 >= WmiRegInfo->GuidCount )
goto LABEL_10;
}
v17 = -1073741670;
LABEL_47:
v16 = v44;
LABEL_28:
if( v5 && v16 )
{
*(_DWORD *)(v5 + 16) |= 1u;
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 7664, (volatile signed __int64 *)v5);
}
return v17;
}Referenced by:
WmipInitializeDataStructs
WmipProcessWmiRegInfo