diff --git a/mingw-w64-headers/include/windows.system.profile.idl b/mingw-w64-headers/include/windows.system.profile.idl
new file mode 100644
index 0000000..90a561c
--- /dev/null
+++ b/mingw-w64-headers/include/windows.system.profile.idl
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2023 Rémi Bernon for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+#ifndef DO_NO_IMPORTS
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.storage.streams.idl";
+import "windows.system.idl";
+#endif
+
+namespace Windows.System.Profile {
+
+    interface IAnalyticsInfoStatics;
+    interface IAnalyticsInfoStatics2;
+    interface IAnalyticsVersionInfo;
+    interface IAnalyticsVersionInfo2;
+    runtimeclass AnalyticsVersionInfo;
+    runtimeclass AnalyticsInfo;
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.System.Profile.AnalyticsInfo),
+        uuid(1d5ee066-188d-5ba9-4387-acaeb0e7e305)
+    ]
+    interface IAnalyticsInfoStatics : IInspectable
+    {
+        [propget] HRESULT VersionInfo([out, retval] Windows.System.Profile.AnalyticsVersionInfo **value);
+        [propget] HRESULT DeviceForm([out, retval] HSTRING *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.System.Profile.AnalyticsVersionInfo),
+        uuid(926130b8-9955-4c74-bdc1-7cd0decf9b03)
+    ]
+    interface IAnalyticsVersionInfo : IInspectable
+    {
+        [propget] HRESULT DeviceFamily([out, retval] HSTRING *value);
+        [propget] HRESULT DeviceFamilyVersion([out, retval] HSTRING *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass AnalyticsVersionInfo
+    {
+        [default] interface Windows.System.Profile.IAnalyticsVersionInfo;
+        [contract(Windows.Foundation.UniversalApiContract, 11.0)] interface Windows.System.Profile.IAnalyticsVersionInfo2;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.System.Profile.IAnalyticsInfoStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.System.Profile.IAnalyticsInfoStatics2, Windows.Foundation.UniversalApiContract, 6.0),
+        threading(both)
+    ]
+    runtimeclass AnalyticsInfo
+    {
+    }
+
+}
