WmipProcessWmiRegInfo

NTSTATUS __stdcall WmipProcessWmiRegInfo(_REGENTRY *RegEntry, WMIREGINFOW *WmiRegInfo, UINT64 BufferSize, UINT8 Update){
  NTSTATUS v4; 
  unsigned int v6; 
  WMIREGINFOW *v7; 
  int v9; 
  UINT64 v10; 
  int v11; 
  NTSTATUS updated; 
  int v13; 
  __int64 NextWmiRegInfo; 
  WCHAR *String; 
  WCHAR *ResourceName; 

  v4 = 0;
  v6 = BufferSize;
  v7 = WmiRegInfo;
  String = 0i64;
  v9 = 0;
  ResourceName = 0i64;
  if( WmiRegInfo->BufferSize > (unsigned int)BufferSize )
  {
LABEL_17:
    v11 = -1073741811;
  }
  else
  {
    while( 1 )
    {
      v11 = WmipValidateWmiRegInfoString(v7, v6, v7->RegistryPath, &String);
      if( v11 < 0 )
        break;
      v11 = WmipValidateWmiRegInfoString(v7, v10, v7->MofResourceName, &ResourceName);
      if( v11 < 0 )
        break;
      if( 32 * v7->GuidCount + 24 > v6 )
        goto LABEL_17;
      if( Update )
        updated = WmipUpdateDataSource(RegEntry, v7, v6);
      else
        updated = WmipAddDataSource(RegEntry, v7, v6, String, ResourceName);
      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 v11;
  return v4;
}

Referenced by:

WmipRegisterOrUpdateDS