WmipProcessWmiRegInfo

INT64 __fastcall WmipProcessWmiRegInfo(INT64 a1, UINT64 *a2, UINT64 a3, CHAR a4){
  unsigned int v4; 
  unsigned int v6; 
  WMIREGINFOW *v7; 
  int v9; 
  UINT64 v10; 
  int v11; 
  int updated; 
  int v13; 
  __int64 NextWmiRegInfo; 
  WCHAR *String; 
  WCHAR *a5; 
  v4 = 0;
  v6 = a3;
  v7 = (WMIREGINFOW *)a2;
  String = 0i64;
  v9 = 0;
  a5 = 0i64;
  if( *(_DWORD *)a2 > (unsigned int)a3 )
  {
LABEL_17:
    v11 = -1073741811;
  }
  else
  {
    while( 1 )
    {
      v11 = WmipValidateWmiRegInfoString(v7, v6, v7->RegistryPath, &String);
      if( v11 < 0 )
        break;
      v11 = WmipValidateWmiRegInfoString(v7, v10, v7->MofResourceName, &a5);
      if( v11 < 0 )
        break;
      if( 32 * v7->GuidCount + 24 > v6 )
        goto LABEL_17;
      if( a4 )
        updated = WmipUpdateDataSource(a1, (__int64)v7, v6);
      else
        updated = WmipAddDataSource(a1, v7, v6, String, a5);
      v11 = updated;
      v13 = v9 + 1;
      if( v11 < 0 )
        v13 = v9;
      v9 = v13;
      NextWmiRegInfo = v7->NextWmiRegInfo;
      if( !(_DWORD)NextWmiRegInfo )
        break;
      if( v6 < (unsigned int)NextWmiRegInfo )
        break;
      v6 -= NextWmiRegInfo;
      if( v6 < 0x18 )
        break;
      v7 = (WMIREGINFOW *)((char *)v7 + NextWmiRegInfo);
      if( (WMIREGINFOW *)(((unsigned __int64)&v7->NextWmiRegInfo + 3) & 0xFFFFFFFFFFFFFFF8ui64) != v7 )
        break;
      if( v7->BufferSize > v6 )
        goto LABEL_17;
    }
  }
  if( !v9 )
    return(unsigned int)v11;
  return v4;
}

Referenced by:

WmipRegisterOrUpdateDS