WmipUpdateDataSource
NTSTATUS __stdcall WmipUpdateDataSource(_REGENTRY *RegEntry, WMIREGINFOW *WmiRegInfo, UINT64 RetSize){
tagDATASOURCE *v3;
ULONG v4;
int v6;
unsigned int v7;
unsigned int v8;
PTRCACHE *v9;
_GUID *v10;
unsigned int v11;
WMIREGGUIDW *v12;
int updated;
_GUID *v14;
tagInstanceSet *ISInDSByGuid;
tagInstanceSet *v17;
unsigned int v18;
const VOID **p_PtrArray;
UINT64 *v20;
tagInstanceSet *v21;
UINT64 *p_GuidCount;
_GUID *v23;
__int64 v24;
__int64 v25;
__int64 v26;
_QWORD *v27;
PTRCACHE *v28;
tagInstanceSet **v29;
__int64 v30;
__int64 v31;
PTRCACHE *v32;
tagInstanceSet **v33;
__int64 v34;
_GUID *v35;
__int64 v36;
UINT64 PtrCount;
int v38;
_DWORD PtrMax[3];
PTRCACHE *GuidList;
PVOID P;
VOID *PtrArray;
UINT64 GuidCount;
UINT64 BufferSize;
unsigned int v45;
LODWORD(BufferSize) = RetSize;
v3 = (tagDATASOURCE *)*((_QWORD *)RegEntry + 4);
v4 = 0;
*(_QWORD *)&PtrMax[1] = 0i64;
if( !v3 )
return -1073741772;
WmipReferenceEntry((INT64)v3);
v6 = 0;
v45 = 0;
LODWORD(GuidCount) = 0;
PtrCount = 0i64;
v38 = 0;
PtrMax[0] = 0;
v7 = 0;
v8 = 0;
GuidList = 0i64;
P = 0i64;
v9 = 0i64;
PtrArray = 0i64;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( !WmiRegInfo->GuidCount )
goto LABEL_9;
v11 = BufferSize;
do
{
v12 = (WMIREGGUIDW *)(&WmiRegInfo->WmiRegGuid[0].Guid.Data2 + 16 * v4);
if( (v12->Flags & 0x10000) != 0 )
{
ISInDSByGuid = WmipFindISInDSByGuid(v3, &v12->Guid, v10);
v17 = ISInDSByGuid;
if( !ISInDSByGuid )
goto LABEL_7;
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)ISInDSByGuid);
p_PtrArray = (const VOID **)&PtrArray;
*(_QWORD *)&PtrMax[1] = v17;
v20 = (UINT64 *)((char *)&PtrCount + 4);
v21 = v17;
p_GuidCount = &GuidCount;
}
else
{
updated = WmipUpdateModifyGuid(v3, v12, WmiRegInfo, v11, (tagInstanceSet **)&PtrMax[1]);
if( updated == 1 )
{
p_PtrArray = (const VOID **)&P;
v20 = (UINT64 *)&v38;
p_GuidCount = (UINT64 *)&v45;
}
else
{
if( updated != 2 )
goto LABEL_7;
p_PtrArray = (const VOID **)&GuidList;
v20 = (UINT64 *)PtrMax;
p_GuidCount = &PtrCount;
}
v21 = *(tagInstanceSet **)&PtrMax[1];
}
WmipCachePtrs(&v12->Guid, v21, p_GuidCount, v20, p_PtrArray);
LABEL_7:
++v4;
}
while( v4 < WmiRegInfo->GuidCount );
v9 = (PTRCACHE *)PtrArray;
v7 = v45;
v8 = PtrCount;
v6 = GuidCount;
LABEL_9:
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 7664, (volatile signed __int64 *)v3);
if( v6 )
{
v18 = 0;
do
{
v23 = *(_GUID **)&v9[4 * v18];
v24 = *(_QWORD *)&v23->Data1 - WmipBinaryMofGuid;
if( *(_QWORD *)&v23->Data1 == WmipBinaryMofGuid )
v24 = *(_QWORD *)v23->Data4 - 0x102906C9A000F0B2i64;
if( !v24 )
{
WmipGenerateBinaryMofNotification(
*(tagInstanceSet **)&v9[4 * v18 + 2],
&GUID_MOF_RESOURCE_REMOVED_NOTIFICATION,
v23);
v23 = *(_GUID **)&v9[4 * v18];
}
v25 = *(_QWORD *)&v9[4 * v18 + 2];
WmipDisableCollectionForRemovedGuid(v23, (tagInstanceSet *)v25);
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( *(_QWORD *)v25 )
WmipUnlinkInstanceSetFromGuidEntry((tagInstanceSet *)v25);
if( (*(_DWORD *)(v25 + 16) & 8) == 0 )
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4528, *(volatile signed __int64 **)(v25 + 56));
*(_QWORD *)(v25 + 56) = 0i64;
v26 = *(_QWORD *)(v25 + 40);
if( *(_QWORD *)(v26 + 8) != v25 + 40 || (v27 = *(_QWORD **)(v25 + 48), *v27 != v25 + 40) )
__fastfail(3u);
*v27 = v26;
*(_QWORD *)(v26 + 8) = v27;
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)v25);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
++v18;
}
while( v18 < (unsigned int)GuidCount );
WmipSendGuidUpdateNotifications(2ui64, (unsigned int)GuidCount, v9);
ExFreePoolWithTag(v9, 0);
}
if( v8 )
{
v28 = GuidList;
v29 = (tagInstanceSet **)GuidList;
v30 = v8;
do
{
v31 = *(_QWORD *)*v29 - WmipBinaryMofGuid;
if( !v31 )
v31 = *((_QWORD *)*v29 + 1) - 0x102906C9A000F0B2i64;
if( !v31 )
WmipGenerateBinaryMofNotification(v29[1], &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, v14);
v29 += 2;
--v30;
}
while( v30 );
WmipSendGuidUpdateNotifications(4ui64, v8, v28);
ExFreePoolWithTag(v28, 0);
}
if( v7 )
{
v32 = (PTRCACHE *)P;
v33 = (tagInstanceSet **)P;
v34 = v7;
do
{
v35 = (_GUID *)*v33;
v36 = *(_QWORD *)*v33 - WmipBinaryMofGuid;
if( !v36 )
v36 = *(_QWORD *)v35->Data4 - 0x102906C9A000F0B2i64;
if( !v36 )
{
WmipGenerateBinaryMofNotification(v33[1], &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, v35);
v35 = (_GUID *)*v33;
}
WmipEnableCollectionForNewGuid(v35, v33[1]);
v33 += 2;
--v34;
}
while( v34 );
WmipSendGuidUpdateNotifications(1ui64, v7, v32);
ExFreePoolWithTag(v32, 0);
}
return 0;
}Referenced by:
WmipProcessWmiRegInfo