diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h
index 6c4d3ec..d5eb590 100644
--- a/mingw-w64-headers/include/windows.foundation.h
+++ b/mingw-w64-headers/include/windows.foundation.h
@@ -1,11 +1,12 @@
-/*** Autogenerated by WIDL 1.5.31 from include/windows.foundation.idl - Do not edit ***/
+/*** Autogenerated by WIDL 6.0-rc1 from include/windows.foundation.idl - Do not edit ***/
 
+#ifdef _WIN32
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
 #define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
-
 #include <rpc.h>
 #include <rpcndr.h>
+#endif
 
 #ifndef COM_NO_WINDOWS_H
 #include <windows.h>
@@ -17,24 +18,60 @@
 
 /* Forward declarations */
 
-#ifndef __IAsyncInfo_FWD_DEFINED__
-#define __IAsyncInfo_FWD_DEFINED__
-typedef interface IAsyncInfo IAsyncInfo;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncInfo_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncInfo_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncInfo __x_ABI_CWindows_CFoundation_CIAsyncInfo;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncInfo;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IASyncAction_FWD_DEFINED__
-#define __IASyncAction_FWD_DEFINED__
-typedef interface IASyncAction IASyncAction;
+#ifndef ____x_ABI_CWindows_CFoundation_CIASyncAction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIASyncAction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIASyncAction __x_ABI_CWindows_CFoundation_CIASyncAction;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IASyncAction;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
-#define __AsyncActionCompletedHandler_FWD_DEFINED__
-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+#ifndef ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface AsyncActionCompletedHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IAsyncOperation_FWD_DEFINED__
-#define __IAsyncOperation_FWD_DEFINED__
-typedef interface IAsyncOperation IAsyncOperation;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncOperation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncOperation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncOperation __x_ABI_CWindows_CFoundation_CIAsyncOperation;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncOperation;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
 /* Headers for imported files */
@@ -45,193 +82,282 @@
 extern "C" {
 #endif
 
-#ifndef __IAsyncInfo_FWD_DEFINED__
-#define __IAsyncInfo_FWD_DEFINED__
-typedef interface IAsyncInfo IAsyncInfo;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncInfo_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncInfo_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncInfo __x_ABI_CWindows_CFoundation_CIAsyncInfo;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncInfo;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IAsyncAction_FWD_DEFINED__
-#define __IAsyncAction_FWD_DEFINED__
-typedef interface IAsyncAction IAsyncAction;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncAction;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IAsyncOperation_FWD_DEFINED__
-#define __IAsyncOperation_FWD_DEFINED__
-typedef interface IAsyncOperation IAsyncOperation;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncOperation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncOperation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncOperation __x_ABI_CWindows_CFoundation_CIAsyncOperation;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncOperation;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
-#define __AsyncActionCompletedHandler_FWD_DEFINED__
-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+#ifndef ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface AsyncActionCompletedHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __TypedEventHandler_FWD_DEFINED__
-#define __TypedEventHandler_FWD_DEFINED__
-typedef interface TypedEventHandler TypedEventHandler;
+#ifndef ____x_ABI_CWindows_CFoundation_CTypedEventHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CTypedEventHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CTypedEventHandler __x_ABI_CWindows_CFoundation_CTypedEventHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface TypedEventHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-struct DateTime;
-
-struct EventRegistrationToken;
-
-#ifndef __IVectorView_FWD_DEFINED__
-#define __IVectorView_FWD_DEFINED__
-typedef interface IVectorView IVectorView;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            struct DateTime;
+        }
+    }
+}
+extern "C" {
+#else
+struct __x_ABI_CWindows_CFoundation_CDateTime;
 #endif
 
-#ifndef __IPropertySet_FWD_DEFINED__
-#define __IPropertySet_FWD_DEFINED__
-typedef interface IPropertySet IPropertySet;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            struct EventRegistrationToken;
+        }
+    }
+}
+extern "C" {
+#else
+struct __x_ABI_CWindows_CFoundation_CEventRegistrationToken;
 #endif
 
-typedef enum AsyncStatus {
-    Started = 0,
-    Completed = 1,
-    Canceled = 2,
-    Error = 3
-} AsyncStatus;
-typedef struct DateTime {
-    UINT64 UniversalTime;
-} DateTime;
-typedef struct EventRegistrationToken {
-    UINT64 Value;
-} EventRegistrationToken;
+#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIVectorView_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CCollections_CIVectorView_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIVectorView __x_ABI_CWindows_CFoundation_CCollections_CIVectorView;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                interface IVectorView;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                interface IPropertySet;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 /*****************************************************************************
  * IAsyncInfo interface
+ *
  */
-#ifndef __IAsyncInfo_INTERFACE_DEFINED__
-#define __IAsyncInfo_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncInfo_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncInfo_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("00000036-0000-0000-c000-000000000046")
-IAsyncInfo : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Id(
-        unsigned int *id) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            MIDL_INTERFACE("00000036-0000-0000-c000-000000000046")
+            IAsyncInfo : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_Id(
+                    unsigned int *id) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Status(
-        AsyncStatus *status) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Status(
+                    enum AsyncStatus *status) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
-        HRESULT *errorCode) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
+                    HRESULT *errorCode) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE Cancel(
-        ) = 0;
+                virtual HRESULT STDMETHODCALLTYPE Cancel(
+                    ) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE Close(
-        ) = 0;
+                virtual HRESULT STDMETHODCALLTYPE Close(
+                    ) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
+__CRT_UUID_DECL(ABI::Windows::Foundation::IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
 #endif
 #else
-typedef struct IAsyncInfoVtbl {
+typedef struct __x_ABI_CWindows_CFoundation_CIAsyncInfoVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IAsyncInfo* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IAsyncInfo* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         TrustLevel *trustLevel);
 
     /*** IAsyncInfo methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Id)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         unsigned int *id);
 
     HRESULT (STDMETHODCALLTYPE *get_Status)(
-        IAsyncInfo* This,
-        AsyncStatus *status);
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
+        enum __x_ABI_CWindows_CFoundation_CAsyncStatus *status);
 
     HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
-        IAsyncInfo* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This,
         HRESULT *errorCode);
 
     HRESULT (STDMETHODCALLTYPE *Cancel)(
-        IAsyncInfo* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This);
 
     HRESULT (STDMETHODCALLTYPE *Close)(
-        IAsyncInfo* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncInfo *This);
 
     END_INTERFACE
-} IAsyncInfoVtbl;
-interface IAsyncInfo {
-    CONST_VTBL IAsyncInfoVtbl* lpVtbl;
+} __x_ABI_CWindows_CFoundation_CIAsyncInfoVtbl;
+
+interface __x_ABI_CWindows_CFoundation_CIAsyncInfo {
+    CONST_VTBL __x_ABI_CWindows_CFoundation_CIAsyncInfoVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAsyncInfo_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IAsyncInfo methods ***/
-#define IAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
-#define IAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
-#define IAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This)
-#define IAsyncInfo_Close(This) (This)->lpVtbl->Close(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncInfo_Close(This) (This)->lpVtbl->Close(This)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IAsyncInfo_QueryInterface(IAsyncInfo* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_QueryInterface(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IAsyncInfo_AddRef(IAsyncInfo* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIAsyncInfo_AddRef(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IAsyncInfo_Release(IAsyncInfo* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIAsyncInfo_Release(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IAsyncInfo_GetIids(IAsyncInfo* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetIids(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IAsyncInfo_GetRuntimeClassName(IAsyncInfo* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IAsyncInfo_GetTrustLevel(IAsyncInfo* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IAsyncInfo methods ***/
-static FORCEINLINE HRESULT IAsyncInfo_get_Id(IAsyncInfo* This,unsigned int *id) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_Id(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,unsigned int *id) {
     return This->lpVtbl->get_Id(This,id);
 }
-static FORCEINLINE HRESULT IAsyncInfo_get_Status(IAsyncInfo* This,AsyncStatus *status) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_Status(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,enum __x_ABI_CWindows_CFoundation_CAsyncStatus *status) {
     return This->lpVtbl->get_Status(This,status);
 }
-static FORCEINLINE HRESULT IAsyncInfo_get_ErrorCode(IAsyncInfo* This,HRESULT *errorCode) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_get_ErrorCode(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This,HRESULT *errorCode) {
     return This->lpVtbl->get_ErrorCode(This,errorCode);
 }
-static FORCEINLINE HRESULT IAsyncInfo_Cancel(IAsyncInfo* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_Cancel(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This) {
     return This->lpVtbl->Cancel(This);
 }
-static FORCEINLINE HRESULT IAsyncInfo_Close(IAsyncInfo* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncInfo_Close(__x_ABI_CWindows_CFoundation_CIAsyncInfo* This) {
     return This->lpVtbl->Close(This);
 }
 #endif
@@ -239,162 +365,133 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Id_Proxy(
-    IAsyncInfo* This,
-    unsigned int *id);
-void __RPC_STUB IAsyncInfo_get_Id_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Status_Proxy(
-    IAsyncInfo* This,
-    AsyncStatus *status);
-void __RPC_STUB IAsyncInfo_get_Status_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_ErrorCode_Proxy(
-    IAsyncInfo* This,
-    HRESULT *errorCode);
-void __RPC_STUB IAsyncInfo_get_ErrorCode_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IAsyncInfo_Cancel_Proxy(
-    IAsyncInfo* This);
-void __RPC_STUB IAsyncInfo_Cancel_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IAsyncInfo_Close_Proxy(
-    IAsyncInfo* This);
-void __RPC_STUB IAsyncInfo_Close_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IAsyncInfo_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CFoundation_CIAsyncInfo_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IASyncAction interface
+ *
  */
-#ifndef __IASyncAction_INTERFACE_DEFINED__
-#define __IASyncAction_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CFoundation_CIASyncAction_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIASyncAction_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
+DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
-IASyncAction : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE put_Completed(
-        AsyncActionCompletedHandler *handler) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
+            IASyncAction : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE put_Completed(
+                    AsyncActionCompletedHandler *handler) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Completed(
-        AsyncActionCompletedHandler **handler) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Completed(
+                    AsyncActionCompletedHandler **handler) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetResults(
-        ) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetResults(
+                    ) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
+__CRT_UUID_DECL(ABI::Windows::Foundation::IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
 #endif
 #else
-typedef struct IASyncActionVtbl {
+typedef struct __x_ABI_CWindows_CFoundation_CIASyncActionVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IASyncAction* This,
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IASyncAction* This);
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IASyncAction* This);
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IASyncAction* This,
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IASyncAction* This,
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IASyncAction* This,
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
         TrustLevel *trustLevel);
 
     /*** IASyncAction methods ***/
     HRESULT (STDMETHODCALLTYPE *put_Completed)(
-        IASyncAction* This,
-        AsyncActionCompletedHandler *handler);
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *handler);
 
     HRESULT (STDMETHODCALLTYPE *get_Completed)(
-        IASyncAction* This,
-        AsyncActionCompletedHandler **handler);
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler **handler);
 
     HRESULT (STDMETHODCALLTYPE *GetResults)(
-        IASyncAction* This);
+        __x_ABI_CWindows_CFoundation_CIASyncAction *This);
 
     END_INTERFACE
-} IASyncActionVtbl;
-interface IASyncAction {
-    CONST_VTBL IASyncActionVtbl* lpVtbl;
+} __x_ABI_CWindows_CFoundation_CIASyncActionVtbl;
+
+interface __x_ABI_CWindows_CFoundation_CIASyncAction {
+    CONST_VTBL __x_ABI_CWindows_CFoundation_CIASyncActionVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IASyncAction_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IASyncAction methods ***/
-#define IASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
-#define IASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
-#define IASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __x_ABI_CWindows_CFoundation_CIASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IASyncAction_QueryInterface(IASyncAction* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_QueryInterface(__x_ABI_CWindows_CFoundation_CIASyncAction* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IASyncAction_AddRef(IASyncAction* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIASyncAction_AddRef(__x_ABI_CWindows_CFoundation_CIASyncAction* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IASyncAction_Release(IASyncAction* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIASyncAction_Release(__x_ABI_CWindows_CFoundation_CIASyncAction* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IASyncAction_GetIids(IASyncAction* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_GetIids(__x_ABI_CWindows_CFoundation_CIASyncAction* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IASyncAction_GetRuntimeClassName(IASyncAction* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIASyncAction* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IASyncAction_GetTrustLevel(IASyncAction* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIASyncAction* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IASyncAction methods ***/
-static FORCEINLINE HRESULT IASyncAction_put_Completed(IASyncAction* This,AsyncActionCompletedHandler *handler) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_put_Completed(__x_ABI_CWindows_CFoundation_CIASyncAction* This,__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *handler) {
     return This->lpVtbl->put_Completed(This,handler);
 }
-static FORCEINLINE HRESULT IASyncAction_get_Completed(IASyncAction* This,AsyncActionCompletedHandler **handler) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_get_Completed(__x_ABI_CWindows_CFoundation_CIASyncAction* This,__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler **handler) {
     return This->lpVtbl->get_Completed(This,handler);
 }
-static FORCEINLINE HRESULT IASyncAction_GetResults(IASyncAction* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIASyncAction_GetResults(__x_ABI_CWindows_CFoundation_CIASyncAction* This) {
     return This->lpVtbl->GetResults(This);
 }
 #endif
@@ -402,100 +499,86 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IASyncAction_put_Completed_Proxy(
-    IASyncAction* This,
-    AsyncActionCompletedHandler *handler);
-void __RPC_STUB IASyncAction_put_Completed_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IASyncAction_get_Completed_Proxy(
-    IASyncAction* This,
-    AsyncActionCompletedHandler **handler);
-void __RPC_STUB IASyncAction_get_Completed_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IASyncAction_GetResults_Proxy(
-    IASyncAction* This);
-void __RPC_STUB IASyncAction_GetResults_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IASyncAction_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CFoundation_CIASyncAction_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * AsyncActionCompletedHandler interface
+ *
  */
-#ifndef __AsyncActionCompletedHandler_INTERFACE_DEFINED__
-#define __AsyncActionCompletedHandler_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
+DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
-AsyncActionCompletedHandler : public IUnknown
-{
-    virtual HRESULT STDMETHODCALLTYPE Invoke(
-        IInspectable *asyncAction,
-        AsyncStatus status) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
+            AsyncActionCompletedHandler : public IUnknown
+            {
+                virtual HRESULT STDMETHODCALLTYPE Invoke(
+                    IInspectable *asyncAction,
+                    enum AsyncStatus status) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
+__CRT_UUID_DECL(ABI::Windows::Foundation::AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
 #endif
 #else
-typedef struct AsyncActionCompletedHandlerVtbl {
+typedef struct __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandlerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        AsyncActionCompletedHandler* This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        AsyncActionCompletedHandler* This);
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        AsyncActionCompletedHandler* This);
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *This);
 
     /*** AsyncActionCompletedHandler methods ***/
     HRESULT (STDMETHODCALLTYPE *Invoke)(
-        AsyncActionCompletedHandler* This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *This,
         IInspectable *asyncAction,
-        AsyncStatus status);
+        enum __x_ABI_CWindows_CFoundation_CAsyncStatus status);
 
     END_INTERFACE
-} AsyncActionCompletedHandlerVtbl;
-interface AsyncActionCompletedHandler {
-    CONST_VTBL AsyncActionCompletedHandlerVtbl* lpVtbl;
+} __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandlerVtbl;
+
+interface __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler {
+    CONST_VTBL __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandlerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define AsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define AsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define AsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
 /*** AsyncActionCompletedHandler methods ***/
-#define AsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status)
+#define __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT AsyncActionCompletedHandler_QueryInterface(AsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_QueryInterface(__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG AsyncActionCompletedHandler_AddRef(AsyncActionCompletedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_AddRef(__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG AsyncActionCompletedHandler_Release(AsyncActionCompletedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_Release(__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler* This) {
     return This->lpVtbl->Release(This);
 }
 /*** AsyncActionCompletedHandler methods ***/
-static FORCEINLINE HRESULT AsyncActionCompletedHandler_Invoke(AsyncActionCompletedHandler* This,IInspectable *asyncAction,AsyncStatus status) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_Invoke(__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler* This,IInspectable *asyncAction,enum __x_ABI_CWindows_CFoundation_CAsyncStatus status) {
     return This->lpVtbl->Invoke(This,asyncAction,status);
 }
 #endif
@@ -503,174 +586,174 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE AsyncActionCompletedHandler_Invoke_Proxy(
-    AsyncActionCompletedHandler* This,
-    IInspectable *asyncAction,
-    AsyncStatus status);
-void __RPC_STUB AsyncActionCompletedHandler_Invoke_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __AsyncActionCompletedHandler_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IAsyncOperation interface
+ *
  */
-#ifndef __IAsyncOperation_INTERFACE_DEFINED__
-#define __IAsyncOperation_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncOperation_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncOperation_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2);
+DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2")
-IAsyncOperation : public IAsyncInfo
-{
-    virtual HRESULT STDMETHODCALLTYPE put_Completed(
-        AsyncActionCompletedHandler *handler) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2")
+            IAsyncOperation : public IAsyncInfo
+            {
+                virtual HRESULT STDMETHODCALLTYPE put_Completed(
+                    AsyncActionCompletedHandler *handler) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Completed(
-        AsyncActionCompletedHandler **handler) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Completed(
+                    AsyncActionCompletedHandler **handler) = 0;
 
-    virtual IInspectable * STDMETHODCALLTYPE GetResults(
-        ) = 0;
+                virtual IInspectable * STDMETHODCALLTYPE GetResults(
+                    ) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2)
+__CRT_UUID_DECL(ABI::Windows::Foundation::IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2)
 #endif
 #else
-typedef struct IAsyncOperationVtbl {
+typedef struct __x_ABI_CWindows_CFoundation_CIAsyncOperationVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IAsyncOperation* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IAsyncOperation* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         TrustLevel *trustLevel);
 
     /*** IAsyncInfo methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Id)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         unsigned int *id);
 
     HRESULT (STDMETHODCALLTYPE *get_Status)(
-        IAsyncOperation* This,
-        AsyncStatus *status);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
+        enum __x_ABI_CWindows_CFoundation_CAsyncStatus *status);
 
     HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
-        IAsyncOperation* This,
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
         HRESULT *errorCode);
 
     HRESULT (STDMETHODCALLTYPE *Cancel)(
-        IAsyncOperation* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This);
 
     HRESULT (STDMETHODCALLTYPE *Close)(
-        IAsyncOperation* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This);
 
     /*** IAsyncOperation methods ***/
     HRESULT (STDMETHODCALLTYPE *put_Completed)(
-        IAsyncOperation* This,
-        AsyncActionCompletedHandler *handler);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *handler);
 
     HRESULT (STDMETHODCALLTYPE *get_Completed)(
-        IAsyncOperation* This,
-        AsyncActionCompletedHandler **handler);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This,
+        __x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler **handler);
 
     IInspectable * (STDMETHODCALLTYPE *GetResults)(
-        IAsyncOperation* This);
+        __x_ABI_CWindows_CFoundation_CIAsyncOperation *This);
 
     END_INTERFACE
-} IAsyncOperationVtbl;
-interface IAsyncOperation {
-    CONST_VTBL IAsyncOperationVtbl* lpVtbl;
+} __x_ABI_CWindows_CFoundation_CIAsyncOperationVtbl;
+
+interface __x_ABI_CWindows_CFoundation_CIAsyncOperation {
+    CONST_VTBL __x_ABI_CWindows_CFoundation_CIAsyncOperationVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IAsyncInfo methods ***/
-#define IAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
-#define IAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
-#define IAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This)
-#define IAsyncOperation_Close(This) (This)->lpVtbl->Close(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_Close(This) (This)->lpVtbl->Close(This)
 /*** IAsyncOperation methods ***/
-#define IAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
-#define IAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
-#define IAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IAsyncOperation_QueryInterface(IAsyncOperation* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_QueryInterface(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IAsyncOperation_AddRef(IAsyncOperation* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIAsyncOperation_AddRef(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IAsyncOperation_Release(IAsyncOperation* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIAsyncOperation_Release(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IAsyncOperation_GetIids(IAsyncOperation* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetIids(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IAsyncOperation_GetRuntimeClassName(IAsyncOperation* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IAsyncOperation_GetTrustLevel(IAsyncOperation* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IAsyncInfo methods ***/
-static FORCEINLINE HRESULT IAsyncOperation_get_Id(IAsyncOperation* This,unsigned int *id) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Id(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,unsigned int *id) {
     return This->lpVtbl->get_Id(This,id);
 }
-static FORCEINLINE HRESULT IAsyncOperation_get_Status(IAsyncOperation* This,AsyncStatus *status) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Status(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,enum __x_ABI_CWindows_CFoundation_CAsyncStatus *status) {
     return This->lpVtbl->get_Status(This,status);
 }
-static FORCEINLINE HRESULT IAsyncOperation_get_ErrorCode(IAsyncOperation* This,HRESULT *errorCode) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_ErrorCode(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,HRESULT *errorCode) {
     return This->lpVtbl->get_ErrorCode(This,errorCode);
 }
-static FORCEINLINE HRESULT IAsyncOperation_Cancel(IAsyncOperation* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_Cancel(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This) {
     return This->lpVtbl->Cancel(This);
 }
-static FORCEINLINE HRESULT IAsyncOperation_Close(IAsyncOperation* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_Close(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This) {
     return This->lpVtbl->Close(This);
 }
 /*** IAsyncOperation methods ***/
-static FORCEINLINE HRESULT IAsyncOperation_put_Completed(IAsyncOperation* This,AsyncActionCompletedHandler *handler) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_put_Completed(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler *handler) {
     return This->lpVtbl->put_Completed(This,handler);
 }
-static FORCEINLINE HRESULT IAsyncOperation_get_Completed(IAsyncOperation* This,AsyncActionCompletedHandler **handler) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIAsyncOperation_get_Completed(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This,__x_ABI_CWindows_CFoundation_CAsyncActionCompletedHandler **handler) {
     return This->lpVtbl->get_Completed(This,handler);
 }
-static FORCEINLINE IInspectable * IAsyncOperation_GetResults(IAsyncOperation* This) {
+static FORCEINLINE IInspectable * __x_ABI_CWindows_CFoundation_CIAsyncOperation_GetResults(__x_ABI_CWindows_CFoundation_CIAsyncOperation* This) {
     return This->lpVtbl->GetResults(This);
 }
 #endif
@@ -678,31 +761,7 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IAsyncOperation_put_Completed_Proxy(
-    IAsyncOperation* This,
-    AsyncActionCompletedHandler *handler);
-void __RPC_STUB IAsyncOperation_put_Completed_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IAsyncOperation_get_Completed_Proxy(
-    IAsyncOperation* This,
-    AsyncActionCompletedHandler **handler);
-void __RPC_STUB IAsyncOperation_get_Completed_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-IInspectable * STDMETHODCALLTYPE IAsyncOperation_GetResults_Proxy(
-    IAsyncOperation* This);
-void __RPC_STUB IAsyncOperation_GetResults_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IAsyncOperation_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CFoundation_CIAsyncOperation_INTERFACE_DEFINED__ */
 
 /* Begin additional prototypes for all interfaces */
 
diff --git a/mingw-w64-headers/include/windows.storage.h b/mingw-w64-headers/include/windows.storage.h
index 7e4c429..ef3fff7 100644
--- a/mingw-w64-headers/include/windows.storage.h
+++ b/mingw-w64-headers/include/windows.storage.h
@@ -1,11 +1,12 @@
-/*** Autogenerated by WIDL 1.6 from include/windows.storage.idl - Do not edit ***/
+/*** Autogenerated by WIDL 6.0-rc1 from include/windows.storage.idl - Do not edit ***/
 
+#ifdef _WIN32
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
 #define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
-
 #include <rpc.h>
 #include <rpcndr.h>
+#endif
 
 #ifndef COM_NO_WINDOWS_H
 #include <windows.h>
@@ -17,54 +18,144 @@
 
 /* Forward declarations */
 
-#ifndef __IStorageItem_FWD_DEFINED__
-#define __IStorageItem_FWD_DEFINED__
-typedef interface IStorageItem IStorageItem;
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageItem_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageItem_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIStorageItem __x_ABI_CWindows_CStorage_CIStorageItem;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IStorageItem;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IKnownFoldersStatics_FWD_DEFINED__
-#define __IKnownFoldersStatics_FWD_DEFINED__
-typedef interface IKnownFoldersStatics IKnownFoldersStatics;
+#ifndef ____x_ABI_CWindows_CStorage_CIKnownFoldersStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIKnownFoldersStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIKnownFoldersStatics __x_ABI_CWindows_CStorage_CIKnownFoldersStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IKnownFoldersStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IStorageFolder_FWD_DEFINED__
-#define __IStorageFolder_FWD_DEFINED__
-typedef interface IStorageFolder IStorageFolder;
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageFolder_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageFolder_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIStorageFolder __x_ABI_CWindows_CStorage_CIStorageFolder;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IStorageFolder;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationDataContainer_FWD_DEFINED__
-#define __IApplicationDataContainer_FWD_DEFINED__
-typedef interface IApplicationDataContainer IApplicationDataContainer;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataContainer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataContainer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationDataContainer __x_ABI_CWindows_CStorage_CIApplicationDataContainer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationDataContainer;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationData_FWD_DEFINED__
-#define __IApplicationData_FWD_DEFINED__
-typedef interface IApplicationData IApplicationData;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationData_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationData_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationData __x_ABI_CWindows_CStorage_CIApplicationData;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationData;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationData2_FWD_DEFINED__
-#define __IApplicationData2_FWD_DEFINED__
-typedef interface IApplicationData2 IApplicationData2;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationData2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationData2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationData2 __x_ABI_CWindows_CStorage_CIApplicationData2;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationData2;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationDataStatics_FWD_DEFINED__
-#define __IApplicationDataStatics_FWD_DEFINED__
-typedef interface IApplicationDataStatics IApplicationDataStatics;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationDataStatics __x_ABI_CWindows_CStorage_CIApplicationDataStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationDataStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ApplicationDataSetVersionHandler_FWD_DEFINED__
-#define __ApplicationDataSetVersionHandler_FWD_DEFINED__
-typedef interface ApplicationDataSetVersionHandler ApplicationDataSetVersionHandler;
+#ifndef ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler __x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ApplicationDataSetVersionHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ISetVersionRequest_FWD_DEFINED__
-#define __ISetVersionRequest_FWD_DEFINED__
-typedef interface ISetVersionRequest ISetVersionRequest;
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionRequest_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionRequest_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CISetVersionRequest __x_ABI_CWindows_CStorage_CISetVersionRequest;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ISetVersionRequest;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ISetVersionDeferral_FWD_DEFINED__
-#define __ISetVersionDeferral_FWD_DEFINED__
-typedef interface ISetVersionDeferral ISetVersionDeferral;
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionDeferral_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionDeferral_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CISetVersionDeferral __x_ABI_CWindows_CStorage_CISetVersionDeferral;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ISetVersionDeferral;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
 /* Headers for imported files */
@@ -77,329 +168,503 @@
 extern "C" {
 #endif
 
-#ifndef __IAsyncAction_FWD_DEFINED__
-#define __IAsyncAction_FWD_DEFINED__
-typedef interface IAsyncAction IAsyncAction;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncAction;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __TypedEventHandler_FWD_DEFINED__
-#define __TypedEventHandler_FWD_DEFINED__
-typedef interface TypedEventHandler TypedEventHandler;
+#ifndef ____x_ABI_CWindows_CFoundation_CTypedEventHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CTypedEventHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CTypedEventHandler __x_ABI_CWindows_CFoundation_CTypedEventHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface TypedEventHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IPropertySet_FWD_DEFINED__
-#define __IPropertySet_FWD_DEFINED__
-typedef interface IPropertySet IPropertySet;
+#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                interface IPropertySet;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IMapView_FWD_DEFINED__
-#define __IMapView_FWD_DEFINED__
-typedef interface IMapView IMapView;
+#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIMapView_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CCollections_CIMapView_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIMapView __x_ABI_CWindows_CFoundation_CCollections_CIMapView;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                interface IMapView;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IStorageItem_FWD_DEFINED__
-#define __IStorageItem_FWD_DEFINED__
-typedef interface IStorageItem IStorageItem;
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageItem_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageItem_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIStorageItem __x_ABI_CWindows_CStorage_CIStorageItem;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IStorageItem;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IStorageFolder_FWD_DEFINED__
-#define __IStorageFolder_FWD_DEFINED__
-typedef interface IStorageFolder IStorageFolder;
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageFolder_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageFolder_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIStorageFolder __x_ABI_CWindows_CStorage_CIStorageFolder;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IStorageFolder;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationData_FWD_DEFINED__
-#define __IApplicationData_FWD_DEFINED__
-typedef interface IApplicationData IApplicationData;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationData_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationData_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationData __x_ABI_CWindows_CStorage_CIApplicationData;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationData;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationData2_FWD_DEFINED__
-#define __IApplicationData2_FWD_DEFINED__
-typedef interface IApplicationData2 IApplicationData2;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationDataStatics __x_ABI_CWindows_CStorage_CIApplicationDataStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationDataStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationDataStatics_FWD_DEFINED__
-#define __IApplicationDataStatics_FWD_DEFINED__
-typedef interface IApplicationDataStatics IApplicationDataStatics;
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IApplicationDataSetVersionHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IApplicationDataSetVersionHandler_FWD_DEFINED__
-#define __IApplicationDataSetVersionHandler_FWD_DEFINED__
-typedef interface IApplicationDataSetVersionHandler IApplicationDataSetVersionHandler;
+#ifndef ____x_ABI_CWindows_CStorage_CApplicationDataContainer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CApplicationDataContainer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CApplicationDataContainer __x_ABI_CWindows_CStorage_CApplicationDataContainer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ApplicationDataContainer;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ApplicationDataContainer_FWD_DEFINED__
-#define __ApplicationDataContainer_FWD_DEFINED__
-typedef interface ApplicationDataContainer ApplicationDataContainer;
+#ifndef ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler __x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ApplicationDataSetVersionHandler;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ApplicationDataSetVersionHandler_FWD_DEFINED__
-#define __ApplicationDataSetVersionHandler_FWD_DEFINED__
-typedef interface ApplicationDataSetVersionHandler ApplicationDataSetVersionHandler;
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionRequest_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionRequest_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CISetVersionRequest __x_ABI_CWindows_CStorage_CISetVersionRequest;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ISetVersionRequest;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ISetVersionRequest_FWD_DEFINED__
-#define __ISetVersionRequest_FWD_DEFINED__
-typedef interface ISetVersionRequest ISetVersionRequest;
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionDeferral_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionDeferral_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CISetVersionDeferral __x_ABI_CWindows_CStorage_CISetVersionDeferral;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface ISetVersionDeferral;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __ISetVersionDeferral_FWD_DEFINED__
-#define __ISetVersionDeferral_FWD_DEFINED__
-typedef interface ISetVersionDeferral ISetVersionDeferral;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum StorageDeleteOption;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CStorageDeleteOption;
 #endif
 
-enum StorageDeleteOption;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum NameCollisionOption;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CNameCollisionOption;
+#endif
 
-enum NameCollisionOption;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum StorageItemTypes;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CStorageItemTypes;
+#endif
 
-enum StorageItemTypes;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum ApplicationDataLocality;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CApplicationDataLocality;
+#endif
 
-enum ApplicationDataLocality;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum ApplicationDataCreateDisposition;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CApplicationDataCreateDisposition;
+#endif
 
-enum ApplicationDataCreateDisposition;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum FileAttributes;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CFileAttributes;
+#endif
 
-enum FileAttributes;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            enum CreationCollisionOption;
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CCreationCollisionOption;
+#endif
 
-enum CreationCollisionOption;
-
-typedef enum NameCollisionoption {
-    NameCollisionoption_GenerateUniqueName = 0,
-    NameCollisionoption_ReplaceExisting = 1,
-    NameCollisionoption_FailIfExists = 2
-} NameCollisionOption;
-typedef enum StorageDeleteOption {
-    StorageDeleteOption_Default = 0,
-    StorageDeleteOption_PermanentDelete = 1
-} StorageDeleteOption;
-typedef enum StorageItemTypes {
-    StorageItemTypes_None = 0,
-    StorageItemTypes_File = 1,
-    StorageItemTypes_Folder = 2
-} StorageItemTypes;
-typedef enum ApplicationDataCreateDisposition {
-    ApplicationDataCreateDisposition_Always = 0,
-    ApplicationDataCreateDisposition_Existing = 1
-} ApplicationDataCreateDisposition;
-typedef enum ApplicationDataLocality {
-    ApplicationDataLocality_Local = 0,
-    ApplicationDataLocality_Roaming = 1,
-    ApplicationDataLocality_Temporary = 2
-} ApplicationDataLocality;
-typedef enum FileAttributes {
-    FileAttributes_Normal = 0,
-    FileAttributes_ReadOnly = 1,
-    FileAttributes_Directory = 2,
-    FileAttributes_Archive = 3,
-    FileAttributes_Temporary = 4
-} FileAttributes;
-typedef enum CreationCollisionOption {
-    CreationCollisionOption_GenerateUniqueName = 0,
-    CreationCollisionOption_ReplaceExisting = 1,
-    CreationCollisionOption_FailIfExists = 2,
-    CreationCollisionOption_OpenIfExists = 3
-} CreationCollisionOption;
 /*****************************************************************************
  * IStorageItem interface
+ *
  */
-#ifndef __IStorageItem_INTERFACE_DEFINED__
-#define __IStorageItem_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageItem_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageItem_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("4207a996-ca2f-42f7-bde8-8b10457a7f30")
-IStorageItem : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE RenameAsyncOverloadDefaultOptions(
-        HSTRING desiredName,
-        IInspectable **action) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("4207a996-ca2f-42f7-bde8-8b10457a7f30")
+            IStorageItem : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE RenameAsyncOverloadDefaultOptions(
+                    HSTRING desiredName,
+                    IInspectable **action) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE RenameAsync(
-        HSTRING desiredName,
-        NameCollisionOption option,
-        IInspectable **action) = 0;
+                virtual HRESULT STDMETHODCALLTYPE RenameAsync(
+                    HSTRING desiredName,
+                    enum NameCollisionoption option,
+                    IInspectable **action) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE DeleteAsyncOverloadDefaultOptions(
-        IInspectable **action) = 0;
+                virtual HRESULT STDMETHODCALLTYPE DeleteAsyncOverloadDefaultOptions(
+                    IInspectable **action) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE DeleteAsync(
-        StorageDeleteOption option,
-        IInspectable **action) = 0;
+                virtual HRESULT STDMETHODCALLTYPE DeleteAsync(
+                    enum StorageDeleteOption option,
+                    IInspectable **action) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetBasicPropertiesAsync(
-        IInspectable **action) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetBasicPropertiesAsync(
+                    IInspectable **action) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Name(
-        HSTRING *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Name(
+                    HSTRING *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Path(
-        HSTRING *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Path(
+                    HSTRING *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Attributes(
-        FileAttributes *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Attributes(
+                    enum FileAttributes *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_DateCreated(
-        DateTime *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_DateCreated(
+                    struct DateTime *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE IsOfType(
-        StorageItemTypes itemType,
-        boolean *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE IsOfType(
+                    enum StorageItemTypes itemType,
+                    boolean *value) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30)
+__CRT_UUID_DECL(ABI::Windows::Storage::IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30)
 #endif
 #else
-typedef struct IStorageItemVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIStorageItemVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IStorageItem* This);
+        __x_ABI_CWindows_CStorage_CIStorageItem *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IStorageItem* This);
+        __x_ABI_CWindows_CStorage_CIStorageItem *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         TrustLevel *trustLevel);
 
     /*** IStorageItem methods ***/
     HRESULT (STDMETHODCALLTYPE *RenameAsyncOverloadDefaultOptions)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         HSTRING desiredName,
         IInspectable **action);
 
     HRESULT (STDMETHODCALLTYPE *RenameAsync)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         HSTRING desiredName,
-        NameCollisionOption option,
+        enum __x_ABI_CWindows_CStorage_CNameCollisionoption option,
         IInspectable **action);
 
     HRESULT (STDMETHODCALLTYPE *DeleteAsyncOverloadDefaultOptions)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         IInspectable **action);
 
     HRESULT (STDMETHODCALLTYPE *DeleteAsync)(
-        IStorageItem* This,
-        StorageDeleteOption option,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
+        enum __x_ABI_CWindows_CStorage_CStorageDeleteOption option,
         IInspectable **action);
 
     HRESULT (STDMETHODCALLTYPE *GetBasicPropertiesAsync)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         IInspectable **action);
 
     HRESULT (STDMETHODCALLTYPE *get_Name)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         HSTRING *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Path)(
-        IStorageItem* This,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
         HSTRING *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Attributes)(
-        IStorageItem* This,
-        FileAttributes *value);
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
+        enum __x_ABI_CWindows_CStorage_CFileAttributes *value);
 
     HRESULT (STDMETHODCALLTYPE *get_DateCreated)(
-        IStorageItem* This,
-        DateTime *value);
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
+        struct __x_ABI_CWindows_CFoundation_CDateTime *value);
 
     HRESULT (STDMETHODCALLTYPE *IsOfType)(
-        IStorageItem* This,
-        StorageItemTypes itemType,
+        __x_ABI_CWindows_CStorage_CIStorageItem *This,
+        enum __x_ABI_CWindows_CStorage_CStorageItemTypes itemType,
         boolean *value);
 
     END_INTERFACE
-} IStorageItemVtbl;
-interface IStorageItem {
-    CONST_VTBL IStorageItemVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIStorageItemVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIStorageItem {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIStorageItemVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IStorageItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IStorageItem_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IStorageItem_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IStorageItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IStorageItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IStorageItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IStorageItem methods ***/
-#define IStorageItem_RenameAsyncOverloadDefaultOptions(This,desiredName,action) (This)->lpVtbl->RenameAsyncOverloadDefaultOptions(This,desiredName,action)
-#define IStorageItem_RenameAsync(This,desiredName,option,action) (This)->lpVtbl->RenameAsync(This,desiredName,option,action)
-#define IStorageItem_DeleteAsyncOverloadDefaultOptions(This,action) (This)->lpVtbl->DeleteAsyncOverloadDefaultOptions(This,action)
-#define IStorageItem_DeleteAsync(This,option,action) (This)->lpVtbl->DeleteAsync(This,option,action)
-#define IStorageItem_GetBasicPropertiesAsync(This,action) (This)->lpVtbl->GetBasicPropertiesAsync(This,action)
-#define IStorageItem_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
-#define IStorageItem_get_Path(This,value) (This)->lpVtbl->get_Path(This,value)
-#define IStorageItem_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
-#define IStorageItem_get_DateCreated(This,value) (This)->lpVtbl->get_DateCreated(This,value)
-#define IStorageItem_IsOfType(This,itemType,value) (This)->lpVtbl->IsOfType(This,itemType,value)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_RenameAsyncOverloadDefaultOptions(This,desiredName,action) (This)->lpVtbl->RenameAsyncOverloadDefaultOptions(This,desiredName,action)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_RenameAsync(This,desiredName,option,action) (This)->lpVtbl->RenameAsync(This,desiredName,option,action)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_DeleteAsyncOverloadDefaultOptions(This,action) (This)->lpVtbl->DeleteAsyncOverloadDefaultOptions(This,action)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_DeleteAsync(This,option,action) (This)->lpVtbl->DeleteAsync(This,option,action)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_GetBasicPropertiesAsync(This,action) (This)->lpVtbl->GetBasicPropertiesAsync(This,action)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_get_Path(This,value) (This)->lpVtbl->get_Path(This,value)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_get_DateCreated(This,value) (This)->lpVtbl->get_DateCreated(This,value)
+#define __x_ABI_CWindows_CStorage_CIStorageItem_IsOfType(This,itemType,value) (This)->lpVtbl->IsOfType(This,itemType,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IStorageItem_QueryInterface(IStorageItem* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_QueryInterface(__x_ABI_CWindows_CStorage_CIStorageItem* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IStorageItem_AddRef(IStorageItem* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIStorageItem_AddRef(__x_ABI_CWindows_CStorage_CIStorageItem* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IStorageItem_Release(IStorageItem* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIStorageItem_Release(__x_ABI_CWindows_CStorage_CIStorageItem* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IStorageItem_GetIids(IStorageItem* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_GetIids(__x_ABI_CWindows_CStorage_CIStorageItem* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IStorageItem_GetRuntimeClassName(IStorageItem* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIStorageItem* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IStorageItem_GetTrustLevel(IStorageItem* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_GetTrustLevel(__x_ABI_CWindows_CStorage_CIStorageItem* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IStorageItem methods ***/
-static FORCEINLINE HRESULT IStorageItem_RenameAsyncOverloadDefaultOptions(IStorageItem* This,HSTRING desiredName,IInspectable **action) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_RenameAsyncOverloadDefaultOptions(__x_ABI_CWindows_CStorage_CIStorageItem* This,HSTRING desiredName,IInspectable **action) {
     return This->lpVtbl->RenameAsyncOverloadDefaultOptions(This,desiredName,action);
 }
-static FORCEINLINE HRESULT IStorageItem_RenameAsync(IStorageItem* This,HSTRING desiredName,NameCollisionOption option,IInspectable **action) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_RenameAsync(__x_ABI_CWindows_CStorage_CIStorageItem* This,HSTRING desiredName,enum __x_ABI_CWindows_CStorage_CNameCollisionoption option,IInspectable **action) {
     return This->lpVtbl->RenameAsync(This,desiredName,option,action);
 }
-static FORCEINLINE HRESULT IStorageItem_DeleteAsyncOverloadDefaultOptions(IStorageItem* This,IInspectable **action) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_DeleteAsyncOverloadDefaultOptions(__x_ABI_CWindows_CStorage_CIStorageItem* This,IInspectable **action) {
     return This->lpVtbl->DeleteAsyncOverloadDefaultOptions(This,action);
 }
-static FORCEINLINE HRESULT IStorageItem_DeleteAsync(IStorageItem* This,StorageDeleteOption option,IInspectable **action) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_DeleteAsync(__x_ABI_CWindows_CStorage_CIStorageItem* This,enum __x_ABI_CWindows_CStorage_CStorageDeleteOption option,IInspectable **action) {
     return This->lpVtbl->DeleteAsync(This,option,action);
 }
-static FORCEINLINE HRESULT IStorageItem_GetBasicPropertiesAsync(IStorageItem* This,IInspectable **action) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_GetBasicPropertiesAsync(__x_ABI_CWindows_CStorage_CIStorageItem* This,IInspectable **action) {
     return This->lpVtbl->GetBasicPropertiesAsync(This,action);
 }
-static FORCEINLINE HRESULT IStorageItem_get_Name(IStorageItem* This,HSTRING *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_get_Name(__x_ABI_CWindows_CStorage_CIStorageItem* This,HSTRING *value) {
     return This->lpVtbl->get_Name(This,value);
 }
-static FORCEINLINE HRESULT IStorageItem_get_Path(IStorageItem* This,HSTRING *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_get_Path(__x_ABI_CWindows_CStorage_CIStorageItem* This,HSTRING *value) {
     return This->lpVtbl->get_Path(This,value);
 }
-static FORCEINLINE HRESULT IStorageItem_get_Attributes(IStorageItem* This,FileAttributes *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_get_Attributes(__x_ABI_CWindows_CStorage_CIStorageItem* This,enum __x_ABI_CWindows_CStorage_CFileAttributes *value) {
     return This->lpVtbl->get_Attributes(This,value);
 }
-static FORCEINLINE HRESULT IStorageItem_get_DateCreated(IStorageItem* This,DateTime *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_get_DateCreated(__x_ABI_CWindows_CStorage_CIStorageItem* This,struct __x_ABI_CWindows_CFoundation_CDateTime *value) {
     return This->lpVtbl->get_DateCreated(This,value);
 }
-static FORCEINLINE HRESULT IStorageItem_IsOfType(IStorageItem* This,StorageItemTypes itemType,boolean *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageItem_IsOfType(__x_ABI_CWindows_CStorage_CIStorageItem* This,enum __x_ABI_CWindows_CStorage_CStorageItemTypes itemType,boolean *value) {
     return This->lpVtbl->IsOfType(This,itemType,value);
 }
 #endif
@@ -407,254 +672,178 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IStorageItem_RenameAsyncOverloadDefaultOptions_Proxy(
-    IStorageItem* This,
-    HSTRING desiredName,
-    IInspectable **action);
-void __RPC_STUB IStorageItem_RenameAsyncOverloadDefaultOptions_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_RenameAsync_Proxy(
-    IStorageItem* This,
-    HSTRING desiredName,
-    NameCollisionOption option,
-    IInspectable **action);
-void __RPC_STUB IStorageItem_RenameAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_DeleteAsyncOverloadDefaultOptions_Proxy(
-    IStorageItem* This,
-    IInspectable **action);
-void __RPC_STUB IStorageItem_DeleteAsyncOverloadDefaultOptions_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_DeleteAsync_Proxy(
-    IStorageItem* This,
-    StorageDeleteOption option,
-    IInspectable **action);
-void __RPC_STUB IStorageItem_DeleteAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_GetBasicPropertiesAsync_Proxy(
-    IStorageItem* This,
-    IInspectable **action);
-void __RPC_STUB IStorageItem_GetBasicPropertiesAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_get_Name_Proxy(
-    IStorageItem* This,
-    HSTRING *value);
-void __RPC_STUB IStorageItem_get_Name_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_get_Path_Proxy(
-    IStorageItem* This,
-    HSTRING *value);
-void __RPC_STUB IStorageItem_get_Path_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_get_Attributes_Proxy(
-    IStorageItem* This,
-    FileAttributes *value);
-void __RPC_STUB IStorageItem_get_Attributes_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_get_DateCreated_Proxy(
-    IStorageItem* This,
-    DateTime *value);
-void __RPC_STUB IStorageItem_get_DateCreated_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageItem_IsOfType_Proxy(
-    IStorageItem* This,
-    StorageItemTypes itemType,
-    boolean *value);
-void __RPC_STUB IStorageItem_IsOfType_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IStorageItem_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIStorageItem_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IKnownFoldersStatics interface
+ *
  */
-#ifndef __IKnownFoldersStatics_INTERFACE_DEFINED__
-#define __IKnownFoldersStatics_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIKnownFoldersStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIKnownFoldersStatics_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("5a2a7520-4802-452d-9ad9-4351ada7ec35")
-IKnownFoldersStatics : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_MusicLibrary(
-        IStorageFolder **value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("5a2a7520-4802-452d-9ad9-4351ada7ec35")
+            IKnownFoldersStatics : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_MusicLibrary(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_PicturesLibrary(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_PicturesLibrary(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_VideosLibrary(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_VideosLibrary(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_DocumentsLibrary(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_DocumentsLibrary(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_HomeGroup(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_HomeGroup(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_RemovableDevices(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_RemovableDevices(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_MediaServerDevices(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_MediaServerDevices(
+                    IStorageFolder **value) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35)
+__CRT_UUID_DECL(ABI::Windows::Storage::IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35)
 #endif
 #else
-typedef struct IKnownFoldersStaticsVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIKnownFoldersStaticsVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IKnownFoldersStatics* This,
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IKnownFoldersStatics* This);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IKnownFoldersStatics* This);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IKnownFoldersStatics* This,
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IKnownFoldersStatics* This,
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IKnownFoldersStatics* This,
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
         TrustLevel *trustLevel);
 
     /*** IKnownFoldersStatics methods ***/
     HRESULT (STDMETHODCALLTYPE *get_MusicLibrary)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_PicturesLibrary)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_VideosLibrary)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_DocumentsLibrary)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_HomeGroup)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_RemovableDevices)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_MediaServerDevices)(
-        IKnownFoldersStatics* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIKnownFoldersStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     END_INTERFACE
-} IKnownFoldersStaticsVtbl;
-interface IKnownFoldersStatics {
-    CONST_VTBL IKnownFoldersStaticsVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIKnownFoldersStaticsVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIKnownFoldersStatics {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIKnownFoldersStaticsVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IKnownFoldersStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IKnownFoldersStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IKnownFoldersStatics_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IKnownFoldersStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IKnownFoldersStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IKnownFoldersStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IKnownFoldersStatics methods ***/
-#define IKnownFoldersStatics_get_MusicLibrary(This,value) (This)->lpVtbl->get_MusicLibrary(This,value)
-#define IKnownFoldersStatics_get_PicturesLibrary(This,value) (This)->lpVtbl->get_PicturesLibrary(This,value)
-#define IKnownFoldersStatics_get_VideosLibrary(This,value) (This)->lpVtbl->get_VideosLibrary(This,value)
-#define IKnownFoldersStatics_get_DocumentsLibrary(This,value) (This)->lpVtbl->get_DocumentsLibrary(This,value)
-#define IKnownFoldersStatics_get_HomeGroup(This,value) (This)->lpVtbl->get_HomeGroup(This,value)
-#define IKnownFoldersStatics_get_RemovableDevices(This,value) (This)->lpVtbl->get_RemovableDevices(This,value)
-#define IKnownFoldersStatics_get_MediaServerDevices(This,value) (This)->lpVtbl->get_MediaServerDevices(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_MusicLibrary(This,value) (This)->lpVtbl->get_MusicLibrary(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_PicturesLibrary(This,value) (This)->lpVtbl->get_PicturesLibrary(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_VideosLibrary(This,value) (This)->lpVtbl->get_VideosLibrary(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_DocumentsLibrary(This,value) (This)->lpVtbl->get_DocumentsLibrary(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_HomeGroup(This,value) (This)->lpVtbl->get_HomeGroup(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_RemovableDevices(This,value) (This)->lpVtbl->get_RemovableDevices(This,value)
+#define __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_MediaServerDevices(This,value) (This)->lpVtbl->get_MediaServerDevices(This,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IKnownFoldersStatics_QueryInterface(IKnownFoldersStatics* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_QueryInterface(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IKnownFoldersStatics_AddRef(IKnownFoldersStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_AddRef(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IKnownFoldersStatics_Release(IKnownFoldersStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_Release(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IKnownFoldersStatics_GetIids(IKnownFoldersStatics* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetIids(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_GetRuntimeClassName(IKnownFoldersStatics* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_GetTrustLevel(IKnownFoldersStatics* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_GetTrustLevel(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IKnownFoldersStatics methods ***/
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_MusicLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_MusicLibrary(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_MusicLibrary(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_PicturesLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_PicturesLibrary(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_PicturesLibrary(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_VideosLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_VideosLibrary(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_VideosLibrary(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_DocumentsLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_DocumentsLibrary(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_DocumentsLibrary(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_HomeGroup(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_HomeGroup(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_HomeGroup(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_RemovableDevices(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_RemovableDevices(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_RemovableDevices(This,value);
 }
-static FORCEINLINE HRESULT IKnownFoldersStatics_get_MediaServerDevices(IKnownFoldersStatics* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIKnownFoldersStatics_get_MediaServerDevices(__x_ABI_CWindows_CStorage_CIKnownFoldersStatics* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_MediaServerDevices(This,value);
 }
 #endif
@@ -662,276 +851,229 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_MusicLibrary_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_MusicLibrary_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_PicturesLibrary_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_PicturesLibrary_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_VideosLibrary_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_VideosLibrary_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_DocumentsLibrary_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_DocumentsLibrary_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_HomeGroup_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_HomeGroup_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_RemovableDevices_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_RemovableDevices_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_MediaServerDevices_Proxy(
-    IKnownFoldersStatics* This,
-    IStorageFolder **value);
-void __RPC_STUB IKnownFoldersStatics_get_MediaServerDevices_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IKnownFoldersStatics_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIKnownFoldersStatics_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IStorageFolder interface
+ *
  */
-#ifndef __IStorageFolder_INTERFACE_DEFINED__
-#define __IStorageFolder_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageFolder_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageFolder_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("72d1cb78-b3ef-4f75-a80b-6fd9dae2944b")
-IStorageFolder : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE CreateFileAsyncOverloadDefaultOptions(
-        HSTRING desiredName,
-        IInspectable **operation) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("72d1cb78-b3ef-4f75-a80b-6fd9dae2944b")
+            IStorageFolder : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE CreateFileAsyncOverloadDefaultOptions(
+                    HSTRING desiredName,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateFileAsync(
-        HSTRING desiredName,
-        CreationCollisionOption options,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE CreateFileAsync(
+                    HSTRING desiredName,
+                    enum CreationCollisionOption options,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateFolderAsyncOverloadDefaultOptions(
-        HSTRING desiredName,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE CreateFolderAsyncOverloadDefaultOptions(
+                    HSTRING desiredName,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateFolderAsync(
-        HSTRING desiredName,
-        CreationCollisionOption options,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE CreateFolderAsync(
+                    HSTRING desiredName,
+                    enum CreationCollisionOption options,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetFileAsync(
-        HSTRING name,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetFileAsync(
+                    HSTRING name,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetFolderAsync(
-        HSTRING name,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetFolderAsync(
+                    HSTRING name,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetItemAsync(
-        HSTRING name,
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetItemAsync(
+                    HSTRING name,
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetFilesAsyncOverloadDefaultOptionsStartAndCount(
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetFilesAsyncOverloadDefaultOptionsStartAndCount(
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetFoldersAsyncOverloadDefaultOptionsStartAndCount(
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetFoldersAsyncOverloadDefaultOptionsStartAndCount(
+                    IInspectable **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetItemsAsyncOverloadDefaultStartAndCount(
-        IInspectable **operation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetItemsAsyncOverloadDefaultStartAndCount(
+                    IInspectable **operation) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b)
+__CRT_UUID_DECL(ABI::Windows::Storage::IStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b)
 #endif
 #else
-typedef struct IStorageFolderVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIStorageFolderVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IStorageFolder* This);
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IStorageFolder* This);
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         TrustLevel *trustLevel);
 
     /*** IStorageFolder methods ***/
     HRESULT (STDMETHODCALLTYPE *CreateFileAsyncOverloadDefaultOptions)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING desiredName,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *CreateFileAsync)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING desiredName,
-        CreationCollisionOption options,
+        enum __x_ABI_CWindows_CStorage_CCreationCollisionOption options,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *CreateFolderAsyncOverloadDefaultOptions)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING desiredName,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *CreateFolderAsync)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING desiredName,
-        CreationCollisionOption options,
+        enum __x_ABI_CWindows_CStorage_CCreationCollisionOption options,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetFileAsync)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING name,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetFolderAsync)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING name,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetItemAsync)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         HSTRING name,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetFilesAsyncOverloadDefaultOptionsStartAndCount)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetFoldersAsyncOverloadDefaultOptionsStartAndCount)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         IInspectable **operation);
 
     HRESULT (STDMETHODCALLTYPE *GetItemsAsyncOverloadDefaultStartAndCount)(
-        IStorageFolder* This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder *This,
         IInspectable **operation);
 
     END_INTERFACE
-} IStorageFolderVtbl;
-interface IStorageFolder {
-    CONST_VTBL IStorageFolderVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIStorageFolderVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIStorageFolder {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIStorageFolderVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IStorageFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IStorageFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IStorageFolder_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IStorageFolder_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IStorageFolder_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IStorageFolder_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IStorageFolder methods ***/
-#define IStorageFolder_CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation)
-#define IStorageFolder_CreateFileAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFileAsync(This,desiredName,options,operation)
-#define IStorageFolder_CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation)
-#define IStorageFolder_CreateFolderAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFolderAsync(This,desiredName,options,operation)
-#define IStorageFolder_GetFileAsync(This,name,operation) (This)->lpVtbl->GetFileAsync(This,name,operation)
-#define IStorageFolder_GetFolderAsync(This,name,operation) (This)->lpVtbl->GetFolderAsync(This,name,operation)
-#define IStorageFolder_GetItemAsync(This,name,operation) (This)->lpVtbl->GetItemAsync(This,name,operation)
-#define IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation)
-#define IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation)
-#define IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(This,operation) (This)->lpVtbl->GetItemsAsyncOverloadDefaultStartAndCount(This,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFileAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFileAsync(This,desiredName,options,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFolderAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFolderAsync(This,desiredName,options,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetFileAsync(This,name,operation) (This)->lpVtbl->GetFileAsync(This,name,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetFolderAsync(This,name,operation) (This)->lpVtbl->GetFolderAsync(This,name,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetItemAsync(This,name,operation) (This)->lpVtbl->GetItemAsync(This,name,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation)
+#define __x_ABI_CWindows_CStorage_CIStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(This,operation) (This)->lpVtbl->GetItemsAsyncOverloadDefaultStartAndCount(This,operation)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IStorageFolder_QueryInterface(IStorageFolder* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_QueryInterface(__x_ABI_CWindows_CStorage_CIStorageFolder* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IStorageFolder_AddRef(IStorageFolder* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIStorageFolder_AddRef(__x_ABI_CWindows_CStorage_CIStorageFolder* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IStorageFolder_Release(IStorageFolder* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIStorageFolder_Release(__x_ABI_CWindows_CStorage_CIStorageFolder* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IStorageFolder_GetIids(IStorageFolder* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetIids(__x_ABI_CWindows_CStorage_CIStorageFolder* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetRuntimeClassName(IStorageFolder* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetTrustLevel(IStorageFolder* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetTrustLevel(__x_ABI_CWindows_CStorage_CIStorageFolder* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IStorageFolder methods ***/
-static FORCEINLINE HRESULT IStorageFolder_CreateFileAsyncOverloadDefaultOptions(IStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFileAsyncOverloadDefaultOptions(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
     return This->lpVtbl->CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_CreateFileAsync(IStorageFolder* This,HSTRING desiredName,CreationCollisionOption options,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFileAsync(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING desiredName,enum __x_ABI_CWindows_CStorage_CCreationCollisionOption options,IInspectable **operation) {
     return This->lpVtbl->CreateFileAsync(This,desiredName,options,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_CreateFolderAsyncOverloadDefaultOptions(IStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFolderAsyncOverloadDefaultOptions(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
     return This->lpVtbl->CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_CreateFolderAsync(IStorageFolder* This,HSTRING desiredName,CreationCollisionOption options,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_CreateFolderAsync(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING desiredName,enum __x_ABI_CWindows_CStorage_CCreationCollisionOption options,IInspectable **operation) {
     return This->lpVtbl->CreateFolderAsync(This,desiredName,options,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetFileAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetFileAsync(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING name,IInspectable **operation) {
     return This->lpVtbl->GetFileAsync(This,name,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetFolderAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetFolderAsync(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING name,IInspectable **operation) {
     return This->lpVtbl->GetFolderAsync(This,name,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetItemAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetItemAsync(__x_ABI_CWindows_CStorage_CIStorageFolder* This,HSTRING name,IInspectable **operation) {
     return This->lpVtbl->GetItemAsync(This,name,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(IStorageFolder* This,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(__x_ABI_CWindows_CStorage_CIStorageFolder* This,IInspectable **operation) {
     return This->lpVtbl->GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(IStorageFolder* This,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(__x_ABI_CWindows_CStorage_CIStorageFolder* This,IInspectable **operation) {
     return This->lpVtbl->GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation);
 }
-static FORCEINLINE HRESULT IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(IStorageFolder* This,IInspectable **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(__x_ABI_CWindows_CStorage_CIStorageFolder* This,IInspectable **operation) {
     return This->lpVtbl->GetItemsAsyncOverloadDefaultStartAndCount(This,operation);
 }
 #endif
@@ -939,251 +1081,171 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFileAsyncOverloadDefaultOptions_Proxy(
-    IStorageFolder* This,
-    HSTRING desiredName,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_CreateFileAsyncOverloadDefaultOptions_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFileAsync_Proxy(
-    IStorageFolder* This,
-    HSTRING desiredName,
-    CreationCollisionOption options,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_CreateFileAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFolderAsyncOverloadDefaultOptions_Proxy(
-    IStorageFolder* This,
-    HSTRING desiredName,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_CreateFolderAsyncOverloadDefaultOptions_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFolderAsync_Proxy(
-    IStorageFolder* This,
-    HSTRING desiredName,
-    CreationCollisionOption options,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_CreateFolderAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetFileAsync_Proxy(
-    IStorageFolder* This,
-    HSTRING name,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetFileAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetFolderAsync_Proxy(
-    IStorageFolder* This,
-    HSTRING name,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetFolderAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetItemAsync_Proxy(
-    IStorageFolder* This,
-    HSTRING name,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetItemAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount_Proxy(
-    IStorageFolder* This,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount_Proxy(
-    IStorageFolder* This,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount_Proxy(
-    IStorageFolder* This,
-    IInspectable **operation);
-void __RPC_STUB IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IStorageFolder_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIStorageFolder_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IApplicationDataContainer interface
+ *
  */
-#ifndef __IApplicationDataContainer_INTERFACE_DEFINED__
-#define __IApplicationDataContainer_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataContainer_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataContainer_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("c5aefd1e-f467-40ba-8566-ab640a441e1d")
-IApplicationDataContainer : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Name(
-        HSTRING *value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("c5aefd1e-f467-40ba-8566-ab640a441e1d")
+            IApplicationDataContainer : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_Name(
+                    HSTRING *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Locality(
-        ApplicationDataLocality *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Locality(
+                    enum ApplicationDataLocality *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Values(
-        IInspectable **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Values(
+                    IInspectable **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Containers(
-        IInspectable **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_Containers(
+                    IInspectable **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateContainer(
-        HSTRING name,
-        ApplicationDataCreateDisposition disposition,
-        IApplicationDataContainer **container) = 0;
+                virtual HRESULT STDMETHODCALLTYPE CreateContainer(
+                    HSTRING name,
+                    enum ApplicationDataCreateDisposition disposition,
+                    IApplicationDataContainer **container) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE DeleteContainer(
-        HSTRING name) = 0;
+                virtual HRESULT STDMETHODCALLTYPE DeleteContainer(
+                    HSTRING name) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d)
+__CRT_UUID_DECL(ABI::Windows::Storage::IApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d)
 #endif
 #else
-typedef struct IApplicationDataContainerVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIApplicationDataContainerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IApplicationDataContainer* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IApplicationDataContainer* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         TrustLevel *trustLevel);
 
     /*** IApplicationDataContainer methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Name)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         HSTRING *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Locality)(
-        IApplicationDataContainer* This,
-        ApplicationDataLocality *value);
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
+        enum __x_ABI_CWindows_CStorage_CApplicationDataLocality *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Values)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         IInspectable **value);
 
     HRESULT (STDMETHODCALLTYPE *get_Containers)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         IInspectable **value);
 
     HRESULT (STDMETHODCALLTYPE *CreateContainer)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         HSTRING name,
-        ApplicationDataCreateDisposition disposition,
-        IApplicationDataContainer **container);
+        enum __x_ABI_CWindows_CStorage_CApplicationDataCreateDisposition disposition,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer **container);
 
     HRESULT (STDMETHODCALLTYPE *DeleteContainer)(
-        IApplicationDataContainer* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer *This,
         HSTRING name);
 
     END_INTERFACE
-} IApplicationDataContainerVtbl;
-interface IApplicationDataContainer {
-    CONST_VTBL IApplicationDataContainerVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIApplicationDataContainerVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIApplicationDataContainer {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIApplicationDataContainerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IApplicationDataContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IApplicationDataContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IApplicationDataContainer_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IApplicationDataContainer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IApplicationDataContainer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IApplicationDataContainer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IApplicationDataContainer methods ***/
-#define IApplicationDataContainer_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
-#define IApplicationDataContainer_get_Locality(This,value) (This)->lpVtbl->get_Locality(This,value)
-#define IApplicationDataContainer_get_Values(This,value) (This)->lpVtbl->get_Values(This,value)
-#define IApplicationDataContainer_get_Containers(This,value) (This)->lpVtbl->get_Containers(This,value)
-#define IApplicationDataContainer_CreateContainer(This,name,disposition,container) (This)->lpVtbl->CreateContainer(This,name,disposition,container)
-#define IApplicationDataContainer_DeleteContainer(This,name) (This)->lpVtbl->DeleteContainer(This,name)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Locality(This,value) (This)->lpVtbl->get_Locality(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Values(This,value) (This)->lpVtbl->get_Values(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Containers(This,value) (This)->lpVtbl->get_Containers(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_CreateContainer(This,name,disposition,container) (This)->lpVtbl->CreateContainer(This,name,disposition,container)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataContainer_DeleteContainer(This,name) (This)->lpVtbl->DeleteContainer(This,name)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IApplicationDataContainer_QueryInterface(IApplicationDataContainer* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_QueryInterface(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IApplicationDataContainer_AddRef(IApplicationDataContainer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataContainer_AddRef(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IApplicationDataContainer_Release(IApplicationDataContainer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataContainer_Release(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IApplicationDataContainer_GetIids(IApplicationDataContainer* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetIids(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_GetRuntimeClassName(IApplicationDataContainer* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_GetTrustLevel(IApplicationDataContainer* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_GetTrustLevel(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IApplicationDataContainer methods ***/
-static FORCEINLINE HRESULT IApplicationDataContainer_get_Name(IApplicationDataContainer* This,HSTRING *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Name(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,HSTRING *value) {
     return This->lpVtbl->get_Name(This,value);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_get_Locality(IApplicationDataContainer* This,ApplicationDataLocality *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Locality(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,enum __x_ABI_CWindows_CStorage_CApplicationDataLocality *value) {
     return This->lpVtbl->get_Locality(This,value);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_get_Values(IApplicationDataContainer* This,IInspectable **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Values(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,IInspectable **value) {
     return This->lpVtbl->get_Values(This,value);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_get_Containers(IApplicationDataContainer* This,IInspectable **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_get_Containers(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,IInspectable **value) {
     return This->lpVtbl->get_Containers(This,value);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_CreateContainer(IApplicationDataContainer* This,HSTRING name,ApplicationDataCreateDisposition disposition,IApplicationDataContainer **container) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_CreateContainer(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,HSTRING name,enum __x_ABI_CWindows_CStorage_CApplicationDataCreateDisposition disposition,__x_ABI_CWindows_CStorage_CIApplicationDataContainer **container) {
     return This->lpVtbl->CreateContainer(This,name,disposition,container);
 }
-static FORCEINLINE HRESULT IApplicationDataContainer_DeleteContainer(IApplicationDataContainer* This,HSTRING name) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataContainer_DeleteContainer(__x_ABI_CWindows_CStorage_CIApplicationDataContainer* This,HSTRING name) {
     return This->lpVtbl->DeleteContainer(This,name);
 }
 #endif
@@ -1191,279 +1253,238 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Name_Proxy(
-    IApplicationDataContainer* This,
-    HSTRING *value);
-void __RPC_STUB IApplicationDataContainer_get_Name_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Locality_Proxy(
-    IApplicationDataContainer* This,
-    ApplicationDataLocality *value);
-void __RPC_STUB IApplicationDataContainer_get_Locality_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Values_Proxy(
-    IApplicationDataContainer* This,
-    IInspectable **value);
-void __RPC_STUB IApplicationDataContainer_get_Values_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Containers_Proxy(
-    IApplicationDataContainer* This,
-    IInspectable **value);
-void __RPC_STUB IApplicationDataContainer_get_Containers_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_CreateContainer_Proxy(
-    IApplicationDataContainer* This,
-    HSTRING name,
-    ApplicationDataCreateDisposition disposition,
-    IApplicationDataContainer **container);
-void __RPC_STUB IApplicationDataContainer_CreateContainer_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationDataContainer_DeleteContainer_Proxy(
-    IApplicationDataContainer* This,
-    HSTRING name);
-void __RPC_STUB IApplicationDataContainer_DeleteContainer_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IApplicationDataContainer_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIApplicationDataContainer_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IApplicationData interface
+ *
  */
-#ifndef __IApplicationData_INTERFACE_DEFINED__
-#define __IApplicationData_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationData_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationData_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("c3da6fb7-b744-4b45-b0b8-223a0938d0dc")
-IApplicationData : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Version(
-        int *value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("c3da6fb7-b744-4b45-b0b8-223a0938d0dc")
+            IApplicationData : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_Version(
+                    int *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE SetVersionAsync(
-        int desiredVersion,
-        ApplicationDataSetVersionHandler *handler,
-        IInspectable **setVersionOperation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE SetVersionAsync(
+                    int desiredVersion,
+                    ApplicationDataSetVersionHandler *handler,
+                    IInspectable **setVersionOperation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE ClearAllAsync(
-        IInspectable **clearOperation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE ClearAllAsync(
+                    IInspectable **clearOperation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE ClearAsync(
-        ApplicationDataLocality locality,
-        IInspectable **clearOperation) = 0;
+                virtual HRESULT STDMETHODCALLTYPE ClearAsync(
+                    enum ApplicationDataLocality locality,
+                    IInspectable **clearOperation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_LocalSettings(
-        IApplicationDataContainer **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_LocalSettings(
+                    IApplicationDataContainer **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_RoamingSettings(
-        IApplicationDataContainer **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_RoamingSettings(
+                    IApplicationDataContainer **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_LocalFolder(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_LocalFolder(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_RoamingFolder(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_RoamingFolder(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_TemporaryFolder(
-        IStorageFolder **value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_TemporaryFolder(
+                    IStorageFolder **value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE DataChanged(
-        EventRegistrationToken token) = 0;
+                virtual HRESULT STDMETHODCALLTYPE DataChanged(
+                    struct EventRegistrationToken token) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE SignalDataChanged(
-        ) = 0;
+                virtual HRESULT STDMETHODCALLTYPE SignalDataChanged(
+                    ) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE RoamingStorageQuota(
-        UINT64 *value) = 0;
+                virtual HRESULT STDMETHODCALLTYPE RoamingStorageQuota(
+                    UINT64 *value) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc)
+__CRT_UUID_DECL(ABI::Windows::Storage::IApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc)
 #endif
 #else
-typedef struct IApplicationDataVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIApplicationDataVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IApplicationData* This);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IApplicationData* This);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         TrustLevel *trustLevel);
 
     /*** IApplicationData methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Version)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         int *value);
 
     HRESULT (STDMETHODCALLTYPE *SetVersionAsync)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         int desiredVersion,
-        ApplicationDataSetVersionHandler *handler,
+        __x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler *handler,
         IInspectable **setVersionOperation);
 
     HRESULT (STDMETHODCALLTYPE *ClearAllAsync)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         IInspectable **clearOperation);
 
     HRESULT (STDMETHODCALLTYPE *ClearAsync)(
-        IApplicationData* This,
-        ApplicationDataLocality locality,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        enum __x_ABI_CWindows_CStorage_CApplicationDataLocality locality,
         IInspectable **clearOperation);
 
     HRESULT (STDMETHODCALLTYPE *get_LocalSettings)(
-        IApplicationData* This,
-        IApplicationDataContainer **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer **value);
 
     HRESULT (STDMETHODCALLTYPE *get_RoamingSettings)(
-        IApplicationData* This,
-        IApplicationDataContainer **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataContainer **value);
 
     HRESULT (STDMETHODCALLTYPE *get_LocalFolder)(
-        IApplicationData* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_RoamingFolder)(
-        IApplicationData* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *get_TemporaryFolder)(
-        IApplicationData* This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     HRESULT (STDMETHODCALLTYPE *DataChanged)(
-        IApplicationData* This,
-        EventRegistrationToken token);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
+        struct __x_ABI_CWindows_CFoundation_CEventRegistrationToken token);
 
     HRESULT (STDMETHODCALLTYPE *SignalDataChanged)(
-        IApplicationData* This);
+        __x_ABI_CWindows_CStorage_CIApplicationData *This);
 
     HRESULT (STDMETHODCALLTYPE *RoamingStorageQuota)(
-        IApplicationData* This,
+        __x_ABI_CWindows_CStorage_CIApplicationData *This,
         UINT64 *value);
 
     END_INTERFACE
-} IApplicationDataVtbl;
-interface IApplicationData {
-    CONST_VTBL IApplicationDataVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIApplicationDataVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIApplicationData {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIApplicationDataVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IApplicationData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IApplicationData_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IApplicationData_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IApplicationData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IApplicationData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IApplicationData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IApplicationData methods ***/
-#define IApplicationData_get_Version(This,value) (This)->lpVtbl->get_Version(This,value)
-#define IApplicationData_SetVersionAsync(This,desiredVersion,handler,setVersionOperation) (This)->lpVtbl->SetVersionAsync(This,desiredVersion,handler,setVersionOperation)
-#define IApplicationData_ClearAllAsync(This,clearOperation) (This)->lpVtbl->ClearAllAsync(This,clearOperation)
-#define IApplicationData_ClearAsync(This,locality,clearOperation) (This)->lpVtbl->ClearAsync(This,locality,clearOperation)
-#define IApplicationData_get_LocalSettings(This,value) (This)->lpVtbl->get_LocalSettings(This,value)
-#define IApplicationData_get_RoamingSettings(This,value) (This)->lpVtbl->get_RoamingSettings(This,value)
-#define IApplicationData_get_LocalFolder(This,value) (This)->lpVtbl->get_LocalFolder(This,value)
-#define IApplicationData_get_RoamingFolder(This,value) (This)->lpVtbl->get_RoamingFolder(This,value)
-#define IApplicationData_get_TemporaryFolder(This,value) (This)->lpVtbl->get_TemporaryFolder(This,value)
-#define IApplicationData_DataChanged(This,token) (This)->lpVtbl->DataChanged(This,token)
-#define IApplicationData_SignalDataChanged(This) (This)->lpVtbl->SignalDataChanged(This)
-#define IApplicationData_RoamingStorageQuota(This,value) (This)->lpVtbl->RoamingStorageQuota(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_Version(This,value) (This)->lpVtbl->get_Version(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_SetVersionAsync(This,desiredVersion,handler,setVersionOperation) (This)->lpVtbl->SetVersionAsync(This,desiredVersion,handler,setVersionOperation)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_ClearAllAsync(This,clearOperation) (This)->lpVtbl->ClearAllAsync(This,clearOperation)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_ClearAsync(This,locality,clearOperation) (This)->lpVtbl->ClearAsync(This,locality,clearOperation)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_LocalSettings(This,value) (This)->lpVtbl->get_LocalSettings(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_RoamingSettings(This,value) (This)->lpVtbl->get_RoamingSettings(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_LocalFolder(This,value) (This)->lpVtbl->get_LocalFolder(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_RoamingFolder(This,value) (This)->lpVtbl->get_RoamingFolder(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_get_TemporaryFolder(This,value) (This)->lpVtbl->get_TemporaryFolder(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_DataChanged(This,token) (This)->lpVtbl->DataChanged(This,token)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_SignalDataChanged(This) (This)->lpVtbl->SignalDataChanged(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationData_RoamingStorageQuota(This,value) (This)->lpVtbl->RoamingStorageQuota(This,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IApplicationData_QueryInterface(IApplicationData* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_QueryInterface(__x_ABI_CWindows_CStorage_CIApplicationData* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IApplicationData_AddRef(IApplicationData* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationData_AddRef(__x_ABI_CWindows_CStorage_CIApplicationData* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IApplicationData_Release(IApplicationData* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationData_Release(__x_ABI_CWindows_CStorage_CIApplicationData* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IApplicationData_GetIids(IApplicationData* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_GetIids(__x_ABI_CWindows_CStorage_CIApplicationData* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IApplicationData_GetRuntimeClassName(IApplicationData* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIApplicationData* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IApplicationData_GetTrustLevel(IApplicationData* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_GetTrustLevel(__x_ABI_CWindows_CStorage_CIApplicationData* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IApplicationData methods ***/
-static FORCEINLINE HRESULT IApplicationData_get_Version(IApplicationData* This,int *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_Version(__x_ABI_CWindows_CStorage_CIApplicationData* This,int *value) {
     return This->lpVtbl->get_Version(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_SetVersionAsync(IApplicationData* This,int desiredVersion,ApplicationDataSetVersionHandler *handler,IInspectable **setVersionOperation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_SetVersionAsync(__x_ABI_CWindows_CStorage_CIApplicationData* This,int desiredVersion,__x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler *handler,IInspectable **setVersionOperation) {
     return This->lpVtbl->SetVersionAsync(This,desiredVersion,handler,setVersionOperation);
 }
-static FORCEINLINE HRESULT IApplicationData_ClearAllAsync(IApplicationData* This,IInspectable **clearOperation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_ClearAllAsync(__x_ABI_CWindows_CStorage_CIApplicationData* This,IInspectable **clearOperation) {
     return This->lpVtbl->ClearAllAsync(This,clearOperation);
 }
-static FORCEINLINE HRESULT IApplicationData_ClearAsync(IApplicationData* This,ApplicationDataLocality locality,IInspectable **clearOperation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_ClearAsync(__x_ABI_CWindows_CStorage_CIApplicationData* This,enum __x_ABI_CWindows_CStorage_CApplicationDataLocality locality,IInspectable **clearOperation) {
     return This->lpVtbl->ClearAsync(This,locality,clearOperation);
 }
-static FORCEINLINE HRESULT IApplicationData_get_LocalSettings(IApplicationData* This,IApplicationDataContainer **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_LocalSettings(__x_ABI_CWindows_CStorage_CIApplicationData* This,__x_ABI_CWindows_CStorage_CIApplicationDataContainer **value) {
     return This->lpVtbl->get_LocalSettings(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_get_RoamingSettings(IApplicationData* This,IApplicationDataContainer **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_RoamingSettings(__x_ABI_CWindows_CStorage_CIApplicationData* This,__x_ABI_CWindows_CStorage_CIApplicationDataContainer **value) {
     return This->lpVtbl->get_RoamingSettings(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_get_LocalFolder(IApplicationData* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_LocalFolder(__x_ABI_CWindows_CStorage_CIApplicationData* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_LocalFolder(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_get_RoamingFolder(IApplicationData* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_RoamingFolder(__x_ABI_CWindows_CStorage_CIApplicationData* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_RoamingFolder(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_get_TemporaryFolder(IApplicationData* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_get_TemporaryFolder(__x_ABI_CWindows_CStorage_CIApplicationData* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_TemporaryFolder(This,value);
 }
-static FORCEINLINE HRESULT IApplicationData_DataChanged(IApplicationData* This,EventRegistrationToken token) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_DataChanged(__x_ABI_CWindows_CStorage_CIApplicationData* This,struct __x_ABI_CWindows_CFoundation_CEventRegistrationToken token) {
     return This->lpVtbl->DataChanged(This,token);
 }
-static FORCEINLINE HRESULT IApplicationData_SignalDataChanged(IApplicationData* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_SignalDataChanged(__x_ABI_CWindows_CStorage_CIApplicationData* This) {
     return This->lpVtbl->SignalDataChanged(This);
 }
-static FORCEINLINE HRESULT IApplicationData_RoamingStorageQuota(IApplicationData* This,UINT64 *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData_RoamingStorageQuota(__x_ABI_CWindows_CStorage_CIApplicationData* This,UINT64 *value) {
     return This->lpVtbl->RoamingStorageQuota(This,value);
 }
 #endif
@@ -1471,202 +1492,112 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IApplicationData_get_Version_Proxy(
-    IApplicationData* This,
-    int *value);
-void __RPC_STUB IApplicationData_get_Version_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_SetVersionAsync_Proxy(
-    IApplicationData* This,
-    int desiredVersion,
-    ApplicationDataSetVersionHandler *handler,
-    IInspectable **setVersionOperation);
-void __RPC_STUB IApplicationData_SetVersionAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_ClearAllAsync_Proxy(
-    IApplicationData* This,
-    IInspectable **clearOperation);
-void __RPC_STUB IApplicationData_ClearAllAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_ClearAsync_Proxy(
-    IApplicationData* This,
-    ApplicationDataLocality locality,
-    IInspectable **clearOperation);
-void __RPC_STUB IApplicationData_ClearAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_get_LocalSettings_Proxy(
-    IApplicationData* This,
-    IApplicationDataContainer **value);
-void __RPC_STUB IApplicationData_get_LocalSettings_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_get_RoamingSettings_Proxy(
-    IApplicationData* This,
-    IApplicationDataContainer **value);
-void __RPC_STUB IApplicationData_get_RoamingSettings_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_get_LocalFolder_Proxy(
-    IApplicationData* This,
-    IStorageFolder **value);
-void __RPC_STUB IApplicationData_get_LocalFolder_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_get_RoamingFolder_Proxy(
-    IApplicationData* This,
-    IStorageFolder **value);
-void __RPC_STUB IApplicationData_get_RoamingFolder_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_get_TemporaryFolder_Proxy(
-    IApplicationData* This,
-    IStorageFolder **value);
-void __RPC_STUB IApplicationData_get_TemporaryFolder_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_DataChanged_Proxy(
-    IApplicationData* This,
-    EventRegistrationToken token);
-void __RPC_STUB IApplicationData_DataChanged_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_SignalDataChanged_Proxy(
-    IApplicationData* This);
-void __RPC_STUB IApplicationData_SignalDataChanged_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IApplicationData_RoamingStorageQuota_Proxy(
-    IApplicationData* This,
-    UINT64 *value);
-void __RPC_STUB IApplicationData_RoamingStorageQuota_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IApplicationData_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIApplicationData_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IApplicationData2 interface
+ *
  */
-#ifndef __IApplicationData2_INTERFACE_DEFINED__
-#define __IApplicationData2_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationData2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationData2_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IApplicationData2, 0x9e65cd69, 0x0ba3, 0x4e32, 0xbe,0x29, 0xb0,0x2d,0xe6,0x60,0x76,0x38);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIApplicationData2, 0x9e65cd69, 0x0ba3, 0x4e32, 0xbe,0x29, 0xb0,0x2d,0xe6,0x60,0x76,0x38);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("9e65cd69-0ba3-4e32-be29-b02de6607638")
-IApplicationData2 : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_LocalCacheFolder(
-        IStorageFolder **value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("9e65cd69-0ba3-4e32-be29-b02de6607638")
+            IApplicationData2 : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_LocalCacheFolder(
+                    IStorageFolder **value) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IApplicationData2, 0x9e65cd69, 0x0ba3, 0x4e32, 0xbe,0x29, 0xb0,0x2d,0xe6,0x60,0x76,0x38)
+__CRT_UUID_DECL(ABI::Windows::Storage::IApplicationData2, 0x9e65cd69, 0x0ba3, 0x4e32, 0xbe,0x29, 0xb0,0x2d,0xe6,0x60,0x76,0x38)
 #endif
 #else
-typedef struct IApplicationData2Vtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIApplicationData2Vtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IApplicationData2 *This,
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IApplicationData2 *This);
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IApplicationData2 *This);
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IApplicationData2 *This,
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IApplicationData2 *This,
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IApplicationData2 *This,
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This,
         TrustLevel *trustLevel);
 
     /*** IApplicationData2 methods ***/
     HRESULT (STDMETHODCALLTYPE *get_LocalCacheFolder)(
-        IApplicationData2 *This,
-        IStorageFolder **value);
+        __x_ABI_CWindows_CStorage_CIApplicationData2 *This,
+        __x_ABI_CWindows_CStorage_CIStorageFolder **value);
 
     END_INTERFACE
-} IApplicationData2Vtbl;
+} __x_ABI_CWindows_CStorage_CIApplicationData2Vtbl;
 
-interface IApplicationData2 {
-    CONST_VTBL IApplicationData2Vtbl* lpVtbl;
+interface __x_ABI_CWindows_CStorage_CIApplicationData2 {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIApplicationData2Vtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IApplicationData2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IApplicationData2_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IApplicationData2_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IApplicationData2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IApplicationData2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IApplicationData2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IApplicationData2 methods ***/
-#define IApplicationData2_get_LocalCacheFolder(This,value) (This)->lpVtbl->get_LocalCacheFolder(This,value)
+#define __x_ABI_CWindows_CStorage_CIApplicationData2_get_LocalCacheFolder(This,value) (This)->lpVtbl->get_LocalCacheFolder(This,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IApplicationData2_QueryInterface(IApplicationData2* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData2_QueryInterface(__x_ABI_CWindows_CStorage_CIApplicationData2* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IApplicationData2_AddRef(IApplicationData2* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationData2_AddRef(__x_ABI_CWindows_CStorage_CIApplicationData2* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IApplicationData2_Release(IApplicationData2* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationData2_Release(__x_ABI_CWindows_CStorage_CIApplicationData2* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IApplicationData2_GetIids(IApplicationData2* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData2_GetIids(__x_ABI_CWindows_CStorage_CIApplicationData2* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IApplicationData2_GetRuntimeClassName(IApplicationData2* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData2_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIApplicationData2* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IApplicationData2_GetTrustLevel(IApplicationData2* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData2_GetTrustLevel(__x_ABI_CWindows_CStorage_CIApplicationData2* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IApplicationData2 methods ***/
-static FORCEINLINE HRESULT IApplicationData2_get_LocalCacheFolder(IApplicationData2* This,IStorageFolder **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationData2_get_LocalCacheFolder(__x_ABI_CWindows_CStorage_CIApplicationData2* This,__x_ABI_CWindows_CStorage_CIStorageFolder **value) {
     return This->lpVtbl->get_LocalCacheFolder(This,value);
 }
 #endif
@@ -1674,102 +1605,112 @@
 
 #endif
 
-#endif  /* __IApplicationData2_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIApplicationData2_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IApplicationDataStatics interface
+ *
  */
-#ifndef __IApplicationDataStatics_INTERFACE_DEFINED__
-#define __IApplicationDataStatics_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CIApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("5612147b-e843-45e3-94d8-06169e3c8e17")
-IApplicationDataStatics : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Current(
-        IApplicationData **data) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("5612147b-e843-45e3-94d8-06169e3c8e17")
+            IApplicationDataStatics : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_Current(
+                    IApplicationData **data) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17)
+__CRT_UUID_DECL(ABI::Windows::Storage::IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17)
 #endif
 #else
-typedef struct IApplicationDataStaticsVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIApplicationDataStaticsVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IApplicationDataStatics* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IApplicationDataStatics* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IApplicationDataStatics* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IApplicationDataStatics* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IApplicationDataStatics* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IApplicationDataStatics* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This,
         TrustLevel *trustLevel);
 
     /*** IApplicationDataStatics methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Current)(
-        IApplicationDataStatics* This,
-        IApplicationData **data);
+        __x_ABI_CWindows_CStorage_CIApplicationDataStatics *This,
+        __x_ABI_CWindows_CStorage_CIApplicationData **data);
 
     END_INTERFACE
-} IApplicationDataStaticsVtbl;
-interface IApplicationDataStatics {
-    CONST_VTBL IApplicationDataStaticsVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIApplicationDataStaticsVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIApplicationDataStatics {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIApplicationDataStaticsVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IApplicationDataStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IApplicationDataStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IApplicationDataStatics_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IApplicationDataStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IApplicationDataStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IApplicationDataStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IApplicationDataStatics methods ***/
-#define IApplicationDataStatics_get_Current(This,data) (This)->lpVtbl->get_Current(This,data)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataStatics_get_Current(This,data) (This)->lpVtbl->get_Current(This,data)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IApplicationDataStatics_QueryInterface(IApplicationDataStatics* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataStatics_QueryInterface(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IApplicationDataStatics_AddRef(IApplicationDataStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataStatics_AddRef(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IApplicationDataStatics_Release(IApplicationDataStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataStatics_Release(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IApplicationDataStatics_GetIids(IApplicationDataStatics* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetIids(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IApplicationDataStatics_GetRuntimeClassName(IApplicationDataStatics* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IApplicationDataStatics_GetTrustLevel(IApplicationDataStatics* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataStatics_GetTrustLevel(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IApplicationDataStatics methods ***/
-static FORCEINLINE HRESULT IApplicationDataStatics_get_Current(IApplicationDataStatics* This,IApplicationData **data) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataStatics_get_Current(__x_ABI_CWindows_CStorage_CIApplicationDataStatics* This,__x_ABI_CWindows_CStorage_CIApplicationData **data) {
     return This->lpVtbl->get_Current(This,data);
 }
 #endif
@@ -1777,217 +1718,219 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IApplicationDataStatics_get_Current_Proxy(
-    IApplicationDataStatics* This,
-    IApplicationData **data);
-void __RPC_STUB IApplicationDataStatics_get_Current_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IApplicationDataStatics_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIApplicationDataStatics_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * ApplicationDataSetVersionHandler interface
+ *
  */
-#ifndef __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__
-#define __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_ApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("a05791e6-cc9f-4687-acab-a364fd785463")
-ApplicationDataSetVersionHandler : public IUnknown
-{
-    virtual HRESULT STDMETHODCALLTYPE ApplicationDataSetVersionHandler(
-        ISetVersionRequest *setVersionRequest) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("a05791e6-cc9f-4687-acab-a364fd785463")
+            ApplicationDataSetVersionHandler : public IUnknown
+            {
+                virtual HRESULT STDMETHODCALLTYPE ApplicationDataSetVersionHandler(
+                    ISetVersionRequest *setVersionRequest) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(ApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63)
+__CRT_UUID_DECL(ABI::Windows::Storage::IApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63)
 #endif
 #else
-typedef struct ApplicationDataSetVersionHandlerVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandlerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        ApplicationDataSetVersionHandler* This,
+        __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        ApplicationDataSetVersionHandler* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        ApplicationDataSetVersionHandler* This);
+        __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler *This);
 
-    /*** ApplicationDataSetVersionHandler methods ***/
-    HRESULT (STDMETHODCALLTYPE *ApplicationDataSetVersionHandler)(
-        ApplicationDataSetVersionHandler* This,
-        ISetVersionRequest *setVersionRequest);
+    /*** IApplicationDataSetVersionHandler methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler *This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *setVersionRequest);
 
     END_INTERFACE
-} ApplicationDataSetVersionHandlerVtbl;
-interface ApplicationDataSetVersionHandler {
-    CONST_VTBL ApplicationDataSetVersionHandlerVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandlerVtbl;
+
+interface __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandlerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define ApplicationDataSetVersionHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define ApplicationDataSetVersionHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define ApplicationDataSetVersionHandler_Release(This) (This)->lpVtbl->Release(This)
-/*** ApplicationDataSetVersionHandler methods ***/
-#define ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler(This,setVersionRequest) (This)->lpVtbl->ApplicationDataSetVersionHandler(This,setVersionRequest)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_Release(This) (This)->lpVtbl->Release(This)
+/*** IApplicationDataSetVersionHandler methods ***/
+#define __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_Invoke(This,setVersionRequest) (This)->lpVtbl->Invoke(This,setVersionRequest)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT ApplicationDataSetVersionHandler_QueryInterface(ApplicationDataSetVersionHandler* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_QueryInterface(__x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG ApplicationDataSetVersionHandler_AddRef(ApplicationDataSetVersionHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_AddRef(__x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG ApplicationDataSetVersionHandler_Release(ApplicationDataSetVersionHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_Release(__x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler* This) {
     return This->lpVtbl->Release(This);
 }
-/*** ApplicationDataSetVersionHandler methods ***/
-static FORCEINLINE HRESULT ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler(ApplicationDataSetVersionHandler* This,ISetVersionRequest *setVersionRequest) {
-    return This->lpVtbl->ApplicationDataSetVersionHandler(This,setVersionRequest);
+/*** IApplicationDataSetVersionHandler methods ***/
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_Invoke(__x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler* This,__x_ABI_CWindows_CStorage_CISetVersionRequest *setVersionRequest) {
+    return This->lpVtbl->Invoke(This,setVersionRequest);
 }
 #endif
 #endif
 
 #endif
 
-HRESULT STDMETHODCALLTYPE ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler_Proxy(
-    ApplicationDataSetVersionHandler* This,
-    ISetVersionRequest *setVersionRequest);
-void __RPC_STUB ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CIApplicationDataSetVersionHandler_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * ISetVersionRequest interface
+ *
  */
-#ifndef __ISetVersionRequest_INTERFACE_DEFINED__
-#define __ISetVersionRequest_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionRequest_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionRequest_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_ISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("b9c76b9b-1056-4e69-8330-162619956f9b")
-ISetVersionRequest : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_CurrentVersion(
-        UINT32 *currentVersion) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("b9c76b9b-1056-4e69-8330-162619956f9b")
+            ISetVersionRequest : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_CurrentVersion(
+                    UINT32 *currentVersion) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_DesiredVersion(
-        UINT32 *desiredVersion) = 0;
+                virtual HRESULT STDMETHODCALLTYPE get_DesiredVersion(
+                    UINT32 *desiredVersion) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
-        ISetVersionDeferral **deferral) = 0;
+                virtual HRESULT STDMETHODCALLTYPE GetDeferral(
+                    ISetVersionDeferral **deferral) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(ISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b)
+__CRT_UUID_DECL(ABI::Windows::Storage::ISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b)
 #endif
 #else
-typedef struct ISetVersionRequestVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CISetVersionRequestVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        ISetVersionRequest* This);
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        ISetVersionRequest* This);
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         TrustLevel *trustLevel);
 
     /*** ISetVersionRequest methods ***/
     HRESULT (STDMETHODCALLTYPE *get_CurrentVersion)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         UINT32 *currentVersion);
 
     HRESULT (STDMETHODCALLTYPE *get_DesiredVersion)(
-        ISetVersionRequest* This,
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
         UINT32 *desiredVersion);
 
     HRESULT (STDMETHODCALLTYPE *GetDeferral)(
-        ISetVersionRequest* This,
-        ISetVersionDeferral **deferral);
+        __x_ABI_CWindows_CStorage_CISetVersionRequest *This,
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral **deferral);
 
     END_INTERFACE
-} ISetVersionRequestVtbl;
-interface ISetVersionRequest {
-    CONST_VTBL ISetVersionRequestVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CISetVersionRequestVtbl;
+
+interface __x_ABI_CWindows_CStorage_CISetVersionRequest {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CISetVersionRequestVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define ISetVersionRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define ISetVersionRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define ISetVersionRequest_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define ISetVersionRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define ISetVersionRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define ISetVersionRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** ISetVersionRequest methods ***/
-#define ISetVersionRequest_get_CurrentVersion(This,currentVersion) (This)->lpVtbl->get_CurrentVersion(This,currentVersion)
-#define ISetVersionRequest_get_DesiredVersion(This,desiredVersion) (This)->lpVtbl->get_DesiredVersion(This,desiredVersion)
-#define ISetVersionRequest_GetDeferral(This,deferral) (This)->lpVtbl->GetDeferral(This,deferral)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_get_CurrentVersion(This,currentVersion) (This)->lpVtbl->get_CurrentVersion(This,currentVersion)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_get_DesiredVersion(This,desiredVersion) (This)->lpVtbl->get_DesiredVersion(This,desiredVersion)
+#define __x_ABI_CWindows_CStorage_CISetVersionRequest_GetDeferral(This,deferral) (This)->lpVtbl->GetDeferral(This,deferral)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT ISetVersionRequest_QueryInterface(ISetVersionRequest* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_QueryInterface(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG ISetVersionRequest_AddRef(ISetVersionRequest* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CISetVersionRequest_AddRef(__x_ABI_CWindows_CStorage_CISetVersionRequest* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG ISetVersionRequest_Release(ISetVersionRequest* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CISetVersionRequest_Release(__x_ABI_CWindows_CStorage_CISetVersionRequest* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT ISetVersionRequest_GetIids(ISetVersionRequest* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_GetIids(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT ISetVersionRequest_GetRuntimeClassName(ISetVersionRequest* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT ISetVersionRequest_GetTrustLevel(ISetVersionRequest* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_GetTrustLevel(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** ISetVersionRequest methods ***/
-static FORCEINLINE HRESULT ISetVersionRequest_get_CurrentVersion(ISetVersionRequest* This,UINT32 *currentVersion) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_get_CurrentVersion(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,UINT32 *currentVersion) {
     return This->lpVtbl->get_CurrentVersion(This,currentVersion);
 }
-static FORCEINLINE HRESULT ISetVersionRequest_get_DesiredVersion(ISetVersionRequest* This,UINT32 *desiredVersion) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_get_DesiredVersion(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,UINT32 *desiredVersion) {
     return This->lpVtbl->get_DesiredVersion(This,desiredVersion);
 }
-static FORCEINLINE HRESULT ISetVersionRequest_GetDeferral(ISetVersionRequest* This,ISetVersionDeferral **deferral) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionRequest_GetDeferral(__x_ABI_CWindows_CStorage_CISetVersionRequest* This,__x_ABI_CWindows_CStorage_CISetVersionDeferral **deferral) {
     return This->lpVtbl->GetDeferral(This,deferral);
 }
 #endif
@@ -1995,126 +1938,111 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE ISetVersionRequest_get_CurrentVersion_Proxy(
-    ISetVersionRequest* This,
-    UINT32 *currentVersion);
-void __RPC_STUB ISetVersionRequest_get_CurrentVersion_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE ISetVersionRequest_get_DesiredVersion_Proxy(
-    ISetVersionRequest* This,
-    UINT32 *desiredVersion);
-void __RPC_STUB ISetVersionRequest_get_DesiredVersion_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE ISetVersionRequest_GetDeferral_Proxy(
-    ISetVersionRequest* This,
-    ISetVersionDeferral **deferral);
-void __RPC_STUB ISetVersionRequest_GetDeferral_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __ISetVersionRequest_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CISetVersionRequest_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * ISetVersionDeferral interface
+ *
  */
-#ifndef __ISetVersionDeferral_INTERFACE_DEFINED__
-#define __ISetVersionDeferral_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CISetVersionDeferral_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CISetVersionDeferral_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_ISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("033508a2-781a-437a-b078-3f32badcfe47")
-ISetVersionDeferral : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE Complete(
-        ) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            MIDL_INTERFACE("033508a2-781a-437a-b078-3f32badcfe47")
+            ISetVersionDeferral : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE Complete(
+                    ) = 0;
 
-};
+            };
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(ISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47)
+__CRT_UUID_DECL(ABI::Windows::Storage::ISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47)
 #endif
 #else
-typedef struct ISetVersionDeferralVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CISetVersionDeferralVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        ISetVersionDeferral* This,
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        ISetVersionDeferral* This);
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        ISetVersionDeferral* This);
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        ISetVersionDeferral* This,
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        ISetVersionDeferral* This,
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        ISetVersionDeferral* This,
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This,
         TrustLevel *trustLevel);
 
     /*** ISetVersionDeferral methods ***/
     HRESULT (STDMETHODCALLTYPE *Complete)(
-        ISetVersionDeferral* This);
+        __x_ABI_CWindows_CStorage_CISetVersionDeferral *This);
 
     END_INTERFACE
-} ISetVersionDeferralVtbl;
-interface ISetVersionDeferral {
-    CONST_VTBL ISetVersionDeferralVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CISetVersionDeferralVtbl;
+
+interface __x_ABI_CWindows_CStorage_CISetVersionDeferral {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CISetVersionDeferralVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define ISetVersionDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define ISetVersionDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define ISetVersionDeferral_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define ISetVersionDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define ISetVersionDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define ISetVersionDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** ISetVersionDeferral methods ***/
-#define ISetVersionDeferral_Complete(This) (This)->lpVtbl->Complete(This)
+#define __x_ABI_CWindows_CStorage_CISetVersionDeferral_Complete(This) (This)->lpVtbl->Complete(This)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT ISetVersionDeferral_QueryInterface(ISetVersionDeferral* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionDeferral_QueryInterface(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG ISetVersionDeferral_AddRef(ISetVersionDeferral* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CISetVersionDeferral_AddRef(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG ISetVersionDeferral_Release(ISetVersionDeferral* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CISetVersionDeferral_Release(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT ISetVersionDeferral_GetIids(ISetVersionDeferral* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetIids(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT ISetVersionDeferral_GetRuntimeClassName(ISetVersionDeferral* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT ISetVersionDeferral_GetTrustLevel(ISetVersionDeferral* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionDeferral_GetTrustLevel(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** ISetVersionDeferral methods ***/
-static FORCEINLINE HRESULT ISetVersionDeferral_Complete(ISetVersionDeferral* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CISetVersionDeferral_Complete(__x_ABI_CWindows_CStorage_CISetVersionDeferral* This) {
     return This->lpVtbl->Complete(This);
 }
 #endif
@@ -2122,15 +2050,7 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE ISetVersionDeferral_Complete_Proxy(
-    ISetVersionDeferral* This);
-void __RPC_STUB ISetVersionDeferral_Complete_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __ISetVersionDeferral_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CISetVersionDeferral_INTERFACE_DEFINED__ */
 
 /* Begin additional prototypes for all interfaces */
 
diff --git a/mingw-w64-headers/include/windows.storage.idl b/mingw-w64-headers/include/windows.storage.idl
index 61ad040..ddc292a 100644
--- a/mingw-w64-headers/include/windows.storage.idl
+++ b/mingw-w64-headers/include/windows.storage.idl
@@ -16,7 +16,6 @@
   namespace Foundation {
     interface IAsyncAction;
     interface TypedEventHandler;
-    //struct DateTime;
     //struct EventRegistrationToken;
 
     namespace Collections {
@@ -100,7 +99,7 @@
       [propget] HRESULT Name(HSTRING *value);
       [propget] HRESULT Path(HSTRING *value);
       [propget] HRESULT Attributes(FileAttributes* value);
-      [propget] HRESULT DateCreated(DateTime* value);
+      [propget] HRESULT DateCreated(Windows.Foundation.DateTime* value);
       HRESULT IsOfType(StorageItemTypes itemType, boolean* value);
     }
 
diff --git a/mingw-w64-headers/include/windows.storage.streams.h b/mingw-w64-headers/include/windows.storage.streams.h
index d76de28..567d228 100644
--- a/mingw-w64-headers/include/windows.storage.streams.h
+++ b/mingw-w64-headers/include/windows.storage.streams.h
@@ -1,11 +1,12 @@
-/*** Autogenerated by WIDL 1.5.31 from include/windows.storage.streams.idl - Do not edit ***/
+/*** Autogenerated by WIDL 6.0-rc1 from include/windows.storage.streams.idl - Do not edit ***/
 
+#ifdef _WIN32
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
 #define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
-
 #include <rpc.h>
 #include <rpcndr.h>
+#endif
 
 #ifndef COM_NO_WINDOWS_H
 #include <windows.h>
@@ -17,14 +18,36 @@
 
 /* Forward declarations */
 
-#ifndef __IBuffer_FWD_DEFINED__
-#define __IBuffer_FWD_DEFINED__
-typedef interface IBuffer IBuffer;
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IBuffer;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IBufferFactory_FWD_DEFINED__
-#define __IBufferFactory_FWD_DEFINED__
-typedef interface IBufferFactory IBufferFactory;
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IBufferFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
 /* Headers for imported files */
@@ -35,132 +58,166 @@
 extern "C" {
 #endif
 
-#ifndef __IBufferFactory_FWD_DEFINED__
-#define __IBufferFactory_FWD_DEFINED__
-typedef interface IBufferFactory IBufferFactory;
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IBufferFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IBuffer_FWD_DEFINED__
-#define __IBuffer_FWD_DEFINED__
-typedef interface IBuffer IBuffer;
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IBuffer;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
 /*****************************************************************************
  * IBuffer interface
+ *
  */
-#ifndef __IBuffer_INTERFACE_DEFINED__
-#define __IBuffer_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("905a0fe0-bc53-11df-8c49-001e4fc686da")
-IBuffer : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Capacity(
-        UINT32 *value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("905a0fe0-bc53-11df-8c49-001e4fc686da")
+                IBuffer : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_Capacity(
+                        UINT32 *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Length(
-        UINT32 *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE get_Length(
+                        UINT32 *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE put_Length(
-        UINT32 value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE put_Length(
+                        UINT32 value) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
+__CRT_UUID_DECL(ABI::Windows::Storage::Streams::IBuffer, 0x905a0fe0, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
 #endif
 #else
-typedef struct IBufferVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IBuffer* This);
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IBuffer* This);
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         TrustLevel *trustLevel);
 
     /*** IBuffer methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Capacity)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         UINT32 *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Length)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         UINT32 *value);
 
     HRESULT (STDMETHODCALLTYPE *put_Length)(
-        IBuffer* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *This,
         UINT32 value);
 
     END_INTERFACE
-} IBufferVtbl;
-interface IBuffer {
-    CONST_VTBL IBufferVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIBufferVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IBuffer_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IBuffer methods ***/
-#define IBuffer_get_Capacity(This,value) (This)->lpVtbl->get_Capacity(This,value)
-#define IBuffer_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
-#define IBuffer_put_Length(This,value) (This)->lpVtbl->put_Length(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Capacity(This,value) (This)->lpVtbl->get_Capacity(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBuffer_put_Length(This,value) (This)->lpVtbl->put_Length(This,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IBuffer_QueryInterface(IBuffer* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IBuffer_AddRef(IBuffer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIBuffer_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IBuffer_Release(IBuffer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IBuffer_GetIids(IBuffer* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IBuffer_GetRuntimeClassName(IBuffer* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IBuffer_GetTrustLevel(IBuffer* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IBuffer methods ***/
-static FORCEINLINE HRESULT IBuffer_get_Capacity(IBuffer* This,UINT32 *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Capacity(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 *value) {
     return This->lpVtbl->get_Capacity(This,value);
 }
-static FORCEINLINE HRESULT IBuffer_get_Length(IBuffer* This,UINT32 *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_get_Length(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 *value) {
     return This->lpVtbl->get_Length(This,value);
 }
-static FORCEINLINE HRESULT IBuffer_put_Length(IBuffer* This,UINT32 value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBuffer_put_Length(__x_ABI_CWindows_CStorage_CStreams_CIBuffer* This,UINT32 value) {
     return This->lpVtbl->put_Length(This,value);
 }
 #endif
@@ -168,129 +225,116 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IBuffer_get_Capacity_Proxy(
-    IBuffer* This,
-    UINT32 *value);
-void __RPC_STUB IBuffer_get_Capacity_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IBuffer_get_Length_Proxy(
-    IBuffer* This,
-    UINT32 *value);
-void __RPC_STUB IBuffer_get_Length_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IBuffer_put_Length_Proxy(
-    IBuffer* This,
-    UINT32 value);
-void __RPC_STUB IBuffer_put_Length_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IBuffer_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IBufferFactory interface
+ *
  */
-#ifndef __IBufferFactory_INTERFACE_DEFINED__
-#define __IBufferFactory_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27);
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("71af914d-c10f-484b-bc50-14bc623b3a27")
-IBufferFactory : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE Create(
-        UINT32 capacity,
-        IBuffer **value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("71af914d-c10f-484b-bc50-14bc623b3a27")
+                IBufferFactory : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Create(
+                        UINT32 capacity,
+                        IBuffer **value) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27)
+__CRT_UUID_DECL(ABI::Windows::Storage::Streams::IBufferFactory, 0x71af914d, 0xc10f, 0x484b, 0xbc,0x50, 0x14,0xbc,0x62,0x3b,0x3a,0x27)
 #endif
 #else
-typedef struct IBufferFactoryVtbl {
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IBufferFactory* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IBufferFactory* This);
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IBufferFactory* This);
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IBufferFactory* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IBufferFactory* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IBufferFactory* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
         TrustLevel *trustLevel);
 
     /*** IBufferFactory methods ***/
     HRESULT (STDMETHODCALLTYPE *Create)(
-        IBufferFactory* This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory *This,
         UINT32 capacity,
-        IBuffer **value);
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);
 
     END_INTERFACE
-} IBufferFactoryVtbl;
-interface IBufferFactory {
-    CONST_VTBL IBufferFactoryVtbl* lpVtbl;
+} __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIBufferFactoryVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IBufferFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IBufferFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IBufferFactory_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IBufferFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IBufferFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IBufferFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IBufferFactory methods ***/
-#define IBufferFactory_Create(This,capacity,value) (This)->lpVtbl->Create(This,capacity,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Create(This,capacity,value) (This)->lpVtbl->Create(This,capacity,value)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IBufferFactory_QueryInterface(IBufferFactory* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IBufferFactory_AddRef(IBufferFactory* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IBufferFactory_Release(IBufferFactory* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Release(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IBufferFactory_GetIids(IBufferFactory* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IBufferFactory_GetRuntimeClassName(IBufferFactory* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IBufferFactory_GetTrustLevel(IBufferFactory* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IBufferFactory methods ***/
-static FORCEINLINE HRESULT IBufferFactory_Create(IBufferFactory* This,UINT32 capacity,IBuffer **value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_Create(__x_ABI_CWindows_CStorage_CStreams_CIBufferFactory* This,UINT32 capacity,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
     return This->lpVtbl->Create(This,capacity,value);
 }
 #endif
@@ -298,17 +342,7 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IBufferFactory_Create_Proxy(
-    IBufferFactory* This,
-    UINT32 capacity,
-    IBuffer **value);
-void __RPC_STUB IBufferFactory_Create_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IBufferFactory_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIBufferFactory_INTERFACE_DEFINED__ */
 
 /* Begin additional prototypes for all interfaces */
 
diff --git a/mingw-w64-headers/include/windows.system.threading.h b/mingw-w64-headers/include/windows.system.threading.h
index c76d3d7..69e6d7a 100644
--- a/mingw-w64-headers/include/windows.system.threading.h
+++ b/mingw-w64-headers/include/windows.system.threading.h
@@ -1,11 +1,12 @@
-/*** Autogenerated by WIDL 1.6 from include/windows.system.threading.idl - Do not edit ***/
+/*** Autogenerated by WIDL 6.0-rc1 from include/windows.system.threading.idl - Do not edit ***/
 
+#ifdef _WIN32
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
 #define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
-
 #include <rpc.h>
 #include <rpcndr.h>
+#endif
 
 #ifndef COM_NO_WINDOWS_H
 #include <windows.h>
@@ -17,34 +18,100 @@
 
 /* Forward declarations */
 
-#ifndef __TimerElapsedHandler_FWD_DEFINED__
-#define __TimerElapsedHandler_FWD_DEFINED__
-typedef interface TimerElapsedHandler TimerElapsedHandler;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface TimerElapsedHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __TimerDestroyedHandler_FWD_DEFINED__
-#define __TimerDestroyedHandler_FWD_DEFINED__
-typedef interface TimerDestroyedHandler TimerDestroyedHandler;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface TimerDestroyedHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __WorkItemHandler_FWD_DEFINED__
-#define __WorkItemHandler_FWD_DEFINED__
-typedef interface WorkItemHandler WorkItemHandler;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface WorkItemHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IThreadPoolStatics_FWD_DEFINED__
-#define __IThreadPoolStatics_FWD_DEFINED__
-typedef interface IThreadPoolStatics IThreadPoolStatics;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IThreadPoolTimer_FWD_DEFINED__
-#define __IThreadPoolTimer_FWD_DEFINED__
-typedef interface IThreadPoolTimer IThreadPoolTimer;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolTimer;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IThreadPoolTimerStatics_FWD_DEFINED__
-#define __IThreadPoolTimerStatics_FWD_DEFINED__
-typedef interface IThreadPoolTimerStatics IThreadPoolTimerStatics;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolTimerStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
 /* Headers for imported files */
@@ -56,125 +123,240 @@
 extern "C" {
 #endif
 
-#ifndef __IAsyncAction_FWD_DEFINED__
-#define __IAsyncAction_FWD_DEFINED__
-typedef interface IAsyncAction IAsyncAction;
+#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            interface IAsyncAction;
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-struct TimeSpan;
-
-enum WorkItemPriority;
-
-enum WorkItemOptions;
-
-#ifndef __TimerElapsedHandler_FWD_DEFINED__
-#define __TimerElapsedHandler_FWD_DEFINED__
-typedef interface TimerElapsedHandler TimerElapsedHandler;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            struct TimeSpan;
+        }
+    }
+}
+extern "C" {
+#else
+struct __x_ABI_CWindows_CFoundation_CTimeSpan;
 #endif
 
-#ifndef __TimerDestroyedHandler_FWD_DEFINED__
-#define __TimerDestroyedHandler_FWD_DEFINED__
-typedef interface TimerDestroyedHandler TimerDestroyedHandler;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                enum WorkItemPriority;
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority;
 #endif
 
-#ifndef __WorkItemHandler_FWD_DEFINED__
-#define __WorkItemHandler_FWD_DEFINED__
-typedef interface WorkItemHandler WorkItemHandler;
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                enum WorkItemOptions;
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions;
 #endif
 
-#ifndef __IThreadPoolStatics_FWD_DEFINED__
-#define __IThreadPoolStatics_FWD_DEFINED__
-typedef interface IThreadPoolStatics IThreadPoolStatics;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface TimerElapsedHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IThreadPoolTimer_FWD_DEFINED__
-#define __IThreadPoolTimer_FWD_DEFINED__
-typedef interface IThreadPoolTimer IThreadPoolTimer;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface TimerDestroyedHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-#ifndef __IThreadPoolTimerStatics_FWD_DEFINED__
-#define __IThreadPoolTimerStatics_FWD_DEFINED__
-typedef interface IThreadPoolTimerStatics IThreadPoolTimerStatics;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface WorkItemHandler;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
 #endif
 
-typedef enum WorkItemPriority {
-    Low = -1,
-    Normal = 0,
-    High = 1
-} WorkItemPriority;
-typedef enum WorkItemOptions {
-    None = 0,
-    TimeSliced = 1
-} WorkItemOptions;
-typedef struct TimeSpan {
-    INT64 Duration;
-} TimeSpan;
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolTimer;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics;
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                interface IThreadPoolTimerStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 /*****************************************************************************
  * TimerElapsedHandler interface
+ *
  */
-#ifndef __TimerElapsedHandler_INTERFACE_DEFINED__
-#define __TimerElapsedHandler_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_TimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("faaea667-fbeb-49cb-adb2-71184c556e43")
-TimerElapsedHandler : public IUnknown
-{
-    virtual HRESULT STDMETHODCALLTYPE Invoke(
-        IThreadPoolTimer *timer) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("faaea667-fbeb-49cb-adb2-71184c556e43")
+                TimerElapsedHandler : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        IThreadPoolTimer *timer) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(TimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::TimerElapsedHandler, 0xfaaea667, 0xfbeb, 0x49cb, 0xad,0xb2, 0x71,0x18,0x4c,0x55,0x6e,0x43)
 #endif
 #else
-typedef struct TimerElapsedHandlerVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        TimerElapsedHandler* This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        TimerElapsedHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        TimerElapsedHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *This);
 
     /*** TimerElapsedHandler methods ***/
     HRESULT (STDMETHODCALLTYPE *Invoke)(
-        TimerElapsedHandler* This,
-        IThreadPoolTimer *timer);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer);
 
     END_INTERFACE
-} TimerElapsedHandlerVtbl;
-interface TimerElapsedHandler {
-    CONST_VTBL TimerElapsedHandlerVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandlerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define TimerElapsedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define TimerElapsedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define TimerElapsedHandler_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Release(This) (This)->lpVtbl->Release(This)
 /*** TimerElapsedHandler methods ***/
-#define TimerElapsedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT TimerElapsedHandler_QueryInterface(TimerElapsedHandler* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG TimerElapsedHandler_AddRef(TimerElapsedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG TimerElapsedHandler_Release(TimerElapsedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This) {
     return This->lpVtbl->Release(This);
 }
 /*** TimerElapsedHandler methods ***/
-static FORCEINLINE HRESULT TimerElapsedHandler_Invoke(TimerElapsedHandler* This,IThreadPoolTimer *timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler* This,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer) {
     return This->lpVtbl->Invoke(This,timer);
 }
 #endif
@@ -182,83 +364,86 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE TimerElapsedHandler_Invoke_Proxy(
-    TimerElapsedHandler* This,
-    IThreadPoolTimer *timer);
-void __RPC_STUB TimerElapsedHandler_Invoke_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __TimerElapsedHandler_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * TimerDestroyedHandler interface
+ *
  */
-#ifndef __TimerDestroyedHandler_INTERFACE_DEFINED__
-#define __TimerDestroyedHandler_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_TimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("34ed19fa-8384-4eb9-8209-fb5094eeec35")
-TimerDestroyedHandler : public IUnknown
-{
-    virtual HRESULT STDMETHODCALLTYPE Invoke(
-        IThreadPoolTimer *timer) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("34ed19fa-8384-4eb9-8209-fb5094eeec35")
+                TimerDestroyedHandler : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        IThreadPoolTimer *timer) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(TimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::TimerDestroyedHandler, 0x34ed19fa, 0x8384, 0x4eb9, 0x82,0x09, 0xfb,0x50,0x94,0xee,0xec,0x35)
 #endif
 #else
-typedef struct TimerDestroyedHandlerVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        TimerDestroyedHandler* This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        TimerDestroyedHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        TimerDestroyedHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *This);
 
     /*** TimerDestroyedHandler methods ***/
     HRESULT (STDMETHODCALLTYPE *Invoke)(
-        TimerDestroyedHandler* This,
-        IThreadPoolTimer *timer);
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer);
 
     END_INTERFACE
-} TimerDestroyedHandlerVtbl;
-interface TimerDestroyedHandler {
-    CONST_VTBL TimerDestroyedHandlerVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandlerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define TimerDestroyedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define TimerDestroyedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define TimerDestroyedHandler_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Release(This) (This)->lpVtbl->Release(This)
 /*** TimerDestroyedHandler methods ***/
-#define TimerDestroyedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Invoke(This,timer) (This)->lpVtbl->Invoke(This,timer)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT TimerDestroyedHandler_QueryInterface(TimerDestroyedHandler* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG TimerDestroyedHandler_AddRef(TimerDestroyedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG TimerDestroyedHandler_Release(TimerDestroyedHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This) {
     return This->lpVtbl->Release(This);
 }
 /*** TimerDestroyedHandler methods ***/
-static FORCEINLINE HRESULT TimerDestroyedHandler_Invoke(TimerDestroyedHandler* This,IThreadPoolTimer *timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler* This,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *timer) {
     return This->lpVtbl->Invoke(This,timer);
 }
 #endif
@@ -266,83 +451,86 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE TimerDestroyedHandler_Invoke_Proxy(
-    TimerDestroyedHandler* This,
-    IThreadPoolTimer *timer);
-void __RPC_STUB TimerDestroyedHandler_Invoke_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __TimerDestroyedHandler_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * WorkItemHandler interface
+ *
  */
-#ifndef __WorkItemHandler_INTERFACE_DEFINED__
-#define __WorkItemHandler_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_WorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("1d1a8b8b-fa66-414f-9cbd-b65fc99d17fa")
-WorkItemHandler : public IUnknown
-{
-    virtual HRESULT STDMETHODCALLTYPE Invoke(
-        IAsyncAction *operation) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("1d1a8b8b-fa66-414f-9cbd-b65fc99d17fa")
+                WorkItemHandler : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        IAsyncAction *operation) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(WorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::WorkItemHandler, 0x1d1a8b8b, 0xfa66, 0x414f, 0x9c,0xbd, 0xb6,0x5f,0xc9,0x9d,0x17,0xfa)
 #endif
 #else
-typedef struct WorkItemHandlerVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        WorkItemHandler* This,
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        WorkItemHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        WorkItemHandler* This);
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *This);
 
     /*** WorkItemHandler methods ***/
     HRESULT (STDMETHODCALLTYPE *Invoke)(
-        WorkItemHandler* This,
-        IAsyncAction *operation);
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *This,
+        __x_ABI_CWindows_CFoundation_CIAsyncAction *operation);
 
     END_INTERFACE
-} WorkItemHandlerVtbl;
-interface WorkItemHandler {
-    CONST_VTBL WorkItemHandlerVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandlerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define WorkItemHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define WorkItemHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define WorkItemHandler_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Release(This) (This)->lpVtbl->Release(This)
 /*** WorkItemHandler methods ***/
-#define WorkItemHandler_Invoke(This,operation) (This)->lpVtbl->Invoke(This,operation)
+#define __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Invoke(This,operation) (This)->lpVtbl->Invoke(This,operation)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT WorkItemHandler_QueryInterface(WorkItemHandler* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG WorkItemHandler_AddRef(WorkItemHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_AddRef(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG WorkItemHandler_Release(WorkItemHandler* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Release(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This) {
     return This->lpVtbl->Release(This);
 }
 /*** WorkItemHandler methods ***/
-static FORCEINLINE HRESULT WorkItemHandler_Invoke(WorkItemHandler* This,IAsyncAction *operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_Invoke(__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler* This,__x_ABI_CWindows_CFoundation_CIAsyncAction *operation) {
     return This->lpVtbl->Invoke(This,operation);
 }
 #endif
@@ -350,145 +538,148 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE WorkItemHandler_Invoke_Proxy(
-    WorkItemHandler* This,
-    IAsyncAction *operation);
-void __RPC_STUB WorkItemHandler_Invoke_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __WorkItemHandler_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IThreadPoolStatics interface
+ *
  */
-#ifndef __IThreadPoolStatics_INTERFACE_DEFINED__
-#define __IThreadPoolStatics_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("b6bf67dd-84bd-44f8-ac1c-93ebcb9dba91")
-IThreadPoolStatics : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE RunAsync(
-        WorkItemHandler *handler,
-        IAsyncAction **operation) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("b6bf67dd-84bd-44f8-ac1c-93ebcb9dba91")
+                IThreadPoolStatics : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE RunAsync(
+                        WorkItemHandler *handler,
+                        IAsyncAction **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAsync(
-        WorkItemHandler *handler,
-        WorkItemPriority priority,
-        IAsyncAction **operation) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAsync(
+                        WorkItemHandler *handler,
+                        enum WorkItemPriority priority,
+                        IAsyncAction **operation) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAndOptionsAsync(
-        WorkItemHandler *handler,
-        WorkItemPriority priority,
-        WorkItemOptions options,
-        IAsyncAction **operation) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE RunWithPriorityAndOptionsAsync(
+                        WorkItemHandler *handler,
+                        enum WorkItemPriority priority,
+                        enum WorkItemOptions options,
+                        IAsyncAction **operation) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolStatics, 0xb6bf67dd, 0x84bd, 0x44f8, 0xac,0x1c, 0x93,0xeb,0xcb,0x9d,0xba,0x91)
 #endif
 #else
-typedef struct IThreadPoolStaticsVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IThreadPoolStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IThreadPoolStatics* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IThreadPoolStatics* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IThreadPoolStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IThreadPoolStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IThreadPoolStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
         TrustLevel *trustLevel);
 
     /*** IThreadPoolStatics methods ***/
     HRESULT (STDMETHODCALLTYPE *RunAsync)(
-        IThreadPoolStatics* This,
-        WorkItemHandler *handler,
-        IAsyncAction **operation);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
+        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);
 
     HRESULT (STDMETHODCALLTYPE *RunWithPriorityAsync)(
-        IThreadPoolStatics* This,
-        WorkItemHandler *handler,
-        WorkItemPriority priority,
-        IAsyncAction **operation);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
+        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,
+        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);
 
     HRESULT (STDMETHODCALLTYPE *RunWithPriorityAndOptionsAsync)(
-        IThreadPoolStatics* This,
-        WorkItemHandler *handler,
-        WorkItemPriority priority,
-        WorkItemOptions options,
-        IAsyncAction **operation);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,
+        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,
+        enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions options,
+        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);
 
     END_INTERFACE
-} IThreadPoolStaticsVtbl;
-interface IThreadPoolStatics {
-    CONST_VTBL IThreadPoolStaticsVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStaticsVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IThreadPoolStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IThreadPoolStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IThreadPoolStatics_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IThreadPoolStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IThreadPoolStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IThreadPoolStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IThreadPoolStatics methods ***/
-#define IThreadPoolStatics_RunAsync(This,handler,operation) (This)->lpVtbl->RunAsync(This,handler,operation)
-#define IThreadPoolStatics_RunWithPriorityAsync(This,handler,priority,operation) (This)->lpVtbl->RunWithPriorityAsync(This,handler,priority,operation)
-#define IThreadPoolStatics_RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation) (This)->lpVtbl->RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunAsync(This,handler,operation) (This)->lpVtbl->RunAsync(This,handler,operation)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAsync(This,handler,priority,operation) (This)->lpVtbl->RunWithPriorityAsync(This,handler,priority,operation)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation) (This)->lpVtbl->RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IThreadPoolStatics_QueryInterface(IThreadPoolStatics* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IThreadPoolStatics_AddRef(IThreadPoolStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IThreadPoolStatics_Release(IThreadPoolStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IThreadPoolStatics_GetIids(IThreadPoolStatics* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IThreadPoolStatics_GetRuntimeClassName(IThreadPoolStatics* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IThreadPoolStatics_GetTrustLevel(IThreadPoolStatics* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IThreadPoolStatics methods ***/
-static FORCEINLINE HRESULT IThreadPoolStatics_RunAsync(IThreadPoolStatics* This,WorkItemHandler *handler,IAsyncAction **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
     return This->lpVtbl->RunAsync(This,handler,operation);
 }
-static FORCEINLINE HRESULT IThreadPoolStatics_RunWithPriorityAsync(IThreadPoolStatics* This,WorkItemHandler *handler,WorkItemPriority priority,IAsyncAction **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
     return This->lpVtbl->RunWithPriorityAsync(This,handler,priority,operation);
 }
-static FORCEINLINE HRESULT IThreadPoolStatics_RunWithPriorityAndOptionsAsync(IThreadPoolStatics* This,WorkItemHandler *handler,WorkItemPriority priority,WorkItemOptions options,IAsyncAction **operation) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_RunWithPriorityAndOptionsAsync(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics* This,__x_ABI_CWindows_CSystem_CThreading_CWorkItemHandler *handler,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemPriority priority,enum __x_ABI_CWindows_CSystem_CThreading_CWorkItemOptions options,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
     return This->lpVtbl->RunWithPriorityAndOptionsAsync(This,handler,priority,options,operation);
 }
 #endif
@@ -496,154 +687,135 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IThreadPoolStatics_RunAsync_Proxy(
-    IThreadPoolStatics* This,
-    WorkItemHandler *handler,
-    IAsyncAction **operation);
-void __RPC_STUB IThreadPoolStatics_RunAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolStatics_RunWithPriorityAsync_Proxy(
-    IThreadPoolStatics* This,
-    WorkItemHandler *handler,
-    WorkItemPriority priority,
-    IAsyncAction **operation);
-void __RPC_STUB IThreadPoolStatics_RunWithPriorityAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolStatics_RunWithPriorityAndOptionsAsync_Proxy(
-    IThreadPoolStatics* This,
-    WorkItemHandler *handler,
-    WorkItemPriority priority,
-    WorkItemOptions options,
-    IAsyncAction **operation);
-void __RPC_STUB IThreadPoolStatics_RunWithPriorityAndOptionsAsync_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IThreadPoolStatics_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolStatics_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IThreadPoolTimer interface
+ *
  */
-#ifndef __IThreadPoolTimer_INTERFACE_DEFINED__
-#define __IThreadPoolTimer_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("594ebe78-55ea-4a88-a50d-3402ae1f9cf2")
-IThreadPoolTimer : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE get_Period(
-        TimeSpan *value) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("594ebe78-55ea-4a88-a50d-3402ae1f9cf2")
+                IThreadPoolTimer : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_Period(
+                        struct TimeSpan *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE get_Delay(
-        TimeSpan *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE get_Delay(
+                        struct TimeSpan *value) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE Cancel(
-        ) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE Cancel(
+                        ) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolTimer, 0x594ebe78, 0x55ea, 0x4a88, 0xa5,0x0d, 0x34,0x02,0xae,0x1f,0x9c,0xf2)
 #endif
 #else
-typedef struct IThreadPoolTimerVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IThreadPoolTimer* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IThreadPoolTimer* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IThreadPoolTimer* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IThreadPoolTimer* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IThreadPoolTimer* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IThreadPoolTimer* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
         TrustLevel *trustLevel);
 
     /*** IThreadPoolTimer methods ***/
     HRESULT (STDMETHODCALLTYPE *get_Period)(
-        IThreadPoolTimer* This,
-        TimeSpan *value);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value);
 
     HRESULT (STDMETHODCALLTYPE *get_Delay)(
-        IThreadPoolTimer* This,
-        TimeSpan *value);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value);
 
     HRESULT (STDMETHODCALLTYPE *Cancel)(
-        IThreadPoolTimer* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer *This);
 
     END_INTERFACE
-} IThreadPoolTimerVtbl;
-interface IThreadPoolTimer {
-    CONST_VTBL IThreadPoolTimerVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IThreadPoolTimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IThreadPoolTimer_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IThreadPoolTimer_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IThreadPoolTimer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IThreadPoolTimer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IThreadPoolTimer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IThreadPoolTimer methods ***/
-#define IThreadPoolTimer_get_Period(This,value) (This)->lpVtbl->get_Period(This,value)
-#define IThreadPoolTimer_get_Delay(This,value) (This)->lpVtbl->get_Delay(This,value)
-#define IThreadPoolTimer_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Period(This,value) (This)->lpVtbl->get_Period(This,value)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Delay(This,value) (This)->lpVtbl->get_Delay(This,value)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Cancel(This) (This)->lpVtbl->Cancel(This)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimer_QueryInterface(IThreadPoolTimer* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IThreadPoolTimer_AddRef(IThreadPoolTimer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IThreadPoolTimer_Release(IThreadPoolTimer* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimer_GetIids(IThreadPoolTimer* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IThreadPoolTimer_GetRuntimeClassName(IThreadPoolTimer* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IThreadPoolTimer_GetTrustLevel(IThreadPoolTimer* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IThreadPoolTimer methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimer_get_Period(IThreadPoolTimer* This,TimeSpan *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Period(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value) {
     return This->lpVtbl->get_Period(This,value);
 }
-static FORCEINLINE HRESULT IThreadPoolTimer_get_Delay(IThreadPoolTimer* This,TimeSpan *value) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_get_Delay(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan *value) {
     return This->lpVtbl->get_Delay(This,value);
 }
-static FORCEINLINE HRESULT IThreadPoolTimer_Cancel(IThreadPoolTimer* This) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_Cancel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer* This) {
     return This->lpVtbl->Cancel(This);
 }
 #endif
@@ -651,179 +823,167 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IThreadPoolTimer_get_Period_Proxy(
-    IThreadPoolTimer* This,
-    TimeSpan *value);
-void __RPC_STUB IThreadPoolTimer_get_Period_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolTimer_get_Delay_Proxy(
-    IThreadPoolTimer* This,
-    TimeSpan *value);
-void __RPC_STUB IThreadPoolTimer_get_Delay_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolTimer_Cancel_Proxy(
-    IThreadPoolTimer* This);
-void __RPC_STUB IThreadPoolTimer_Cancel_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IThreadPoolTimer_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
  * IThreadPoolTimerStatics interface
+ *
  */
-#ifndef __IThreadPoolTimerStatics_INTERFACE_DEFINED__
-#define __IThreadPoolTimerStatics_INTERFACE_DEFINED__
+#ifndef ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__
 
-DEFINE_GUID(IID_IThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90);
+DEFINE_GUID(IID___x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90);
 #if defined(__cplusplus) && !defined(CINTERFACE)
-MIDL_INTERFACE("1a8a9d02-e482-461b-b8c7-8efad1cce590")
-IThreadPoolTimerStatics : public IInspectable
-{
-    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimer(
-        TimerElapsedHandler *handler,
-        TimeSpan period,
-        IThreadPoolTimer **timer) = 0;
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace System {
+            namespace Threading {
+                MIDL_INTERFACE("1a8a9d02-e482-461b-b8c7-8efad1cce590")
+                IThreadPoolTimerStatics : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimer(
+                        TimerElapsedHandler *handler,
+                        struct TimeSpan period,
+                        IThreadPoolTimer **timer) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateTimer(
-        TimerElapsedHandler *handler,
-        TimeSpan delay,
-        IThreadPoolTimer **timer) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE CreateTimer(
+                        TimerElapsedHandler *handler,
+                        struct TimeSpan delay,
+                        IThreadPoolTimer **timer) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimerWithCompletion(
-        TimerElapsedHandler *handler,
-        TimeSpan period,
-        TimerDestroyedHandler *destroyed,
-        IThreadPoolTimer **timer) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE CreatePeriodicTimerWithCompletion(
+                        TimerElapsedHandler *handler,
+                        struct TimeSpan period,
+                        TimerDestroyedHandler *destroyed,
+                        IThreadPoolTimer **timer) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE CreateTimerWithCompletion(
-        TimerElapsedHandler *handler,
-        TimeSpan delay,
-        TimerDestroyedHandler *destroyed,
-        IThreadPoolTimer **timer) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE CreateTimerWithCompletion(
+                        TimerElapsedHandler *handler,
+                        struct TimeSpan delay,
+                        TimerDestroyedHandler *destroyed,
+                        IThreadPoolTimer **timer) = 0;
 
-};
+                };
+            }
+        }
+    }
+}
+extern "C" {
 #ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90)
+__CRT_UUID_DECL(ABI::Windows::System::Threading::IThreadPoolTimerStatics, 0x1a8a9d02, 0xe482, 0x461b, 0xb8,0xc7, 0x8e,0xfa,0xd1,0xcc,0xe5,0x90)
 #endif
 #else
-typedef struct IThreadPoolTimerStaticsVtbl {
+typedef struct __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl {
     BEGIN_INTERFACE
 
     /*** IUnknown methods ***/
     HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        IThreadPoolTimerStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
         REFIID riid,
         void **ppvObject);
 
     ULONG (STDMETHODCALLTYPE *AddRef)(
-        IThreadPoolTimerStatics* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This);
 
     ULONG (STDMETHODCALLTYPE *Release)(
-        IThreadPoolTimerStatics* This);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This);
 
     /*** IInspectable methods ***/
     HRESULT (STDMETHODCALLTYPE *GetIids)(
-        IThreadPoolTimerStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
         ULONG *iidCount,
         IID **iids);
 
     HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        IThreadPoolTimerStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
         HSTRING *className);
 
     HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        IThreadPoolTimerStatics* This,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
         TrustLevel *trustLevel);
 
     /*** IThreadPoolTimerStatics methods ***/
     HRESULT (STDMETHODCALLTYPE *CreatePeriodicTimer)(
-        IThreadPoolTimerStatics* This,
-        TimerElapsedHandler *handler,
-        TimeSpan period,
-        IThreadPoolTimer **timer);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);
 
     HRESULT (STDMETHODCALLTYPE *CreateTimer)(
-        IThreadPoolTimerStatics* This,
-        TimerElapsedHandler *handler,
-        TimeSpan delay,
-        IThreadPoolTimer **timer);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);
 
     HRESULT (STDMETHODCALLTYPE *CreatePeriodicTimerWithCompletion)(
-        IThreadPoolTimerStatics* This,
-        TimerElapsedHandler *handler,
-        TimeSpan period,
-        TimerDestroyedHandler *destroyed,
-        IThreadPoolTimer **timer);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);
 
     HRESULT (STDMETHODCALLTYPE *CreateTimerWithCompletion)(
-        IThreadPoolTimerStatics* This,
-        TimerElapsedHandler *handler,
-        TimeSpan delay,
-        TimerDestroyedHandler *destroyed,
-        IThreadPoolTimer **timer);
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics *This,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,
+        struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,
+        __x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,
+        __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer);
 
     END_INTERFACE
-} IThreadPoolTimerStaticsVtbl;
-interface IThreadPoolTimerStatics {
-    CONST_VTBL IThreadPoolTimerStaticsVtbl* lpVtbl;
+} __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl;
+
+interface __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics {
+    CONST_VTBL __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStaticsVtbl* lpVtbl;
 };
 
 #ifdef COBJMACROS
 #ifndef WIDL_C_INLINE_WRAPPERS
 /*** IUnknown methods ***/
-#define IThreadPoolTimerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IThreadPoolTimerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IThreadPoolTimerStatics_Release(This) (This)->lpVtbl->Release(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_Release(This) (This)->lpVtbl->Release(This)
 /*** IInspectable methods ***/
-#define IThreadPoolTimerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define IThreadPoolTimerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define IThreadPoolTimerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
 /*** IThreadPoolTimerStatics methods ***/
-#define IThreadPoolTimerStatics_CreatePeriodicTimer(This,handler,period,timer) (This)->lpVtbl->CreatePeriodicTimer(This,handler,period,timer)
-#define IThreadPoolTimerStatics_CreateTimer(This,handler,delay,timer) (This)->lpVtbl->CreateTimer(This,handler,delay,timer)
-#define IThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer) (This)->lpVtbl->CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer)
-#define IThreadPoolTimerStatics_CreateTimerWithCompletion(This,handler,delay,destroyed,timer) (This)->lpVtbl->CreateTimerWithCompletion(This,handler,delay,destroyed,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimer(This,handler,period,timer) (This)->lpVtbl->CreatePeriodicTimer(This,handler,period,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimer(This,handler,delay,timer) (This)->lpVtbl->CreateTimer(This,handler,delay,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer) (This)->lpVtbl->CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer)
+#define __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimerWithCompletion(This,handler,delay,destroyed,timer) (This)->lpVtbl->CreateTimerWithCompletion(This,handler,delay,destroyed,timer)
 #else
 /*** IUnknown methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_QueryInterface(IThreadPoolTimerStatics* This,REFIID riid,void **ppvObject) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_QueryInterface(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,REFIID riid,void **ppvObject) {
     return This->lpVtbl->QueryInterface(This,riid,ppvObject);
 }
-static FORCEINLINE ULONG IThreadPoolTimerStatics_AddRef(IThreadPoolTimerStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_AddRef(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This) {
     return This->lpVtbl->AddRef(This);
 }
-static FORCEINLINE ULONG IThreadPoolTimerStatics_Release(IThreadPoolTimerStatics* This) {
+static FORCEINLINE ULONG __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_Release(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This) {
     return This->lpVtbl->Release(This);
 }
 /*** IInspectable methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_GetIids(IThreadPoolTimerStatics* This,ULONG *iidCount,IID **iids) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetIids(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,ULONG *iidCount,IID **iids) {
     return This->lpVtbl->GetIids(This,iidCount,iids);
 }
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_GetRuntimeClassName(IThreadPoolTimerStatics* This,HSTRING *className) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetRuntimeClassName(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,HSTRING *className) {
     return This->lpVtbl->GetRuntimeClassName(This,className);
 }
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_GetTrustLevel(IThreadPoolTimerStatics* This,TrustLevel *trustLevel) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_GetTrustLevel(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,TrustLevel *trustLevel) {
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IThreadPoolTimerStatics methods ***/
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_CreatePeriodicTimer(IThreadPoolTimerStatics* This,TimerElapsedHandler *handler,TimeSpan period,IThreadPoolTimer **timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimer(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
     return This->lpVtbl->CreatePeriodicTimer(This,handler,period,timer);
 }
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_CreateTimer(IThreadPoolTimerStatics* This,TimerElapsedHandler *handler,TimeSpan delay,IThreadPoolTimer **timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimer(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
     return This->lpVtbl->CreateTimer(This,handler,delay,timer);
 }
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(IThreadPoolTimerStatics* This,TimerElapsedHandler *handler,TimeSpan period,TimerDestroyedHandler *destroyed,IThreadPoolTimer **timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan period,__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
     return This->lpVtbl->CreatePeriodicTimerWithCompletion(This,handler,period,destroyed,timer);
 }
-static FORCEINLINE HRESULT IThreadPoolTimerStatics_CreateTimerWithCompletion(IThreadPoolTimerStatics* This,TimerElapsedHandler *handler,TimeSpan delay,TimerDestroyedHandler *destroyed,IThreadPoolTimer **timer) {
+static FORCEINLINE HRESULT __x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_CreateTimerWithCompletion(__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics* This,__x_ABI_CWindows_CSystem_CThreading_CTimerElapsedHandler *handler,struct __x_ABI_CWindows_CSystem_CThreading_CTimeSpan delay,__x_ABI_CWindows_CSystem_CThreading_CTimerDestroyedHandler *destroyed,__x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimer **timer) {
     return This->lpVtbl->CreateTimerWithCompletion(This,handler,delay,destroyed,timer);
 }
 #endif
@@ -831,50 +991,7 @@
 
 #endif
 
-HRESULT STDMETHODCALLTYPE IThreadPoolTimerStatics_CreatePeriodicTimer_Proxy(
-    IThreadPoolTimerStatics* This,
-    TimerElapsedHandler *handler,
-    TimeSpan period,
-    IThreadPoolTimer **timer);
-void __RPC_STUB IThreadPoolTimerStatics_CreatePeriodicTimer_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolTimerStatics_CreateTimer_Proxy(
-    IThreadPoolTimerStatics* This,
-    TimerElapsedHandler *handler,
-    TimeSpan delay,
-    IThreadPoolTimer **timer);
-void __RPC_STUB IThreadPoolTimerStatics_CreateTimer_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion_Proxy(
-    IThreadPoolTimerStatics* This,
-    TimerElapsedHandler *handler,
-    TimeSpan period,
-    TimerDestroyedHandler *destroyed,
-    IThreadPoolTimer **timer);
-void __RPC_STUB IThreadPoolTimerStatics_CreatePeriodicTimerWithCompletion_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IThreadPoolTimerStatics_CreateTimerWithCompletion_Proxy(
-    IThreadPoolTimerStatics* This,
-    TimerElapsedHandler *handler,
-    TimeSpan delay,
-    TimerDestroyedHandler *destroyed,
-    IThreadPoolTimer **timer);
-void __RPC_STUB IThreadPoolTimerStatics_CreateTimerWithCompletion_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-
-#endif  /* __IThreadPoolTimerStatics_INTERFACE_DEFINED__ */
+#endif  /* ____x_ABI_CWindows_CSystem_CThreading_CIThreadPoolTimerStatics_INTERFACE_DEFINED__ */
 
 /* Begin additional prototypes for all interfaces */
 
diff --git a/mingw-w64-headers/include/windows.system.threading.idl b/mingw-w64-headers/include/windows.system.threading.idl
index 82b12b7..e4e9f8c 100644
--- a/mingw-w64-headers/include/windows.system.threading.idl
+++ b/mingw-w64-headers/include/windows.system.threading.idl
@@ -63,7 +63,7 @@
             [uuid(1D1A8B8B-FA66-414F-9CBD-B65FC99D17FA)]
             interface WorkItemHandler : IUnknown {
                 HRESULT Invoke(
-                        IAsyncAction* operation);
+                        Windows.Foundation.IAsyncAction* operation);
             }
 
             [uuid(B6BF67DD-84BD-44F8-AC1C-93EBCB9DBA91)]
