WmipUpdateModifyGuid

INT64 __fastcall WmipUpdateModifyGuid(INT64 a1, GUID *Guid, WMIREGINFOW *WmiRegInfo, UINT64 BufferSize, INT64 a5){
  unsigned int v8; 
  unsigned int v9; 
  _QWORD *ISInDSByGuid; 
  __int64 v11; 
  volatile signed __int64 *v12; 
  __int128 v14; 
  __int64 v15; 
  _QWORD *v16; 
  int v17; 
  void *v18; 
  __int64 v19; 
  __int64 v20; 
  __int128 v21; 
  __int128 v22; 
  __int128 v23; 
  __int128 v24; 
  __int128 v25; 
  __int64 v26; 
  PVOID P[2]; 
  v8 = BufferSize;
  memset((INT64)&v26, 0i64);
  v9 = 0;
  *(_QWORD *)a5 = 0i64;
  ISInDSByGuid = WmipFindISInDSByGuid(a1, Guid);
  if( ISInDSByGuid )
  {
    v11 = WmipAllocEntry((INT64)&WmipISChunkInfo);
    v12 = (volatile signed __int64 *)v11;
    if( v11
      && (int)WmipBuildInstanceSet((__int64)Guid, (__int64)WmiRegInfo, v8, v11, *(_DWORD *)(a1 + 56)) >= 0
      && !WmipIsEqualInstanceSets((__int64)ISInDSByGuid, (__int64)v12) )
    {
      v21 = *(_OWORD *)ISInDSByGuid;
      v22 = *((_OWORD *)ISInDSByGuid + 1);
      v23 = *((_OWORD *)ISInDSByGuid + 2);
      v24 = *((_OWORD *)ISInDSByGuid + 3);
      v25 = *((_OWORD *)ISInDSByGuid + 4);
      v14 = *((_OWORD *)ISInDSByGuid + 5);
      ISInDSByGuid[11] = 0i64;
      v15 = *ISInDSByGuid;
      *(_OWORD *)P = v14;
      if( *(_QWORD **)(v15 + 8) != ISInDSByGuid )
        goto LABEL_20;
      v16 = (_QWORD *)ISInDSByGuid[1];
      if( (_QWORD *)*v16 != ISInDSByGuid )
        goto LABEL_20;
      *v16 = v15;
      *(_QWORD *)(v15 + 8) = v16;
      v17 = WmipBuildInstanceSet((__int64)Guid, (__int64)WmiRegInfo, v8, (__int64)ISInDSByGuid, *(_DWORD *)(a1 + 56));
      if( v17 < 0 )
      {
        v18 = (void *)ISInDSByGuid[11];
        if( v18 )
          ExFreePoolWithTag(v18, 0);
        *(_OWORD *)ISInDSByGuid = v21;
        *((_OWORD *)ISInDSByGuid + 1) = v22;
        *((_OWORD *)ISInDSByGuid + 2) = v23;
        *((_OWORD *)ISInDSByGuid + 3) = v24;
        *((_OWORD *)ISInDSByGuid + 4) = v25;
        *((_OWORD *)ISInDSByGuid + 5) = v14;
      }
      v19 = ISInDSByGuid[7] + 56i64;
      v20 = *(_QWORD *)v19;
      if( *(_QWORD *)(*(_QWORD *)v19 + 8i64) != v19 )
LABEL_20:
        __fastfail(3u);
      *ISInDSByGuid = v20;
      ISInDSByGuid[1] = v19;
      *(_QWORD *)(v20 + 8) = ISInDSByGuid;
      *(_QWORD *)v19 = ISInDSByGuid;
      if( v17 >= 0 )
      {
        if( P[1] )
          ExFreePoolWithTag(P[1], 0);
        *(_QWORD *)a5 = ISInDSByGuid;
        v9 = 2;
      }
    }
    WmipUnreferenceEntry((__int64)&WmipISChunkInfo, ISInDSByGuid);
    if( v12 )
      WmipUnreferenceEntry((__int64)&WmipISChunkInfo, v12);
  }
  else
  {
    return(unsigned int)WmipUpdateAddGuid(a1, Guid, WmiRegInfo, v8, a5);
  }
  return v9;
}

Referenced by:

WmipUpdateDataSource