WmipUpdateModifyGuid

UINT64 __stdcall WmipUpdateModifyGuid(
        tagDATASOURCE *DataSource,
        WMIREGGUIDW *RegGuid,
        WMIREGINFOW *WmiRegInfo,
        UINT64 BufferSize,
        tagInstanceSet **AddModInstanceSet){
  unsigned int v8; 
  unsigned int v9; 
  _GUID *v10; 
  tagInstanceSet *ISInDSByGuid; 
  tagInstanceSet *v12; 
  tagInstanceSet *v13; 
  __int128 v15; 
  __int64 v16; 
  tagInstanceSet **v17; 
  NTSTATUS v18; 
  void *v19; 
  __int64 v20; 
  __int64 v21; 
  UINT64 ProviderId; 
  UINT64 ProviderIda; 
  __int128 v24; 
  __int128 v25; 
  __int128 v26; 
  __int128 v27; 
  __int128 v28; 
  PVOID v29[12]; 

  v8 = BufferSize;
  memset(v29, 0i64, sizeof(v29));
  v9 = 0;
  *AddModInstanceSet = 0i64;
  ISInDSByGuid = WmipFindISInDSByGuid(DataSource, &RegGuid->Guid, v10);
  if( ISInDSByGuid )
  {
    v12 = (tagInstanceSet *)WmipAllocEntry((__int64)&stru_140C00F40 + 4496);
    v13 = v12;
    if( v12 )
    {
      LODWORD(ProviderId) = DataSource[14];
      if( WmipBuildInstanceSet(RegGuid, WmiRegInfo, v8, v12, ProviderId) >= 0
        && !WmipIsEqualInstanceSets(ISInDSByGuid, v13) )
      {
        v24 = *(_OWORD *)ISInDSByGuid;
        v25 = *((_OWORD *)ISInDSByGuid + 1);
        v26 = *((_OWORD *)ISInDSByGuid + 2);
        v27 = *((_OWORD *)ISInDSByGuid + 3);
        v28 = *((_OWORD *)ISInDSByGuid + 4);
        v15 = *((_OWORD *)ISInDSByGuid + 5);
        *((_QWORD *)ISInDSByGuid + 11) = 0i64;
        v16 = *(_QWORD *)ISInDSByGuid;
        *(_OWORD *)&v29[10] = v15;
        if( *(tagInstanceSet **)(v16 + 8) != ISInDSByGuid )
          goto LABEL_20;
        v17 = (tagInstanceSet **)*((_QWORD *)ISInDSByGuid + 1);
        if( *v17 != ISInDSByGuid )
          goto LABEL_20;
        *v17 = (tagInstanceSet *)v16;
        *(_QWORD *)(v16 + 8) = v17;
        LODWORD(ProviderIda) = DataSource[14];
        v18 = WmipBuildInstanceSet(RegGuid, WmiRegInfo, v8, ISInDSByGuid, ProviderIda);
        if( v18 < 0 )
        {
          v19 = (void *)*((_QWORD *)ISInDSByGuid + 11);
          if( v19 )
            ExFreePoolWithTag(v19, 0);
          *(_OWORD *)ISInDSByGuid = v24;
          *((_OWORD *)ISInDSByGuid + 1) = v25;
          *((_OWORD *)ISInDSByGuid + 2) = v26;
          *((_OWORD *)ISInDSByGuid + 3) = v27;
          *((_OWORD *)ISInDSByGuid + 4) = v28;
          *((_OWORD *)ISInDSByGuid + 5) = v15;
        }
        v20 = *((_QWORD *)ISInDSByGuid + 7) + 56i64;
        v21 = *(_QWORD *)v20;
        if( *(_QWORD *)(*(_QWORD *)v20 + 8i64) != v20 )
LABEL_20:
          __fastfail(3u);
        *(_QWORD *)ISInDSByGuid = v21;
        *((_QWORD *)ISInDSByGuid + 1) = v20;
        *(_QWORD *)(v21 + 8) = ISInDSByGuid;
        *(_QWORD *)v20 = ISInDSByGuid;
        if( v18 >= 0 )
        {
          if( v29[11] )
            ExFreePoolWithTag(v29[11], 0);
          *AddModInstanceSet = ISInDSByGuid;
          v9 = 2;
        }
      }
    }
    WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)ISInDSByGuid);
    if( v13 )
      WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)v13);
  }
  else
  {
    return(unsigned int)WmipUpdateAddGuid(DataSource, RegGuid, WmiRegInfo, v8, AddModInstanceSet);
  }
  return v9;
}

Referenced by:

WmipUpdateDataSource