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