diff --git a/mingw-w64-headers/direct-x/include/d3d11_1.h b/mingw-w64-headers/direct-x/include/d3d11_1.h
index ad50171..e4ffaca 100644
--- a/mingw-w64-headers/direct-x/include/d3d11_1.h
+++ b/mingw-w64-headers/direct-x/include/d3d11_1.h
@@ -17,6 +17,11 @@
 
 /* Forward declarations */
 
+#ifndef __ID3D11BlendState1_FWD_DEFINED__
+#define __ID3D11BlendState1_FWD_DEFINED__
+typedef interface ID3D11BlendState1 ID3D11BlendState1;
+#endif
+
 #ifndef __ID3DDeviceContextState_FWD_DEFINED__
 #define __ID3DDeviceContextState_FWD_DEFINED__
 typedef interface ID3DDeviceContextState ID3DDeviceContextState;
@@ -32,6 +37,16 @@
 typedef interface ID3DUserDefinedAnnotation ID3DUserDefinedAnnotation;
 #endif
 
+#ifndef __ID3D11RasterizerState1_FWD_DEFINED__
+#define __ID3D11RasterizerState1_FWD_DEFINED__
+typedef interface ID3D11RasterizerState1 ID3D11RasterizerState1;
+#endif
+
+#ifndef __ID3D11Device1_FWD_DEFINED__
+#define __ID3D11Device1_FWD_DEFINED__
+typedef interface ID3D11Device1 ID3D11Device1;
+#endif
+
 /* Headers for imported files */
 
 #include <oaidl.h>
@@ -44,6 +59,189 @@
 extern "C" {
 #endif
 
+typedef enum D3D11_LOGIC_OP {
+    D3D11_LOGIC_OP_CLEAR = 0,
+    D3D11_LOGIC_OP_SET = 1,
+    D3D11_LOGIC_OP_COPY = 2,
+    D3D11_LOGIC_OP_COPY_INVERTED = 3,
+    D3D11_LOGIC_OP_NOOP = 4,
+    D3D11_LOGIC_OP_INVERT = 5,
+    D3D11_LOGIC_OP_AND = 6,
+    D3D11_LOGIC_OP_NAND = 7,
+    D3D11_LOGIC_OP_OR = 8,
+    D3D11_LOGIC_OP_NOR = 9,
+    D3D11_LOGIC_OP_XOR = 10,
+    D3D11_LOGIC_OP_EQUIV = 11,
+    D3D11_LOGIC_OP_AND_REVERSE = 12,
+    D3D11_LOGIC_OP_AND_INVERTED = 13,
+    D3D11_LOGIC_OP_OR_REVERSE = 14,
+    D3D11_LOGIC_OP_OR_INVERTED = 15
+} D3D11_LOGIC_OP;
+typedef struct _D3D11_RENDER_TARGET_BLEND_DESC1 {
+    WINBOOL BlendEnable;
+    WINBOOL LogicOpEnable;
+    D3D11_BLEND SrcBlend;
+    D3D11_BLEND DestBlend;
+    D3D11_BLEND_OP BlendOp;
+    D3D11_BLEND SrcBlendAlpha;
+    D3D11_BLEND DestBlendAlpha;
+    D3D11_BLEND_OP BlendOpAlpha;
+    D3D11_LOGIC_OP LogicOp;
+    UINT8 RenderTargetWriteMask;
+} D3D11_RENDER_TARGET_BLEND_DESC1;
+typedef struct _D3D11_BLEND_DESC1 {
+    WINBOOL AlphaToCoverageEnable;
+    WINBOOL IndependentBlendEnable;
+    D3D11_RENDER_TARGET_BLEND_DESC1 RenderTarget[8];
+} D3D11_BLEND_DESC1;
+typedef struct _D3D11_RASTERIZER_DESC1 {
+    D3D11_FILL_MODE FillMode;
+    D3D11_CULL_MODE CullMode;
+    WINBOOL FrontCounterClockwise;
+    INT DepthBias;
+    FLOAT DepthBiasClamp;
+    FLOAT SlopeScaledDepthBias;
+    WINBOOL DepthClipEnable;
+    WINBOOL ScissorEnable;
+    WINBOOL MultisampleEnable;
+    WINBOOL AntialiasedLineEnable;
+    UINT ForcedSampleCount;
+} D3D11_RASTERIZER_DESC1;
+/*****************************************************************************
+ * ID3D11BlendState1 interface
+ */
+#ifndef __ID3D11BlendState1_INTERFACE_DEFINED__
+#define __ID3D11BlendState1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_ID3D11BlendState1, 0xcc86fabe, 0xda55, 0x401d, 0x85,0xe7, 0xe3,0xc9,0xde,0x28,0x77,0xe9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("cc86fabe-da55-401d-85e7-e3c9de2877e9")
+ID3D11BlendState1 : public ID3D11BlendState
+{
+    virtual void STDMETHODCALLTYPE GetDesc1(
+        D3D11_BLEND_DESC1 *pDesc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ID3D11BlendState1, 0xcc86fabe, 0xda55, 0x401d, 0x85,0xe7, 0xe3,0xc9,0xde,0x28,0x77,0xe9)
+#endif
+#else
+typedef struct ID3D11BlendState1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ID3D11BlendState1* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ID3D11BlendState1* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ID3D11BlendState1* This);
+
+    /*** ID3D11DeviceChild methods ***/
+    void (STDMETHODCALLTYPE *GetDevice)(
+        ID3D11BlendState1* This,
+        ID3D11Device **ppDevice);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
+        ID3D11BlendState1* This,
+        REFGUID guid,
+        UINT *pDataSize,
+        void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
+        ID3D11BlendState1* This,
+        REFGUID guid,
+        UINT DataSize,
+        const void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
+        ID3D11BlendState1* This,
+        REFGUID guid,
+        const IUnknown *pData);
+
+    /*** ID3D11BlendState methods ***/
+    void (STDMETHODCALLTYPE *GetDesc)(
+        ID3D11BlendState1* This,
+        D3D11_BLEND_DESC *pDesc);
+
+    /*** ID3D11BlendState1 methods ***/
+    void (STDMETHODCALLTYPE *GetDesc1)(
+        ID3D11BlendState1* This,
+        D3D11_BLEND_DESC1 *pDesc);
+
+    END_INTERFACE
+} ID3D11BlendState1Vtbl;
+interface ID3D11BlendState1 {
+    CONST_VTBL ID3D11BlendState1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define ID3D11BlendState1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ID3D11BlendState1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ID3D11BlendState1_Release(This) (This)->lpVtbl->Release(This)
+/*** ID3D11DeviceChild methods ***/
+#define ID3D11BlendState1_GetDevice(This,ppDevice) (This)->lpVtbl->GetDevice(This,ppDevice)
+#define ID3D11BlendState1_GetPrivateData(This,guid,pDataSize,pData) (This)->lpVtbl->GetPrivateData(This,guid,pDataSize,pData)
+#define ID3D11BlendState1_SetPrivateData(This,guid,DataSize,pData) (This)->lpVtbl->SetPrivateData(This,guid,DataSize,pData)
+#define ID3D11BlendState1_SetPrivateDataInterface(This,guid,pData) (This)->lpVtbl->SetPrivateDataInterface(This,guid,pData)
+/*** ID3D11BlendState methods ***/
+#define ID3D11BlendState1_GetDesc(This,pDesc) (This)->lpVtbl->GetDesc(This,pDesc)
+/*** ID3D11BlendState1 methods ***/
+#define ID3D11BlendState1_GetDesc1(This,pDesc) (This)->lpVtbl->GetDesc1(This,pDesc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT ID3D11BlendState1_QueryInterface(ID3D11BlendState1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG ID3D11BlendState1_AddRef(ID3D11BlendState1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG ID3D11BlendState1_Release(ID3D11BlendState1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ID3D11DeviceChild methods ***/
+static FORCEINLINE void ID3D11BlendState1_GetDevice(ID3D11BlendState1* This,ID3D11Device **ppDevice) {
+    This->lpVtbl->GetDevice(This,ppDevice);
+}
+static FORCEINLINE HRESULT ID3D11BlendState1_GetPrivateData(ID3D11BlendState1* This,REFGUID guid,UINT *pDataSize,void *pData) {
+    return This->lpVtbl->GetPrivateData(This,guid,pDataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11BlendState1_SetPrivateData(ID3D11BlendState1* This,REFGUID guid,UINT DataSize,const void *pData) {
+    return This->lpVtbl->SetPrivateData(This,guid,DataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11BlendState1_SetPrivateDataInterface(ID3D11BlendState1* This,REFGUID guid,const IUnknown *pData) {
+    return This->lpVtbl->SetPrivateDataInterface(This,guid,pData);
+}
+/*** ID3D11BlendState methods ***/
+static FORCEINLINE void ID3D11BlendState1_GetDesc(ID3D11BlendState1* This,D3D11_BLEND_DESC *pDesc) {
+    This->lpVtbl->GetDesc(This,pDesc);
+}
+/*** ID3D11BlendState1 methods ***/
+static FORCEINLINE void ID3D11BlendState1_GetDesc1(ID3D11BlendState1* This,D3D11_BLEND_DESC1 *pDesc) {
+    This->lpVtbl->GetDesc1(This,pDesc);
+}
+#endif
+#endif
+
+#endif
+
+void STDMETHODCALLTYPE ID3D11BlendState1_GetDesc1_Proxy(
+    ID3D11BlendState1* This,
+    D3D11_BLEND_DESC1 *pDesc);
+void __RPC_STUB ID3D11BlendState1_GetDesc1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __ID3D11BlendState1_INTERFACE_DEFINED__ */
+
 /*****************************************************************************
  * ID3DDeviceContextState interface
  */
@@ -2009,6 +2207,774 @@
 
 #endif  /* __ID3DUserDefinedAnnotation_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * ID3D11RasterizerState1 interface
+ */
+#ifndef __ID3D11RasterizerState1_INTERFACE_DEFINED__
+#define __ID3D11RasterizerState1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_ID3D11RasterizerState1, 0x1217d7a6, 0x5039, 0x418c, 0xb0,0x42, 0x9c,0xbe,0x25,0x6a,0xfd,0x6e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1217d7a6-5039-418c-b042-9cbe256afd6e")
+ID3D11RasterizerState1 : public ID3D11RasterizerState
+{
+    virtual void STDMETHODCALLTYPE GetDesc1(
+        D3D11_RASTERIZER_DESC1 *pDesc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ID3D11RasterizerState1, 0x1217d7a6, 0x5039, 0x418c, 0xb0,0x42, 0x9c,0xbe,0x25,0x6a,0xfd,0x6e)
+#endif
+#else
+typedef struct ID3D11RasterizerState1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ID3D11RasterizerState1* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ID3D11RasterizerState1* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ID3D11RasterizerState1* This);
+
+    /*** ID3D11DeviceChild methods ***/
+    void (STDMETHODCALLTYPE *GetDevice)(
+        ID3D11RasterizerState1* This,
+        ID3D11Device **ppDevice);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
+        ID3D11RasterizerState1* This,
+        REFGUID guid,
+        UINT *pDataSize,
+        void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
+        ID3D11RasterizerState1* This,
+        REFGUID guid,
+        UINT DataSize,
+        const void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
+        ID3D11RasterizerState1* This,
+        REFGUID guid,
+        const IUnknown *pData);
+
+    /*** ID3D11RasterizerState methods ***/
+    void (STDMETHODCALLTYPE *GetDesc)(
+        ID3D11RasterizerState1* This,
+        D3D11_RASTERIZER_DESC *pDesc);
+
+    /*** ID3D11RasterizerState1 methods ***/
+    void (STDMETHODCALLTYPE *GetDesc1)(
+        ID3D11RasterizerState1* This,
+        D3D11_RASTERIZER_DESC1 *pDesc);
+
+    END_INTERFACE
+} ID3D11RasterizerState1Vtbl;
+interface ID3D11RasterizerState1 {
+    CONST_VTBL ID3D11RasterizerState1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define ID3D11RasterizerState1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ID3D11RasterizerState1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ID3D11RasterizerState1_Release(This) (This)->lpVtbl->Release(This)
+/*** ID3D11DeviceChild methods ***/
+#define ID3D11RasterizerState1_GetDevice(This,ppDevice) (This)->lpVtbl->GetDevice(This,ppDevice)
+#define ID3D11RasterizerState1_GetPrivateData(This,guid,pDataSize,pData) (This)->lpVtbl->GetPrivateData(This,guid,pDataSize,pData)
+#define ID3D11RasterizerState1_SetPrivateData(This,guid,DataSize,pData) (This)->lpVtbl->SetPrivateData(This,guid,DataSize,pData)
+#define ID3D11RasterizerState1_SetPrivateDataInterface(This,guid,pData) (This)->lpVtbl->SetPrivateDataInterface(This,guid,pData)
+/*** ID3D11RasterizerState methods ***/
+#define ID3D11RasterizerState1_GetDesc(This,pDesc) (This)->lpVtbl->GetDesc(This,pDesc)
+/*** ID3D11RasterizerState1 methods ***/
+#define ID3D11RasterizerState1_GetDesc1(This,pDesc) (This)->lpVtbl->GetDesc1(This,pDesc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT ID3D11RasterizerState1_QueryInterface(ID3D11RasterizerState1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG ID3D11RasterizerState1_AddRef(ID3D11RasterizerState1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG ID3D11RasterizerState1_Release(ID3D11RasterizerState1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ID3D11DeviceChild methods ***/
+static FORCEINLINE void ID3D11RasterizerState1_GetDevice(ID3D11RasterizerState1* This,ID3D11Device **ppDevice) {
+    This->lpVtbl->GetDevice(This,ppDevice);
+}
+static FORCEINLINE HRESULT ID3D11RasterizerState1_GetPrivateData(ID3D11RasterizerState1* This,REFGUID guid,UINT *pDataSize,void *pData) {
+    return This->lpVtbl->GetPrivateData(This,guid,pDataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11RasterizerState1_SetPrivateData(ID3D11RasterizerState1* This,REFGUID guid,UINT DataSize,const void *pData) {
+    return This->lpVtbl->SetPrivateData(This,guid,DataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11RasterizerState1_SetPrivateDataInterface(ID3D11RasterizerState1* This,REFGUID guid,const IUnknown *pData) {
+    return This->lpVtbl->SetPrivateDataInterface(This,guid,pData);
+}
+/*** ID3D11RasterizerState methods ***/
+static FORCEINLINE void ID3D11RasterizerState1_GetDesc(ID3D11RasterizerState1* This,D3D11_RASTERIZER_DESC *pDesc) {
+    This->lpVtbl->GetDesc(This,pDesc);
+}
+/*** ID3D11RasterizerState1 methods ***/
+static FORCEINLINE void ID3D11RasterizerState1_GetDesc1(ID3D11RasterizerState1* This,D3D11_RASTERIZER_DESC1 *pDesc) {
+    This->lpVtbl->GetDesc1(This,pDesc);
+}
+#endif
+#endif
+
+#endif
+
+void STDMETHODCALLTYPE ID3D11RasterizerState1_GetDesc1_Proxy(
+    ID3D11RasterizerState1* This,
+    D3D11_RASTERIZER_DESC1 *pDesc);
+void __RPC_STUB ID3D11RasterizerState1_GetDesc1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __ID3D11RasterizerState1_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ID3D11Device1 interface
+ */
+#ifndef __ID3D11Device1_INTERFACE_DEFINED__
+#define __ID3D11Device1_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_ID3D11Device1, 0xa04bfb29, 0x08ef, 0x43d6, 0xa4,0x9c, 0xa9,0xbd,0xbd,0xcb,0xe6,0x86);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a04bfb29-08ef-43d6-a49c-a9bdbdcbe686")
+ID3D11Device1 : public ID3D11Device
+{
+    virtual void STDMETHODCALLTYPE GetImmediateContext1(
+        ID3D11DeviceContext1 **ppImmediateContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDeferredContext1(
+        UINT ContextFlags,
+        ID3D11DeviceContext1 **ppDeferredContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateBlendState1(
+        const D3D11_BLEND_DESC1 *pBlendStateDesc,
+        ID3D11BlendState1 **ppBlendState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateRasterizerState1(
+        const D3D11_RASTERIZER_DESC1 *pRasterizerDesc,
+        ID3D11RasterizerState1 **ppRasterizerState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDeviceContextState(
+        UINT Flags,
+        const D3D_FEATURE_LEVEL *pFeatureLevels,
+        UINT FeatureLevels,
+        UINT SDKVersion,
+        REFIID EmulatedInterface,
+        D3D_FEATURE_LEVEL *pChosenFeatureLevel,
+        ID3DDeviceContextState **ppContextState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OpenSharedResource1(
+        HANDLE hResource,
+        REFIID returnedInterface,
+        void **ppResource) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OpenSharedResourceByName(
+        LPCWSTR lpName,
+        DWORD dwDesiredAccess,
+        REFIID returnedInterface,
+        void **ppResource) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ID3D11Device1, 0xa04bfb29, 0x08ef, 0x43d6, 0xa4,0x9c, 0xa9,0xbd,0xbd,0xcb,0xe6,0x86)
+#endif
+#else
+typedef struct ID3D11Device1Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ID3D11Device1* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ID3D11Device1* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ID3D11Device1* This);
+
+    /*** ID3D11Device methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateBuffer)(
+        ID3D11Device1* This,
+        const D3D11_BUFFER_DESC *pDesc,
+        const D3D11_SUBRESOURCE_DATA *pInitialData,
+        ID3D11Buffer **ppBuffer);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTexture1D)(
+        ID3D11Device1* This,
+        const D3D11_TEXTURE1D_DESC *pDesc,
+        const D3D11_SUBRESOURCE_DATA *pInitialData,
+        ID3D11Texture1D **ppTexture1D);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTexture2D)(
+        ID3D11Device1* This,
+        const D3D11_TEXTURE2D_DESC *pDesc,
+        const D3D11_SUBRESOURCE_DATA *pInitialData,
+        ID3D11Texture2D **ppTexture2D);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTexture3D)(
+        ID3D11Device1* This,
+        const D3D11_TEXTURE3D_DESC *pDesc,
+        const D3D11_SUBRESOURCE_DATA *pInitialData,
+        ID3D11Texture3D **ppTexture3D);
+
+    HRESULT (STDMETHODCALLTYPE *CreateShaderResourceView)(
+        ID3D11Device1* This,
+        ID3D11Resource *pResource,
+        const D3D11_SHADER_RESOURCE_VIEW_DESC *pDesc,
+        ID3D11ShaderResourceView **ppSRView);
+
+    HRESULT (STDMETHODCALLTYPE *CreateUnorderedAccessView)(
+        ID3D11Device1* This,
+        ID3D11Resource *pResource,
+        const D3D11_UNORDERED_ACCESS_VIEW_DESC *pDesc,
+        ID3D11UnorderedAccessView **ppUAView);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRenderTargetView)(
+        ID3D11Device1* This,
+        ID3D11Resource *pResource,
+        const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,
+        ID3D11RenderTargetView **ppRTView);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDepthStencilView)(
+        ID3D11Device1* This,
+        ID3D11Resource *pResource,
+        const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc,
+        ID3D11DepthStencilView **ppDepthStencilView);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInputLayout)(
+        ID3D11Device1* This,
+        const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs,
+        UINT NumElements,
+        const void *pShaderBytecodeWithInputSignature,
+        SIZE_T BytecodeLength,
+        ID3D11InputLayout **ppInputLayout);
+
+    HRESULT (STDMETHODCALLTYPE *CreateVertexShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11VertexShader **ppVertexShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGeometryShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11GeometryShader **ppGeometryShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateGeometryShaderWithStreamOutput)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        const D3D11_SO_DECLARATION_ENTRY *pSODeclaration,
+        UINT NumEntries,
+        const UINT *pBufferStrides,
+        UINT NumStrides,
+        UINT RasterizedStream,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11GeometryShader **ppGeometryShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreatePixelShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11PixelShader **ppPixelShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateHullShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11HullShader **ppHullShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDomainShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11DomainShader **ppDomainShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateComputeShader)(
+        ID3D11Device1* This,
+        const void *pShaderBytecode,
+        SIZE_T BytecodeLength,
+        ID3D11ClassLinkage *pClassLinkage,
+        ID3D11ComputeShader **ppComputeShader);
+
+    HRESULT (STDMETHODCALLTYPE *CreateClassLinkage)(
+        ID3D11Device1* This,
+        ID3D11ClassLinkage **ppLinkage);
+
+    HRESULT (STDMETHODCALLTYPE *CreateBlendState)(
+        ID3D11Device1* This,
+        const D3D11_BLEND_DESC *pBlendStateDesc,
+        ID3D11BlendState **ppBlendState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDepthStencilState)(
+        ID3D11Device1* This,
+        const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc,
+        ID3D11DepthStencilState **ppDepthStencilState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRasterizerState)(
+        ID3D11Device1* This,
+        const D3D11_RASTERIZER_DESC *pRasterizerDesc,
+        ID3D11RasterizerState **ppRasterizerState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSamplerState)(
+        ID3D11Device1* This,
+        const D3D11_SAMPLER_DESC *pSamplerDesc,
+        ID3D11SamplerState **ppSamplerState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateQuery)(
+        ID3D11Device1* This,
+        const D3D11_QUERY_DESC *pQueryDesc,
+        ID3D11Query **ppQuery);
+
+    HRESULT (STDMETHODCALLTYPE *CreatePredicate)(
+        ID3D11Device1* This,
+        const D3D11_QUERY_DESC *pPredicateDesc,
+        ID3D11Predicate **ppPredicate);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCounter)(
+        ID3D11Device1* This,
+        const D3D11_COUNTER_DESC *pCounterDesc,
+        ID3D11Counter **ppCounter);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDeferredContext)(
+        ID3D11Device1* This,
+        UINT ContextFlags,
+        ID3D11DeviceContext **ppDeferredContext);
+
+    HRESULT (STDMETHODCALLTYPE *OpenSharedResource)(
+        ID3D11Device1* This,
+        HANDLE hResource,
+        REFIID ReturnedInterface,
+        void **ppResource);
+
+    HRESULT (STDMETHODCALLTYPE *CheckFormatSupport)(
+        ID3D11Device1* This,
+        DXGI_FORMAT Format,
+        UINT *pFormatSupport);
+
+    HRESULT (STDMETHODCALLTYPE *CheckMultisampleQualityLevels)(
+        ID3D11Device1* This,
+        DXGI_FORMAT Format,
+        UINT SampleCount,
+        UINT *pNumQualityLevels);
+
+    void (STDMETHODCALLTYPE *CheckCounterInfo)(
+        ID3D11Device1* This,
+        D3D11_COUNTER_INFO *pCounterInfo);
+
+    HRESULT (STDMETHODCALLTYPE *CheckCounter)(
+        ID3D11Device1* This,
+        const D3D11_COUNTER_DESC *pDesc,
+        D3D11_COUNTER_TYPE *pType,
+        UINT *pActiveCounters,
+        LPSTR szName,
+        UINT *pNameLength,
+        LPSTR szUnits,
+        UINT *pUnitsLength,
+        LPSTR szDescription,
+        UINT *pDescriptionLength);
+
+    HRESULT (STDMETHODCALLTYPE *CheckFeatureSupport)(
+        ID3D11Device1* This,
+        D3D11_FEATURE Feature,
+        void *pFeatureSupportData,
+        UINT FeatureSupportDataSize);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
+        ID3D11Device1* This,
+        REFGUID guid,
+        UINT *pDataSize,
+        void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
+        ID3D11Device1* This,
+        REFGUID guid,
+        UINT DataSize,
+        const void *pData);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
+        ID3D11Device1* This,
+        REFGUID guid,
+        const IUnknown *pData);
+
+    D3D_FEATURE_LEVEL (STDMETHODCALLTYPE *GetFeatureLevel)(
+        ID3D11Device1* This);
+
+    UINT (STDMETHODCALLTYPE *GetCreationFlags)(
+        ID3D11Device1* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDeviceRemovedReason)(
+        ID3D11Device1* This);
+
+    void (STDMETHODCALLTYPE *GetImmediateContext)(
+        ID3D11Device1* This,
+        ID3D11DeviceContext **ppImmediateContext);
+
+    HRESULT (STDMETHODCALLTYPE *SetExceptionMode)(
+        ID3D11Device1* This,
+        UINT RaiseFlags);
+
+    UINT (STDMETHODCALLTYPE *GetExceptionMode)(
+        ID3D11Device1* This);
+
+    /*** ID3D11Device1 methods ***/
+    void (STDMETHODCALLTYPE *GetImmediateContext1)(
+        ID3D11Device1* This,
+        ID3D11DeviceContext1 **ppImmediateContext);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDeferredContext1)(
+        ID3D11Device1* This,
+        UINT ContextFlags,
+        ID3D11DeviceContext1 **ppDeferredContext);
+
+    HRESULT (STDMETHODCALLTYPE *CreateBlendState1)(
+        ID3D11Device1* This,
+        const D3D11_BLEND_DESC1 *pBlendStateDesc,
+        ID3D11BlendState1 **ppBlendState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateRasterizerState1)(
+        ID3D11Device1* This,
+        const D3D11_RASTERIZER_DESC1 *pRasterizerDesc,
+        ID3D11RasterizerState1 **ppRasterizerState);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDeviceContextState)(
+        ID3D11Device1* This,
+        UINT Flags,
+        const D3D_FEATURE_LEVEL *pFeatureLevels,
+        UINT FeatureLevels,
+        UINT SDKVersion,
+        REFIID EmulatedInterface,
+        D3D_FEATURE_LEVEL *pChosenFeatureLevel,
+        ID3DDeviceContextState **ppContextState);
+
+    HRESULT (STDMETHODCALLTYPE *OpenSharedResource1)(
+        ID3D11Device1* This,
+        HANDLE hResource,
+        REFIID returnedInterface,
+        void **ppResource);
+
+    HRESULT (STDMETHODCALLTYPE *OpenSharedResourceByName)(
+        ID3D11Device1* This,
+        LPCWSTR lpName,
+        DWORD dwDesiredAccess,
+        REFIID returnedInterface,
+        void **ppResource);
+
+    END_INTERFACE
+} ID3D11Device1Vtbl;
+interface ID3D11Device1 {
+    CONST_VTBL ID3D11Device1Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define ID3D11Device1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ID3D11Device1_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ID3D11Device1_Release(This) (This)->lpVtbl->Release(This)
+/*** ID3D11Device methods ***/
+#define ID3D11Device1_CreateBuffer(This,pDesc,pInitialData,ppBuffer) (This)->lpVtbl->CreateBuffer(This,pDesc,pInitialData,ppBuffer)
+#define ID3D11Device1_CreateTexture1D(This,pDesc,pInitialData,ppTexture1D) (This)->lpVtbl->CreateTexture1D(This,pDesc,pInitialData,ppTexture1D)
+#define ID3D11Device1_CreateTexture2D(This,pDesc,pInitialData,ppTexture2D) (This)->lpVtbl->CreateTexture2D(This,pDesc,pInitialData,ppTexture2D)
+#define ID3D11Device1_CreateTexture3D(This,pDesc,pInitialData,ppTexture3D) (This)->lpVtbl->CreateTexture3D(This,pDesc,pInitialData,ppTexture3D)
+#define ID3D11Device1_CreateShaderResourceView(This,pResource,pDesc,ppSRView) (This)->lpVtbl->CreateShaderResourceView(This,pResource,pDesc,ppSRView)
+#define ID3D11Device1_CreateUnorderedAccessView(This,pResource,pDesc,ppUAView) (This)->lpVtbl->CreateUnorderedAccessView(This,pResource,pDesc,ppUAView)
+#define ID3D11Device1_CreateRenderTargetView(This,pResource,pDesc,ppRTView) (This)->lpVtbl->CreateRenderTargetView(This,pResource,pDesc,ppRTView)
+#define ID3D11Device1_CreateDepthStencilView(This,pResource,pDesc,ppDepthStencilView) (This)->lpVtbl->CreateDepthStencilView(This,pResource,pDesc,ppDepthStencilView)
+#define ID3D11Device1_CreateInputLayout(This,pInputElementDescs,NumElements,pShaderBytecodeWithInputSignature,BytecodeLength,ppInputLayout) (This)->lpVtbl->CreateInputLayout(This,pInputElementDescs,NumElements,pShaderBytecodeWithInputSignature,BytecodeLength,ppInputLayout)
+#define ID3D11Device1_CreateVertexShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppVertexShader) (This)->lpVtbl->CreateVertexShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppVertexShader)
+#define ID3D11Device1_CreateGeometryShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppGeometryShader) (This)->lpVtbl->CreateGeometryShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppGeometryShader)
+#define ID3D11Device1_CreateGeometryShaderWithStreamOutput(This,pShaderBytecode,BytecodeLength,pSODeclaration,NumEntries,pBufferStrides,NumStrides,RasterizedStream,pClassLinkage,ppGeometryShader) (This)->lpVtbl->CreateGeometryShaderWithStreamOutput(This,pShaderBytecode,BytecodeLength,pSODeclaration,NumEntries,pBufferStrides,NumStrides,RasterizedStream,pClassLinkage,ppGeometryShader)
+#define ID3D11Device1_CreatePixelShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppPixelShader) (This)->lpVtbl->CreatePixelShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppPixelShader)
+#define ID3D11Device1_CreateHullShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppHullShader) (This)->lpVtbl->CreateHullShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppHullShader)
+#define ID3D11Device1_CreateDomainShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppDomainShader) (This)->lpVtbl->CreateDomainShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppDomainShader)
+#define ID3D11Device1_CreateComputeShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppComputeShader) (This)->lpVtbl->CreateComputeShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppComputeShader)
+#define ID3D11Device1_CreateClassLinkage(This,ppLinkage) (This)->lpVtbl->CreateClassLinkage(This,ppLinkage)
+#define ID3D11Device1_CreateBlendState(This,pBlendStateDesc,ppBlendState) (This)->lpVtbl->CreateBlendState(This,pBlendStateDesc,ppBlendState)
+#define ID3D11Device1_CreateDepthStencilState(This,pDepthStencilDesc,ppDepthStencilState) (This)->lpVtbl->CreateDepthStencilState(This,pDepthStencilDesc,ppDepthStencilState)
+#define ID3D11Device1_CreateRasterizerState(This,pRasterizerDesc,ppRasterizerState) (This)->lpVtbl->CreateRasterizerState(This,pRasterizerDesc,ppRasterizerState)
+#define ID3D11Device1_CreateSamplerState(This,pSamplerDesc,ppSamplerState) (This)->lpVtbl->CreateSamplerState(This,pSamplerDesc,ppSamplerState)
+#define ID3D11Device1_CreateQuery(This,pQueryDesc,ppQuery) (This)->lpVtbl->CreateQuery(This,pQueryDesc,ppQuery)
+#define ID3D11Device1_CreatePredicate(This,pPredicateDesc,ppPredicate) (This)->lpVtbl->CreatePredicate(This,pPredicateDesc,ppPredicate)
+#define ID3D11Device1_CreateCounter(This,pCounterDesc,ppCounter) (This)->lpVtbl->CreateCounter(This,pCounterDesc,ppCounter)
+#define ID3D11Device1_CreateDeferredContext(This,ContextFlags,ppDeferredContext) (This)->lpVtbl->CreateDeferredContext(This,ContextFlags,ppDeferredContext)
+#define ID3D11Device1_OpenSharedResource(This,hResource,ReturnedInterface,ppResource) (This)->lpVtbl->OpenSharedResource(This,hResource,ReturnedInterface,ppResource)
+#define ID3D11Device1_CheckFormatSupport(This,Format,pFormatSupport) (This)->lpVtbl->CheckFormatSupport(This,Format,pFormatSupport)
+#define ID3D11Device1_CheckMultisampleQualityLevels(This,Format,SampleCount,pNumQualityLevels) (This)->lpVtbl->CheckMultisampleQualityLevels(This,Format,SampleCount,pNumQualityLevels)
+#define ID3D11Device1_CheckCounterInfo(This,pCounterInfo) (This)->lpVtbl->CheckCounterInfo(This,pCounterInfo)
+#define ID3D11Device1_CheckCounter(This,pDesc,pType,pActiveCounters,szName,pNameLength,szUnits,pUnitsLength,szDescription,pDescriptionLength) (This)->lpVtbl->CheckCounter(This,pDesc,pType,pActiveCounters,szName,pNameLength,szUnits,pUnitsLength,szDescription,pDescriptionLength)
+#define ID3D11Device1_CheckFeatureSupport(This,Feature,pFeatureSupportData,FeatureSupportDataSize) (This)->lpVtbl->CheckFeatureSupport(This,Feature,pFeatureSupportData,FeatureSupportDataSize)
+#define ID3D11Device1_GetPrivateData(This,guid,pDataSize,pData) (This)->lpVtbl->GetPrivateData(This,guid,pDataSize,pData)
+#define ID3D11Device1_SetPrivateData(This,guid,DataSize,pData) (This)->lpVtbl->SetPrivateData(This,guid,DataSize,pData)
+#define ID3D11Device1_SetPrivateDataInterface(This,guid,pData) (This)->lpVtbl->SetPrivateDataInterface(This,guid,pData)
+#define ID3D11Device1_GetFeatureLevel(This) (This)->lpVtbl->GetFeatureLevel(This)
+#define ID3D11Device1_GetCreationFlags(This) (This)->lpVtbl->GetCreationFlags(This)
+#define ID3D11Device1_GetDeviceRemovedReason(This) (This)->lpVtbl->GetDeviceRemovedReason(This)
+#define ID3D11Device1_GetImmediateContext(This,ppImmediateContext) (This)->lpVtbl->GetImmediateContext(This,ppImmediateContext)
+#define ID3D11Device1_SetExceptionMode(This,RaiseFlags) (This)->lpVtbl->SetExceptionMode(This,RaiseFlags)
+#define ID3D11Device1_GetExceptionMode(This) (This)->lpVtbl->GetExceptionMode(This)
+/*** ID3D11Device1 methods ***/
+#define ID3D11Device1_GetImmediateContext1(This,ppImmediateContext) (This)->lpVtbl->GetImmediateContext1(This,ppImmediateContext)
+#define ID3D11Device1_CreateDeferredContext1(This,ContextFlags,ppDeferredContext) (This)->lpVtbl->CreateDeferredContext1(This,ContextFlags,ppDeferredContext)
+#define ID3D11Device1_CreateBlendState1(This,pBlendStateDesc,ppBlendState) (This)->lpVtbl->CreateBlendState1(This,pBlendStateDesc,ppBlendState)
+#define ID3D11Device1_CreateRasterizerState1(This,pRasterizerDesc,ppRasterizerState) (This)->lpVtbl->CreateRasterizerState1(This,pRasterizerDesc,ppRasterizerState)
+#define ID3D11Device1_CreateDeviceContextState(This,Flags,pFeatureLevels,FeatureLevels,SDKVersion,EmulatedInterface,pChosenFeatureLevel,ppContextState) (This)->lpVtbl->CreateDeviceContextState(This,Flags,pFeatureLevels,FeatureLevels,SDKVersion,EmulatedInterface,pChosenFeatureLevel,ppContextState)
+#define ID3D11Device1_OpenSharedResource1(This,hResource,returnedInterface,ppResource) (This)->lpVtbl->OpenSharedResource1(This,hResource,returnedInterface,ppResource)
+#define ID3D11Device1_OpenSharedResourceByName(This,lpName,dwDesiredAccess,returnedInterface,ppResource) (This)->lpVtbl->OpenSharedResourceByName(This,lpName,dwDesiredAccess,returnedInterface,ppResource)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT ID3D11Device1_QueryInterface(ID3D11Device1* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG ID3D11Device1_AddRef(ID3D11Device1* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG ID3D11Device1_Release(ID3D11Device1* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ID3D11Device methods ***/
+static FORCEINLINE HRESULT ID3D11Device1_CreateBuffer(ID3D11Device1* This,const D3D11_BUFFER_DESC *pDesc,const D3D11_SUBRESOURCE_DATA *pInitialData,ID3D11Buffer **ppBuffer) {
+    return This->lpVtbl->CreateBuffer(This,pDesc,pInitialData,ppBuffer);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateTexture1D(ID3D11Device1* This,const D3D11_TEXTURE1D_DESC *pDesc,const D3D11_SUBRESOURCE_DATA *pInitialData,ID3D11Texture1D **ppTexture1D) {
+    return This->lpVtbl->CreateTexture1D(This,pDesc,pInitialData,ppTexture1D);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateTexture2D(ID3D11Device1* This,const D3D11_TEXTURE2D_DESC *pDesc,const D3D11_SUBRESOURCE_DATA *pInitialData,ID3D11Texture2D **ppTexture2D) {
+    return This->lpVtbl->CreateTexture2D(This,pDesc,pInitialData,ppTexture2D);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateTexture3D(ID3D11Device1* This,const D3D11_TEXTURE3D_DESC *pDesc,const D3D11_SUBRESOURCE_DATA *pInitialData,ID3D11Texture3D **ppTexture3D) {
+    return This->lpVtbl->CreateTexture3D(This,pDesc,pInitialData,ppTexture3D);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateShaderResourceView(ID3D11Device1* This,ID3D11Resource *pResource,const D3D11_SHADER_RESOURCE_VIEW_DESC *pDesc,ID3D11ShaderResourceView **ppSRView) {
+    return This->lpVtbl->CreateShaderResourceView(This,pResource,pDesc,ppSRView);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateUnorderedAccessView(ID3D11Device1* This,ID3D11Resource *pResource,const D3D11_UNORDERED_ACCESS_VIEW_DESC *pDesc,ID3D11UnorderedAccessView **ppUAView) {
+    return This->lpVtbl->CreateUnorderedAccessView(This,pResource,pDesc,ppUAView);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateRenderTargetView(ID3D11Device1* This,ID3D11Resource *pResource,const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,ID3D11RenderTargetView **ppRTView) {
+    return This->lpVtbl->CreateRenderTargetView(This,pResource,pDesc,ppRTView);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDepthStencilView(ID3D11Device1* This,ID3D11Resource *pResource,const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc,ID3D11DepthStencilView **ppDepthStencilView) {
+    return This->lpVtbl->CreateDepthStencilView(This,pResource,pDesc,ppDepthStencilView);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateInputLayout(ID3D11Device1* This,const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs,UINT NumElements,const void *pShaderBytecodeWithInputSignature,SIZE_T BytecodeLength,ID3D11InputLayout **ppInputLayout) {
+    return This->lpVtbl->CreateInputLayout(This,pInputElementDescs,NumElements,pShaderBytecodeWithInputSignature,BytecodeLength,ppInputLayout);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateVertexShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11VertexShader **ppVertexShader) {
+    return This->lpVtbl->CreateVertexShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppVertexShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateGeometryShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11GeometryShader **ppGeometryShader) {
+    return This->lpVtbl->CreateGeometryShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppGeometryShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateGeometryShaderWithStreamOutput(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,const D3D11_SO_DECLARATION_ENTRY *pSODeclaration,UINT NumEntries,const UINT *pBufferStrides,UINT NumStrides,UINT RasterizedStream,ID3D11ClassLinkage *pClassLinkage,ID3D11GeometryShader **ppGeometryShader) {
+    return This->lpVtbl->CreateGeometryShaderWithStreamOutput(This,pShaderBytecode,BytecodeLength,pSODeclaration,NumEntries,pBufferStrides,NumStrides,RasterizedStream,pClassLinkage,ppGeometryShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreatePixelShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11PixelShader **ppPixelShader) {
+    return This->lpVtbl->CreatePixelShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppPixelShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateHullShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11HullShader **ppHullShader) {
+    return This->lpVtbl->CreateHullShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppHullShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDomainShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11DomainShader **ppDomainShader) {
+    return This->lpVtbl->CreateDomainShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppDomainShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateComputeShader(ID3D11Device1* This,const void *pShaderBytecode,SIZE_T BytecodeLength,ID3D11ClassLinkage *pClassLinkage,ID3D11ComputeShader **ppComputeShader) {
+    return This->lpVtbl->CreateComputeShader(This,pShaderBytecode,BytecodeLength,pClassLinkage,ppComputeShader);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateClassLinkage(ID3D11Device1* This,ID3D11ClassLinkage **ppLinkage) {
+    return This->lpVtbl->CreateClassLinkage(This,ppLinkage);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateBlendState(ID3D11Device1* This,const D3D11_BLEND_DESC *pBlendStateDesc,ID3D11BlendState **ppBlendState) {
+    return This->lpVtbl->CreateBlendState(This,pBlendStateDesc,ppBlendState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDepthStencilState(ID3D11Device1* This,const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc,ID3D11DepthStencilState **ppDepthStencilState) {
+    return This->lpVtbl->CreateDepthStencilState(This,pDepthStencilDesc,ppDepthStencilState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateRasterizerState(ID3D11Device1* This,const D3D11_RASTERIZER_DESC *pRasterizerDesc,ID3D11RasterizerState **ppRasterizerState) {
+    return This->lpVtbl->CreateRasterizerState(This,pRasterizerDesc,ppRasterizerState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateSamplerState(ID3D11Device1* This,const D3D11_SAMPLER_DESC *pSamplerDesc,ID3D11SamplerState **ppSamplerState) {
+    return This->lpVtbl->CreateSamplerState(This,pSamplerDesc,ppSamplerState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateQuery(ID3D11Device1* This,const D3D11_QUERY_DESC *pQueryDesc,ID3D11Query **ppQuery) {
+    return This->lpVtbl->CreateQuery(This,pQueryDesc,ppQuery);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreatePredicate(ID3D11Device1* This,const D3D11_QUERY_DESC *pPredicateDesc,ID3D11Predicate **ppPredicate) {
+    return This->lpVtbl->CreatePredicate(This,pPredicateDesc,ppPredicate);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateCounter(ID3D11Device1* This,const D3D11_COUNTER_DESC *pCounterDesc,ID3D11Counter **ppCounter) {
+    return This->lpVtbl->CreateCounter(This,pCounterDesc,ppCounter);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDeferredContext(ID3D11Device1* This,UINT ContextFlags,ID3D11DeviceContext **ppDeferredContext) {
+    return This->lpVtbl->CreateDeferredContext(This,ContextFlags,ppDeferredContext);
+}
+static FORCEINLINE HRESULT ID3D11Device1_OpenSharedResource(ID3D11Device1* This,HANDLE hResource,REFIID ReturnedInterface,void **ppResource) {
+    return This->lpVtbl->OpenSharedResource(This,hResource,ReturnedInterface,ppResource);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CheckFormatSupport(ID3D11Device1* This,DXGI_FORMAT Format,UINT *pFormatSupport) {
+    return This->lpVtbl->CheckFormatSupport(This,Format,pFormatSupport);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CheckMultisampleQualityLevels(ID3D11Device1* This,DXGI_FORMAT Format,UINT SampleCount,UINT *pNumQualityLevels) {
+    return This->lpVtbl->CheckMultisampleQualityLevels(This,Format,SampleCount,pNumQualityLevels);
+}
+static FORCEINLINE void ID3D11Device1_CheckCounterInfo(ID3D11Device1* This,D3D11_COUNTER_INFO *pCounterInfo) {
+    This->lpVtbl->CheckCounterInfo(This,pCounterInfo);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CheckCounter(ID3D11Device1* This,const D3D11_COUNTER_DESC *pDesc,D3D11_COUNTER_TYPE *pType,UINT *pActiveCounters,LPSTR szName,UINT *pNameLength,LPSTR szUnits,UINT *pUnitsLength,LPSTR szDescription,UINT *pDescriptionLength) {
+    return This->lpVtbl->CheckCounter(This,pDesc,pType,pActiveCounters,szName,pNameLength,szUnits,pUnitsLength,szDescription,pDescriptionLength);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CheckFeatureSupport(ID3D11Device1* This,D3D11_FEATURE Feature,void *pFeatureSupportData,UINT FeatureSupportDataSize) {
+    return This->lpVtbl->CheckFeatureSupport(This,Feature,pFeatureSupportData,FeatureSupportDataSize);
+}
+static FORCEINLINE HRESULT ID3D11Device1_GetPrivateData(ID3D11Device1* This,REFGUID guid,UINT *pDataSize,void *pData) {
+    return This->lpVtbl->GetPrivateData(This,guid,pDataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11Device1_SetPrivateData(ID3D11Device1* This,REFGUID guid,UINT DataSize,const void *pData) {
+    return This->lpVtbl->SetPrivateData(This,guid,DataSize,pData);
+}
+static FORCEINLINE HRESULT ID3D11Device1_SetPrivateDataInterface(ID3D11Device1* This,REFGUID guid,const IUnknown *pData) {
+    return This->lpVtbl->SetPrivateDataInterface(This,guid,pData);
+}
+static FORCEINLINE D3D_FEATURE_LEVEL ID3D11Device1_GetFeatureLevel(ID3D11Device1* This) {
+    return This->lpVtbl->GetFeatureLevel(This);
+}
+static FORCEINLINE UINT ID3D11Device1_GetCreationFlags(ID3D11Device1* This) {
+    return This->lpVtbl->GetCreationFlags(This);
+}
+static FORCEINLINE HRESULT ID3D11Device1_GetDeviceRemovedReason(ID3D11Device1* This) {
+    return This->lpVtbl->GetDeviceRemovedReason(This);
+}
+static FORCEINLINE void ID3D11Device1_GetImmediateContext(ID3D11Device1* This,ID3D11DeviceContext **ppImmediateContext) {
+    This->lpVtbl->GetImmediateContext(This,ppImmediateContext);
+}
+static FORCEINLINE HRESULT ID3D11Device1_SetExceptionMode(ID3D11Device1* This,UINT RaiseFlags) {
+    return This->lpVtbl->SetExceptionMode(This,RaiseFlags);
+}
+static FORCEINLINE UINT ID3D11Device1_GetExceptionMode(ID3D11Device1* This) {
+    return This->lpVtbl->GetExceptionMode(This);
+}
+/*** ID3D11Device1 methods ***/
+static FORCEINLINE void ID3D11Device1_GetImmediateContext1(ID3D11Device1* This,ID3D11DeviceContext1 **ppImmediateContext) {
+    This->lpVtbl->GetImmediateContext1(This,ppImmediateContext);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDeferredContext1(ID3D11Device1* This,UINT ContextFlags,ID3D11DeviceContext1 **ppDeferredContext) {
+    return This->lpVtbl->CreateDeferredContext1(This,ContextFlags,ppDeferredContext);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateBlendState1(ID3D11Device1* This,const D3D11_BLEND_DESC1 *pBlendStateDesc,ID3D11BlendState1 **ppBlendState) {
+    return This->lpVtbl->CreateBlendState1(This,pBlendStateDesc,ppBlendState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateRasterizerState1(ID3D11Device1* This,const D3D11_RASTERIZER_DESC1 *pRasterizerDesc,ID3D11RasterizerState1 **ppRasterizerState) {
+    return This->lpVtbl->CreateRasterizerState1(This,pRasterizerDesc,ppRasterizerState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_CreateDeviceContextState(ID3D11Device1* This,UINT Flags,const D3D_FEATURE_LEVEL *pFeatureLevels,UINT FeatureLevels,UINT SDKVersion,REFIID EmulatedInterface,D3D_FEATURE_LEVEL *pChosenFeatureLevel,ID3DDeviceContextState **ppContextState) {
+    return This->lpVtbl->CreateDeviceContextState(This,Flags,pFeatureLevels,FeatureLevels,SDKVersion,EmulatedInterface,pChosenFeatureLevel,ppContextState);
+}
+static FORCEINLINE HRESULT ID3D11Device1_OpenSharedResource1(ID3D11Device1* This,HANDLE hResource,REFIID returnedInterface,void **ppResource) {
+    return This->lpVtbl->OpenSharedResource1(This,hResource,returnedInterface,ppResource);
+}
+static FORCEINLINE HRESULT ID3D11Device1_OpenSharedResourceByName(ID3D11Device1* This,LPCWSTR lpName,DWORD dwDesiredAccess,REFIID returnedInterface,void **ppResource) {
+    return This->lpVtbl->OpenSharedResourceByName(This,lpName,dwDesiredAccess,returnedInterface,ppResource);
+}
+#endif
+#endif
+
+#endif
+
+void STDMETHODCALLTYPE ID3D11Device1_GetImmediateContext1_Proxy(
+    ID3D11Device1* This,
+    ID3D11DeviceContext1 **ppImmediateContext);
+void __RPC_STUB ID3D11Device1_GetImmediateContext1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_CreateDeferredContext1_Proxy(
+    ID3D11Device1* This,
+    UINT ContextFlags,
+    ID3D11DeviceContext1 **ppDeferredContext);
+void __RPC_STUB ID3D11Device1_CreateDeferredContext1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_CreateBlendState1_Proxy(
+    ID3D11Device1* This,
+    const D3D11_BLEND_DESC1 *pBlendStateDesc,
+    ID3D11BlendState1 **ppBlendState);
+void __RPC_STUB ID3D11Device1_CreateBlendState1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_CreateRasterizerState1_Proxy(
+    ID3D11Device1* This,
+    const D3D11_RASTERIZER_DESC1 *pRasterizerDesc,
+    ID3D11RasterizerState1 **ppRasterizerState);
+void __RPC_STUB ID3D11Device1_CreateRasterizerState1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_CreateDeviceContextState_Proxy(
+    ID3D11Device1* This,
+    UINT Flags,
+    const D3D_FEATURE_LEVEL *pFeatureLevels,
+    UINT FeatureLevels,
+    UINT SDKVersion,
+    REFIID EmulatedInterface,
+    D3D_FEATURE_LEVEL *pChosenFeatureLevel,
+    ID3DDeviceContextState **ppContextState);
+void __RPC_STUB ID3D11Device1_CreateDeviceContextState_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_OpenSharedResource1_Proxy(
+    ID3D11Device1* This,
+    HANDLE hResource,
+    REFIID returnedInterface,
+    void **ppResource);
+void __RPC_STUB ID3D11Device1_OpenSharedResource1_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ID3D11Device1_OpenSharedResourceByName_Proxy(
+    ID3D11Device1* This,
+    LPCWSTR lpName,
+    DWORD dwDesiredAccess,
+    REFIID returnedInterface,
+    void **ppResource);
+void __RPC_STUB ID3D11Device1_OpenSharedResourceByName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __ID3D11Device1_INTERFACE_DEFINED__ */
+
 /* Begin additional prototypes for all interfaces */
 
 
diff --git a/mingw-w64-headers/direct-x/include/d3d11_1.idl b/mingw-w64-headers/direct-x/include/d3d11_1.idl
index 928548f..1ebfc5a 100644
--- a/mingw-w64-headers/direct-x/include/d3d11_1.idl
+++ b/mingw-w64-headers/direct-x/include/d3d11_1.idl
@@ -22,6 +22,69 @@
 import "d3dcommon.idl";
 import "d3d11.idl";
 
+typedef enum D3D11_LOGIC_OP {
+    D3D11_LOGIC_OP_CLEAR = 0,
+    D3D11_LOGIC_OP_SET,
+    D3D11_LOGIC_OP_COPY,
+    D3D11_LOGIC_OP_COPY_INVERTED,
+    D3D11_LOGIC_OP_NOOP,
+    D3D11_LOGIC_OP_INVERT,
+    D3D11_LOGIC_OP_AND,
+    D3D11_LOGIC_OP_NAND,
+    D3D11_LOGIC_OP_OR,
+    D3D11_LOGIC_OP_NOR,
+    D3D11_LOGIC_OP_XOR,
+    D3D11_LOGIC_OP_EQUIV,
+    D3D11_LOGIC_OP_AND_REVERSE,
+    D3D11_LOGIC_OP_AND_INVERTED,
+    D3D11_LOGIC_OP_OR_REVERSE,
+    D3D11_LOGIC_OP_OR_INVERTED
+} D3D11_LOGIC_OP;
+
+typedef struct _D3D11_RENDER_TARGET_BLEND_DESC1 {
+    BOOL           BlendEnable;
+    BOOL           LogicOpEnable;
+    D3D11_BLEND    SrcBlend;
+    D3D11_BLEND    DestBlend;
+    D3D11_BLEND_OP BlendOp;
+    D3D11_BLEND    SrcBlendAlpha;
+    D3D11_BLEND    DestBlendAlpha;
+    D3D11_BLEND_OP BlendOpAlpha;
+    D3D11_LOGIC_OP LogicOp;
+    UINT8          RenderTargetWriteMask;
+} D3D11_RENDER_TARGET_BLEND_DESC1;
+
+typedef struct _D3D11_BLEND_DESC1 {
+    BOOL                            AlphaToCoverageEnable;
+    BOOL                            IndependentBlendEnable;
+    D3D11_RENDER_TARGET_BLEND_DESC1 RenderTarget[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
+} D3D11_BLEND_DESC1;
+
+typedef struct _D3D11_RASTERIZER_DESC1 {
+    D3D11_FILL_MODE FillMode;
+    D3D11_CULL_MODE CullMode;
+    BOOL            FrontCounterClockwise;
+    INT             DepthBias;
+    FLOAT           DepthBiasClamp;
+    FLOAT           SlopeScaledDepthBias;
+    BOOL            DepthClipEnable;
+    BOOL            ScissorEnable;
+    BOOL            MultisampleEnable;
+    BOOL            AntialiasedLineEnable;
+    UINT            ForcedSampleCount;
+} D3D11_RASTERIZER_DESC1;
+
+[
+    uuid(cc86fabe-da55-401d-85e7-e3c9de2877e9),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D11BlendState1 : ID3D11BlendState
+{
+    void GetDesc1(D3D11_BLEND_DESC1 *pDesc);
+}
+
 [
     uuid(5c1e0d8a-7c23-48f9-8c59-a92958ceff11),
     object,
@@ -177,3 +240,58 @@
     void SetMarker(LPCWSTR Name);
     BOOL GetStatus();
 }
+
+[
+    uuid(1217d7a6-5039-418c-b042-9cbe256afd6e),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D11RasterizerState1 : ID3D11RasterizerState
+{
+    void GetDesc1(D3D11_RASTERIZER_DESC1 *pDesc);
+}
+
+[
+    uuid(a04bfb29-08ef-43d6-a49c-a9bdbdcbe686),
+    object,
+    local,
+    pointer_default(unique)
+]
+interface ID3D11Device1 : ID3D11Device
+{
+    void GetImmediateContext1(
+            ID3D11DeviceContext1 **ppImmediateContext);
+
+    HRESULT CreateDeferredContext1(
+            UINT ContextFlags,
+            ID3D11DeviceContext1 **ppDeferredContext);
+
+    HRESULT CreateBlendState1(
+            const D3D11_BLEND_DESC1 *pBlendStateDesc,
+            ID3D11BlendState1 **ppBlendState);
+
+    HRESULT CreateRasterizerState1(
+            const D3D11_RASTERIZER_DESC1 *pRasterizerDesc,
+            ID3D11RasterizerState1 **ppRasterizerState);
+
+    HRESULT CreateDeviceContextState(
+            UINT Flags,
+            const D3D_FEATURE_LEVEL *pFeatureLevels,
+            UINT FeatureLevels,
+            UINT SDKVersion,
+            REFIID EmulatedInterface,
+            D3D_FEATURE_LEVEL *pChosenFeatureLevel,
+            ID3DDeviceContextState **ppContextState);
+
+    HRESULT OpenSharedResource1(
+            HANDLE hResource,
+            REFIID returnedInterface,
+            void **ppResource);
+
+     HRESULT OpenSharedResourceByName(
+            LPCWSTR lpName,
+            DWORD dwDesiredAccess,
+            REFIID returnedInterface,
+            void **ppResource);
+}
diff --git a/mingw-w64-headers/direct-x/include/dxgi.h b/mingw-w64-headers/direct-x/include/dxgi.h
index a8a99ed..88e76a2 100644
--- a/mingw-w64-headers/direct-x/include/dxgi.h
+++ b/mingw-w64-headers/direct-x/include/dxgi.h
@@ -141,7 +141,8 @@
 
 typedef enum DXGI_SWAP_EFFECT {
     DXGI_SWAP_EFFECT_DISCARD = 0,
-    DXGI_SWAP_EFFECT_SEQUENTIAL = 1
+    DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
+    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3
 } DXGI_SWAP_EFFECT;
 typedef enum DXGI_RESIDENCY {
     DXGI_RESIDENCY_FULLY_RESIDENT = 1,
diff --git a/mingw-w64-headers/direct-x/include/dxgi.idl b/mingw-w64-headers/direct-x/include/dxgi.idl
index bc9538e..009a6b5 100644
--- a/mingw-w64-headers/direct-x/include/dxgi.idl
+++ b/mingw-w64-headers/direct-x/include/dxgi.idl
@@ -67,6 +67,7 @@
 typedef enum DXGI_SWAP_EFFECT {
     DXGI_SWAP_EFFECT_DISCARD    = 0,
     DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
+    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3
 } DXGI_SWAP_EFFECT;
 
 typedef enum DXGI_RESIDENCY {
diff --git a/mingw-w64-headers/direct-x/include/dxgi1_2.h b/mingw-w64-headers/direct-x/include/dxgi1_2.h
index f621d30..72ac571 100644
--- a/mingw-w64-headers/direct-x/include/dxgi1_2.h
+++ b/mingw-w64-headers/direct-x/include/dxgi1_2.h
@@ -27,6 +27,11 @@
 typedef interface IDXGISwapChain1 IDXGISwapChain1;
 #endif
 
+#ifndef __IDXGIFactory2_FWD_DEFINED__
+#define __IDXGIFactory2_FWD_DEFINED__
+typedef interface IDXGIFactory2 IDXGIFactory2;
+#endif
+
 /* Headers for imported files */
 
 #include <dxgi.h>
@@ -745,6 +750,443 @@
 
 #endif  /* __IDXGISwapChain1_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IDXGIFactory2 interface
+ */
+#ifndef __IDXGIFactory2_INTERFACE_DEFINED__
+#define __IDXGIFactory2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDXGIFactory2, 0x50c83a1c, 0xe072, 0x4c48, 0x87,0xb0, 0x36,0x30,0xfa,0x36,0xa6,0xd0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("50c83a1c-e072-4c48-87b0-3630fa36a6d0")
+IDXGIFactory2 : public IDXGIFactory1
+{
+    virtual WINBOOL STDMETHODCALLTYPE IsWindowedStereoEnabled(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForHwnd(
+        IUnknown *pDevice,
+        HWND hWnd,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForCoreWindow(
+        IUnknown *pDevice,
+        IUnknown *pWindow,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSharedResourceAdapterLuid(
+        HANDLE hResource,
+        LUID *pLuid) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterOcclusionStatusWindow(
+        HWND WindowHandle,
+        UINT wMsg,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterStereoStatusEvent(
+        HANDLE hEvent,
+        DWORD *pdwCookie) = 0;
+
+    virtual void STDMETHODCALLTYPE UnregisterStereoStatus(
+        DWORD dwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterStereoStatusWindow(
+        HWND WindowHandle,
+        UINT wMsg,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterOcclusionStatusEvent(
+        HANDLE hEvent,
+        DWORD *pdwCookie) = 0;
+
+    virtual void STDMETHODCALLTYPE UnregisterOcclusionStatus(
+        DWORD dwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForComposition(
+        IUnknown *pDevice,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDXGIFactory2, 0x50c83a1c, 0xe072, 0x4c48, 0x87,0xb0, 0x36,0x30,0xfa,0x36,0xa6,0xd0)
+#endif
+#else
+typedef struct IDXGIFactory2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDXGIFactory2* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDXGIFactory2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDXGIFactory2* This);
+
+    /*** IDXGIObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
+        IDXGIFactory2* This,
+        REFGUID guid,
+        UINT data_size,
+        const void *data);
+
+    HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
+        IDXGIFactory2* This,
+        REFGUID guid,
+        const IUnknown *object);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
+        IDXGIFactory2* This,
+        REFGUID guid,
+        UINT *data_size,
+        void *data);
+
+    HRESULT (STDMETHODCALLTYPE *GetParent)(
+        IDXGIFactory2* This,
+        REFIID riid,
+        void **parent);
+
+    /*** IDXGIFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumAdapters)(
+        IDXGIFactory2* This,
+        UINT adapter_idx,
+        IDXGIAdapter **adapter);
+
+    HRESULT (STDMETHODCALLTYPE *MakeWindowAssociation)(
+        IDXGIFactory2* This,
+        HWND window,
+        UINT flags);
+
+    HRESULT (STDMETHODCALLTYPE *GetWindowAssociation)(
+        IDXGIFactory2* This,
+        HWND *window);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSwapChain)(
+        IDXGIFactory2* This,
+        IUnknown *device,
+        DXGI_SWAP_CHAIN_DESC *desc,
+        IDXGISwapChain **swapchain);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSoftwareAdapter)(
+        IDXGIFactory2* This,
+        HMODULE swrast,
+        IDXGIAdapter **adapter);
+
+    /*** IDXGIFactory1 methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumAdapters1)(
+        IDXGIFactory2* This,
+        UINT Adapter,
+        IDXGIAdapter1 **ppAdapter);
+
+    WINBOOL (STDMETHODCALLTYPE *IsCurrent)(
+        IDXGIFactory2* This);
+
+    /*** IDXGIFactory2 methods ***/
+    WINBOOL (STDMETHODCALLTYPE *IsWindowedStereoEnabled)(
+        IDXGIFactory2* This);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSwapChainForHwnd)(
+        IDXGIFactory2* This,
+        IUnknown *pDevice,
+        HWND hWnd,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSwapChainForCoreWindow)(
+        IDXGIFactory2* This,
+        IUnknown *pDevice,
+        IUnknown *pWindow,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain);
+
+    HRESULT (STDMETHODCALLTYPE *GetSharedResourceAdapterLuid)(
+        IDXGIFactory2* This,
+        HANDLE hResource,
+        LUID *pLuid);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterOcclusionStatusWindow)(
+        IDXGIFactory2* This,
+        HWND WindowHandle,
+        UINT wMsg,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterStereoStatusEvent)(
+        IDXGIFactory2* This,
+        HANDLE hEvent,
+        DWORD *pdwCookie);
+
+    void (STDMETHODCALLTYPE *UnregisterStereoStatus)(
+        IDXGIFactory2* This,
+        DWORD dwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterStereoStatusWindow)(
+        IDXGIFactory2* This,
+        HWND WindowHandle,
+        UINT wMsg,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterOcclusionStatusEvent)(
+        IDXGIFactory2* This,
+        HANDLE hEvent,
+        DWORD *pdwCookie);
+
+    void (STDMETHODCALLTYPE *UnregisterOcclusionStatus)(
+        IDXGIFactory2* This,
+        DWORD dwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSwapChainForComposition)(
+        IDXGIFactory2* This,
+        IUnknown *pDevice,
+        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+        IDXGIOutput *pRestrictToOutput,
+        IDXGISwapChain1 **ppSwapChain);
+
+    END_INTERFACE
+} IDXGIFactory2Vtbl;
+interface IDXGIFactory2 {
+    CONST_VTBL IDXGIFactory2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDXGIFactory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDXGIFactory2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDXGIFactory2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDXGIObject methods ***/
+#define IDXGIFactory2_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
+#define IDXGIFactory2_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
+#define IDXGIFactory2_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
+#define IDXGIFactory2_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
+/*** IDXGIFactory methods ***/
+#define IDXGIFactory2_EnumAdapters(This,adapter_idx,adapter) (This)->lpVtbl->EnumAdapters(This,adapter_idx,adapter)
+#define IDXGIFactory2_MakeWindowAssociation(This,window,flags) (This)->lpVtbl->MakeWindowAssociation(This,window,flags)
+#define IDXGIFactory2_GetWindowAssociation(This,window) (This)->lpVtbl->GetWindowAssociation(This,window)
+#define IDXGIFactory2_CreateSwapChain(This,device,desc,swapchain) (This)->lpVtbl->CreateSwapChain(This,device,desc,swapchain)
+#define IDXGIFactory2_CreateSoftwareAdapter(This,swrast,adapter) (This)->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter)
+/*** IDXGIFactory1 methods ***/
+#define IDXGIFactory2_EnumAdapters1(This,Adapter,ppAdapter) (This)->lpVtbl->EnumAdapters1(This,Adapter,ppAdapter)
+#define IDXGIFactory2_IsCurrent(This) (This)->lpVtbl->IsCurrent(This)
+/*** IDXGIFactory2 methods ***/
+#define IDXGIFactory2_IsWindowedStereoEnabled(This) (This)->lpVtbl->IsWindowedStereoEnabled(This)
+#define IDXGIFactory2_CreateSwapChainForHwnd(This,pDevice,hWnd,pDesc,pFullscreenDesc,pRestrictToOutput,ppSwapChain) (This)->lpVtbl->CreateSwapChainForHwnd(This,pDevice,hWnd,pDesc,pFullscreenDesc,pRestrictToOutput,ppSwapChain)
+#define IDXGIFactory2_CreateSwapChainForCoreWindow(This,pDevice,pWindow,pDesc,pRestrictToOutput,ppSwapChain) (This)->lpVtbl->CreateSwapChainForCoreWindow(This,pDevice,pWindow,pDesc,pRestrictToOutput,ppSwapChain)
+#define IDXGIFactory2_GetSharedResourceAdapterLuid(This,hResource,pLuid) (This)->lpVtbl->GetSharedResourceAdapterLuid(This,hResource,pLuid)
+#define IDXGIFactory2_RegisterOcclusionStatusWindow(This,WindowHandle,wMsg,pdwCookie) (This)->lpVtbl->RegisterOcclusionStatusWindow(This,WindowHandle,wMsg,pdwCookie)
+#define IDXGIFactory2_RegisterStereoStatusEvent(This,hEvent,pdwCookie) (This)->lpVtbl->RegisterStereoStatusEvent(This,hEvent,pdwCookie)
+#define IDXGIFactory2_UnregisterStereoStatus(This,dwCookie) (This)->lpVtbl->UnregisterStereoStatus(This,dwCookie)
+#define IDXGIFactory2_RegisterStereoStatusWindow(This,WindowHandle,wMsg,pdwCookie) (This)->lpVtbl->RegisterStereoStatusWindow(This,WindowHandle,wMsg,pdwCookie)
+#define IDXGIFactory2_RegisterOcclusionStatusEvent(This,hEvent,pdwCookie) (This)->lpVtbl->RegisterOcclusionStatusEvent(This,hEvent,pdwCookie)
+#define IDXGIFactory2_UnregisterOcclusionStatus(This,dwCookie) (This)->lpVtbl->UnregisterOcclusionStatus(This,dwCookie)
+#define IDXGIFactory2_CreateSwapChainForComposition(This,pDevice,pDesc,pRestrictToOutput,ppSwapChain) (This)->lpVtbl->CreateSwapChainForComposition(This,pDevice,pDesc,pRestrictToOutput,ppSwapChain)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDXGIFactory2_QueryInterface(IDXGIFactory2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDXGIFactory2_AddRef(IDXGIFactory2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDXGIFactory2_Release(IDXGIFactory2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDXGIObject methods ***/
+static FORCEINLINE HRESULT IDXGIFactory2_SetPrivateData(IDXGIFactory2* This,REFGUID guid,UINT data_size,const void *data) {
+    return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_SetPrivateDataInterface(IDXGIFactory2* This,REFGUID guid,const IUnknown *object) {
+    return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_GetPrivateData(IDXGIFactory2* This,REFGUID guid,UINT *data_size,void *data) {
+    return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_GetParent(IDXGIFactory2* This,REFIID riid,void **parent) {
+    return This->lpVtbl->GetParent(This,riid,parent);
+}
+/*** IDXGIFactory methods ***/
+static FORCEINLINE HRESULT IDXGIFactory2_EnumAdapters(IDXGIFactory2* This,UINT adapter_idx,IDXGIAdapter **adapter) {
+    return This->lpVtbl->EnumAdapters(This,adapter_idx,adapter);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_MakeWindowAssociation(IDXGIFactory2* This,HWND window,UINT flags) {
+    return This->lpVtbl->MakeWindowAssociation(This,window,flags);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_GetWindowAssociation(IDXGIFactory2* This,HWND *window) {
+    return This->lpVtbl->GetWindowAssociation(This,window);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_CreateSwapChain(IDXGIFactory2* This,IUnknown *device,DXGI_SWAP_CHAIN_DESC *desc,IDXGISwapChain **swapchain) {
+    return This->lpVtbl->CreateSwapChain(This,device,desc,swapchain);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_CreateSoftwareAdapter(IDXGIFactory2* This,HMODULE swrast,IDXGIAdapter **adapter) {
+    return This->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter);
+}
+/*** IDXGIFactory1 methods ***/
+static FORCEINLINE HRESULT IDXGIFactory2_EnumAdapters1(IDXGIFactory2* This,UINT Adapter,IDXGIAdapter1 **ppAdapter) {
+    return This->lpVtbl->EnumAdapters1(This,Adapter,ppAdapter);
+}
+static FORCEINLINE WINBOOL IDXGIFactory2_IsCurrent(IDXGIFactory2* This) {
+    return This->lpVtbl->IsCurrent(This);
+}
+/*** IDXGIFactory2 methods ***/
+static FORCEINLINE WINBOOL IDXGIFactory2_IsWindowedStereoEnabled(IDXGIFactory2* This) {
+    return This->lpVtbl->IsWindowedStereoEnabled(This);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_CreateSwapChainForHwnd(IDXGIFactory2* This,IUnknown *pDevice,HWND hWnd,const DXGI_SWAP_CHAIN_DESC1 *pDesc,const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,IDXGIOutput *pRestrictToOutput,IDXGISwapChain1 **ppSwapChain) {
+    return This->lpVtbl->CreateSwapChainForHwnd(This,pDevice,hWnd,pDesc,pFullscreenDesc,pRestrictToOutput,ppSwapChain);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_CreateSwapChainForCoreWindow(IDXGIFactory2* This,IUnknown *pDevice,IUnknown *pWindow,const DXGI_SWAP_CHAIN_DESC1 *pDesc,IDXGIOutput *pRestrictToOutput,IDXGISwapChain1 **ppSwapChain) {
+    return This->lpVtbl->CreateSwapChainForCoreWindow(This,pDevice,pWindow,pDesc,pRestrictToOutput,ppSwapChain);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_GetSharedResourceAdapterLuid(IDXGIFactory2* This,HANDLE hResource,LUID *pLuid) {
+    return This->lpVtbl->GetSharedResourceAdapterLuid(This,hResource,pLuid);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_RegisterOcclusionStatusWindow(IDXGIFactory2* This,HWND WindowHandle,UINT wMsg,DWORD *pdwCookie) {
+    return This->lpVtbl->RegisterOcclusionStatusWindow(This,WindowHandle,wMsg,pdwCookie);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_RegisterStereoStatusEvent(IDXGIFactory2* This,HANDLE hEvent,DWORD *pdwCookie) {
+    return This->lpVtbl->RegisterStereoStatusEvent(This,hEvent,pdwCookie);
+}
+static FORCEINLINE void IDXGIFactory2_UnregisterStereoStatus(IDXGIFactory2* This,DWORD dwCookie) {
+    This->lpVtbl->UnregisterStereoStatus(This,dwCookie);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_RegisterStereoStatusWindow(IDXGIFactory2* This,HWND WindowHandle,UINT wMsg,DWORD *pdwCookie) {
+    return This->lpVtbl->RegisterStereoStatusWindow(This,WindowHandle,wMsg,pdwCookie);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_RegisterOcclusionStatusEvent(IDXGIFactory2* This,HANDLE hEvent,DWORD *pdwCookie) {
+    return This->lpVtbl->RegisterOcclusionStatusEvent(This,hEvent,pdwCookie);
+}
+static FORCEINLINE void IDXGIFactory2_UnregisterOcclusionStatus(IDXGIFactory2* This,DWORD dwCookie) {
+    This->lpVtbl->UnregisterOcclusionStatus(This,dwCookie);
+}
+static FORCEINLINE HRESULT IDXGIFactory2_CreateSwapChainForComposition(IDXGIFactory2* This,IUnknown *pDevice,const DXGI_SWAP_CHAIN_DESC1 *pDesc,IDXGIOutput *pRestrictToOutput,IDXGISwapChain1 **ppSwapChain) {
+    return This->lpVtbl->CreateSwapChainForComposition(This,pDevice,pDesc,pRestrictToOutput,ppSwapChain);
+}
+#endif
+#endif
+
+#endif
+
+WINBOOL STDMETHODCALLTYPE IDXGIFactory2_IsWindowedStereoEnabled_Proxy(
+    IDXGIFactory2* This);
+void __RPC_STUB IDXGIFactory2_IsWindowedStereoEnabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_CreateSwapChainForHwnd_Proxy(
+    IDXGIFactory2* This,
+    IUnknown *pDevice,
+    HWND hWnd,
+    const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+    const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+    IDXGIOutput *pRestrictToOutput,
+    IDXGISwapChain1 **ppSwapChain);
+void __RPC_STUB IDXGIFactory2_CreateSwapChainForHwnd_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_CreateSwapChainForCoreWindow_Proxy(
+    IDXGIFactory2* This,
+    IUnknown *pDevice,
+    IUnknown *pWindow,
+    const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+    IDXGIOutput *pRestrictToOutput,
+    IDXGISwapChain1 **ppSwapChain);
+void __RPC_STUB IDXGIFactory2_CreateSwapChainForCoreWindow_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_GetSharedResourceAdapterLuid_Proxy(
+    IDXGIFactory2* This,
+    HANDLE hResource,
+    LUID *pLuid);
+void __RPC_STUB IDXGIFactory2_GetSharedResourceAdapterLuid_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_RegisterOcclusionStatusWindow_Proxy(
+    IDXGIFactory2* This,
+    HWND WindowHandle,
+    UINT wMsg,
+    DWORD *pdwCookie);
+void __RPC_STUB IDXGIFactory2_RegisterOcclusionStatusWindow_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_RegisterStereoStatusEvent_Proxy(
+    IDXGIFactory2* This,
+    HANDLE hEvent,
+    DWORD *pdwCookie);
+void __RPC_STUB IDXGIFactory2_RegisterStereoStatusEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+void STDMETHODCALLTYPE IDXGIFactory2_UnregisterStereoStatus_Proxy(
+    IDXGIFactory2* This,
+    DWORD dwCookie);
+void __RPC_STUB IDXGIFactory2_UnregisterStereoStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_RegisterStereoStatusWindow_Proxy(
+    IDXGIFactory2* This,
+    HWND WindowHandle,
+    UINT wMsg,
+    DWORD *pdwCookie);
+void __RPC_STUB IDXGIFactory2_RegisterStereoStatusWindow_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_RegisterOcclusionStatusEvent_Proxy(
+    IDXGIFactory2* This,
+    HANDLE hEvent,
+    DWORD *pdwCookie);
+void __RPC_STUB IDXGIFactory2_RegisterOcclusionStatusEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+void STDMETHODCALLTYPE IDXGIFactory2_UnregisterOcclusionStatus_Proxy(
+    IDXGIFactory2* This,
+    DWORD dwCookie);
+void __RPC_STUB IDXGIFactory2_UnregisterOcclusionStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDXGIFactory2_CreateSwapChainForComposition_Proxy(
+    IDXGIFactory2* This,
+    IUnknown *pDevice,
+    const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+    IDXGIOutput *pRestrictToOutput,
+    IDXGISwapChain1 **ppSwapChain);
+void __RPC_STUB IDXGIFactory2_CreateSwapChainForComposition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDXGIFactory2_INTERFACE_DEFINED__ */
+
 /* Begin additional prototypes for all interfaces */
 
 
diff --git a/mingw-w64-headers/direct-x/include/dxgi1_2.idl b/mingw-w64-headers/direct-x/include/dxgi1_2.idl
index bba4ab8..775b81c 100644
--- a/mingw-w64-headers/direct-x/include/dxgi1_2.idl
+++ b/mingw-w64-headers/direct-x/include/dxgi1_2.idl
@@ -130,3 +130,63 @@
     HRESULT GetRotation(
             [out] DXGI_MODE_ROTATION *pRotation);
 }
+
+[
+    object,
+    uuid(50c83a1c-e072-4c48-87b0-3630fa36a6d0),
+    local,
+    pointer_default(unique)
+]
+interface IDXGIFactory2 : IDXGIFactory1
+{
+    BOOL IsWindowedStereoEnabled();
+
+    HRESULT CreateSwapChainForHwnd(
+            [in]  IUnknown *pDevice,
+            [in]  HWND hWnd,
+            [in]  const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+            [in]  const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
+            [in]  IDXGIOutput *pRestrictToOutput,
+            [out] IDXGISwapChain1 **ppSwapChain);
+
+    HRESULT CreateSwapChainForCoreWindow(
+            [in]  IUnknown *pDevice,
+            [in]  IUnknown *pWindow,
+            [in]  const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+            [in]  IDXGIOutput *pRestrictToOutput,
+            [out] IDXGISwapChain1 **ppSwapChain);
+
+    HRESULT GetSharedResourceAdapterLuid(
+            [in]  HANDLE hResource,
+            [out] LUID *pLuid);
+
+    HRESULT RegisterOcclusionStatusWindow(
+            [in]  HWND WindowHandle,
+            [in]  UINT wMsg,
+            [out] DWORD *pdwCookie);
+
+    HRESULT RegisterStereoStatusEvent(
+            [in]  HANDLE hEvent,
+            [out] DWORD *pdwCookie);
+
+    void UnregisterStereoStatus(
+            [in]  DWORD dwCookie);
+
+    HRESULT RegisterStereoStatusWindow(
+            [in]  HWND WindowHandle,
+            [in]  UINT wMsg,
+            [out] DWORD *pdwCookie);
+
+    HRESULT RegisterOcclusionStatusEvent(
+            [in]  HANDLE hEvent,
+            [out] DWORD *pdwCookie);
+
+    void UnregisterOcclusionStatus(
+            [in]  DWORD dwCookie);
+
+    HRESULT CreateSwapChainForComposition(
+            [in]  IUnknown *pDevice,
+            [in]  const DXGI_SWAP_CHAIN_DESC1 *pDesc,
+            [in]  IDXGIOutput *pRestrictToOutput,
+            [out] IDXGISwapChain1 **ppSwapChain);
+}
diff --git a/mingw-w64-headers/include/wmsdkidl.h b/mingw-w64-headers/include/wmsdkidl.h
index ad3afc4..5ff3d9e 100644
--- a/mingw-w64-headers/include/wmsdkidl.h
+++ b/mingw-w64-headers/include/wmsdkidl.h
@@ -77,6 +77,36 @@
 typedef interface IWMSyncReader IWMSyncReader;
 #endif
 
+#ifndef __IWMInputMediaProps_FWD_DEFINED__
+#define __IWMInputMediaProps_FWD_DEFINED__
+typedef interface IWMInputMediaProps IWMInputMediaProps;
+#endif
+
+#ifndef __IWMWriterSink_FWD_DEFINED__
+#define __IWMWriterSink_FWD_DEFINED__
+typedef interface IWMWriterSink IWMWriterSink;
+#endif
+
+#ifndef __IWMWriter_FWD_DEFINED__
+#define __IWMWriter_FWD_DEFINED__
+typedef interface IWMWriter IWMWriter;
+#endif
+
+#ifndef __IWMWriterAdvanced_FWD_DEFINED__
+#define __IWMWriterAdvanced_FWD_DEFINED__
+typedef interface IWMWriterAdvanced IWMWriterAdvanced;
+#endif
+
+#ifndef __IWMWriterAdvanced2_FWD_DEFINED__
+#define __IWMWriterAdvanced2_FWD_DEFINED__
+typedef interface IWMWriterAdvanced2 IWMWriterAdvanced2;
+#endif
+
+#ifndef __IWMWriterAdvanced3_FWD_DEFINED__
+#define __IWMWriterAdvanced3_FWD_DEFINED__
+typedef interface IWMWriterAdvanced3 IWMWriterAdvanced3;
+#endif
+
 /* Headers for imported files */
 
 #include <oaidl.h>
@@ -98,6 +128,27 @@
     ULONG cbFormat;
     BYTE *pbFormat;
 } WM_MEDIA_TYPE;
+typedef struct _WMWriterStatistics {
+    QWORD qwSampleCount;
+    QWORD qwByteCount;
+    QWORD qwDroppedSampleCount;
+    QWORD qwDroppedByteCount;
+    DWORD dwCurrentBitrate;
+    DWORD dwAverageBitrate;
+    DWORD dwExpectedBitrate;
+    DWORD dwCurrentSampleRate;
+    DWORD dwAverageSampleRate;
+    DWORD dwExpectedSampleRate;
+} WM_WRITER_STATISTICS;
+typedef struct _WMWriterStatisticsEx {
+    DWORD dwBitratePlusOverhead;
+    DWORD dwCurrentSampleDropRateInQueue;
+    DWORD dwCurrentSampleDropRateInCodec;
+    DWORD dwCurrentSampleDropRateInMultiplexer;
+    DWORD dwTotalSampleDropsInQueue;
+    DWORD dwTotalSampleDropsInCodec;
+    DWORD dwTotalSampleDropsInMultiplexer;
+} WM_WRITER_STATISTICS_EX;
 typedef enum WMT_ATTR_DATATYPE {
     WMT_TYPE_DWORD = 0,
     WMT_TYPE_STRING = 1,
@@ -2774,6 +2825,1387 @@
 
 #endif  /* __IWMSyncReader_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IWMInputMediaProps interface
+ */
+#ifndef __IWMInputMediaProps_INTERFACE_DEFINED__
+#define __IWMInputMediaProps_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("96406bd5-2b2b-11d3-b36b-00c04f6108ff")
+IWMInputMediaProps : public IWMMediaProps
+{
+    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
+        WCHAR *pwszName,
+        WORD *pcchName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetGroupName(
+        WCHAR *pwszName,
+        WORD *pcchName) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
+#endif
+#else
+typedef struct IWMInputMediaPropsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMInputMediaProps* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMInputMediaProps* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMInputMediaProps* This);
+
+    /*** IWMMediaProps methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetType)(
+        IWMInputMediaProps* This,
+        GUID *pguidType);
+
+    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
+        IWMInputMediaProps* This,
+        WM_MEDIA_TYPE *pType,
+        DWORD *pcbType);
+
+    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
+        IWMInputMediaProps* This,
+        WM_MEDIA_TYPE *pType);
+
+    /*** IWMInputMediaProps methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
+        IWMInputMediaProps* This,
+        WCHAR *pwszName,
+        WORD *pcchName);
+
+    HRESULT (STDMETHODCALLTYPE *GetGroupName)(
+        IWMInputMediaProps* This,
+        WCHAR *pwszName,
+        WORD *pcchName);
+
+    END_INTERFACE
+} IWMInputMediaPropsVtbl;
+interface IWMInputMediaProps {
+    CONST_VTBL IWMInputMediaPropsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMInputMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMInputMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMInputMediaProps_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMMediaProps methods ***/
+#define IWMInputMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
+#define IWMInputMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
+#define IWMInputMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
+/*** IWMInputMediaProps methods ***/
+#define IWMInputMediaProps_GetConnectionName(This,pwszName,pcchName) (This)->lpVtbl->GetConnectionName(This,pwszName,pcchName)
+#define IWMInputMediaProps_GetGroupName(This,pwszName,pcchName) (This)->lpVtbl->GetGroupName(This,pwszName,pcchName)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMInputMediaProps_QueryInterface(IWMInputMediaProps* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMInputMediaProps_AddRef(IWMInputMediaProps* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMInputMediaProps_Release(IWMInputMediaProps* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMMediaProps methods ***/
+static FORCEINLINE HRESULT IWMInputMediaProps_GetType(IWMInputMediaProps* This,GUID *pguidType) {
+    return This->lpVtbl->GetType(This,pguidType);
+}
+static FORCEINLINE HRESULT IWMInputMediaProps_GetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
+    return This->lpVtbl->GetMediaType(This,pType,pcbType);
+}
+static FORCEINLINE HRESULT IWMInputMediaProps_SetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType) {
+    return This->lpVtbl->SetMediaType(This,pType);
+}
+/*** IWMInputMediaProps methods ***/
+static FORCEINLINE HRESULT IWMInputMediaProps_GetConnectionName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
+    return This->lpVtbl->GetConnectionName(This,pwszName,pcchName);
+}
+static FORCEINLINE HRESULT IWMInputMediaProps_GetGroupName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
+    return This->lpVtbl->GetGroupName(This,pwszName,pcchName);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMInputMediaProps_GetConnectionName_Proxy(
+    IWMInputMediaProps* This,
+    WCHAR *pwszName,
+    WORD *pcchName);
+void __RPC_STUB IWMInputMediaProps_GetConnectionName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMInputMediaProps_GetGroupName_Proxy(
+    IWMInputMediaProps* This,
+    WCHAR *pwszName,
+    WORD *pcchName);
+void __RPC_STUB IWMInputMediaProps_GetGroupName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMInputMediaProps_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWMWriterSink interface
+ */
+#ifndef __IWMWriterSink_INTERFACE_DEFINED__
+#define __IWMWriterSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("96406be4-2b2b-11d3-b36b-00c04f6108ff")
+IWMWriterSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnHeader(
+        INSSBuffer *pHeader) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
+        WINBOOL *pfRealTime) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AllocateDataUnit(
+        DWORD cbDataUnit,
+        INSSBuffer **ppDataUnit) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnDataUnit(
+        INSSBuffer *pDataUnit) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnEndWriting(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
+#endif
+#else
+typedef struct IWMWriterSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMWriterSink* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMWriterSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMWriterSink* This);
+
+    /*** IWMWriterSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnHeader)(
+        IWMWriterSink* This,
+        INSSBuffer *pHeader);
+
+    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
+        IWMWriterSink* This,
+        WINBOOL *pfRealTime);
+
+    HRESULT (STDMETHODCALLTYPE *AllocateDataUnit)(
+        IWMWriterSink* This,
+        DWORD cbDataUnit,
+        INSSBuffer **ppDataUnit);
+
+    HRESULT (STDMETHODCALLTYPE *OnDataUnit)(
+        IWMWriterSink* This,
+        INSSBuffer *pDataUnit);
+
+    HRESULT (STDMETHODCALLTYPE *OnEndWriting)(
+        IWMWriterSink* This);
+
+    END_INTERFACE
+} IWMWriterSinkVtbl;
+interface IWMWriterSink {
+    CONST_VTBL IWMWriterSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMWriterSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMWriterSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMWriterSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMWriterSink methods ***/
+#define IWMWriterSink_OnHeader(This,pHeader) (This)->lpVtbl->OnHeader(This,pHeader)
+#define IWMWriterSink_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
+#define IWMWriterSink_AllocateDataUnit(This,cbDataUnit,ppDataUnit) (This)->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit)
+#define IWMWriterSink_OnDataUnit(This,pDataUnit) (This)->lpVtbl->OnDataUnit(This,pDataUnit)
+#define IWMWriterSink_OnEndWriting(This) (This)->lpVtbl->OnEndWriting(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMWriterSink_QueryInterface(IWMWriterSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMWriterSink_AddRef(IWMWriterSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMWriterSink_Release(IWMWriterSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMWriterSink methods ***/
+static FORCEINLINE HRESULT IWMWriterSink_OnHeader(IWMWriterSink* This,INSSBuffer *pHeader) {
+    return This->lpVtbl->OnHeader(This,pHeader);
+}
+static FORCEINLINE HRESULT IWMWriterSink_IsRealTime(IWMWriterSink* This,WINBOOL *pfRealTime) {
+    return This->lpVtbl->IsRealTime(This,pfRealTime);
+}
+static FORCEINLINE HRESULT IWMWriterSink_AllocateDataUnit(IWMWriterSink* This,DWORD cbDataUnit,INSSBuffer **ppDataUnit) {
+    return This->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit);
+}
+static FORCEINLINE HRESULT IWMWriterSink_OnDataUnit(IWMWriterSink* This,INSSBuffer *pDataUnit) {
+    return This->lpVtbl->OnDataUnit(This,pDataUnit);
+}
+static FORCEINLINE HRESULT IWMWriterSink_OnEndWriting(IWMWriterSink* This) {
+    return This->lpVtbl->OnEndWriting(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMWriterSink_OnHeader_Proxy(
+    IWMWriterSink* This,
+    INSSBuffer *pHeader);
+void __RPC_STUB IWMWriterSink_OnHeader_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterSink_IsRealTime_Proxy(
+    IWMWriterSink* This,
+    WINBOOL *pfRealTime);
+void __RPC_STUB IWMWriterSink_IsRealTime_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterSink_AllocateDataUnit_Proxy(
+    IWMWriterSink* This,
+    DWORD cbDataUnit,
+    INSSBuffer **ppDataUnit);
+void __RPC_STUB IWMWriterSink_AllocateDataUnit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterSink_OnDataUnit_Proxy(
+    IWMWriterSink* This,
+    INSSBuffer *pDataUnit);
+void __RPC_STUB IWMWriterSink_OnDataUnit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterSink_OnEndWriting_Proxy(
+    IWMWriterSink* This);
+void __RPC_STUB IWMWriterSink_OnEndWriting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMWriterSink_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWMWriter interface
+ */
+#ifndef __IWMWriter_INTERFACE_DEFINED__
+#define __IWMWriter_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("96406bd4-2b2b-11d3-b36b-00c04f6108ff")
+IWMWriter : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetProfileByID(
+        REFGUID guidProfile) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetProfile(
+        IWMProfile *pProfile) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOutputFilename(
+        const WCHAR *pwszFilename) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInputCount(
+        DWORD *pcInputs) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInputProps(
+        DWORD dwInputNum,
+        IWMInputMediaProps **ppInput) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetInputProps(
+        DWORD dwInputNum,
+        IWMInputMediaProps *pInput) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInputFormatCount(
+        DWORD dwInputNumber,
+        DWORD *pcFormats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInputFormat(
+        DWORD dwInputNumber,
+        DWORD dwFormatNumber,
+        IWMInputMediaProps **pProps) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginWriting(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndWriting(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AllocateSample(
+        DWORD dwSampleSize,
+        INSSBuffer **ppSample) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WriteSample(
+        DWORD dwInputNum,
+        QWORD cnsSampleTime,
+        DWORD dwFlags,
+        INSSBuffer *pSample) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Flush(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
+#endif
+#else
+typedef struct IWMWriterVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMWriter* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMWriter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMWriter* This);
+
+    /*** IWMWriter methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetProfileByID)(
+        IWMWriter* This,
+        REFGUID guidProfile);
+
+    HRESULT (STDMETHODCALLTYPE *SetProfile)(
+        IWMWriter* This,
+        IWMProfile *pProfile);
+
+    HRESULT (STDMETHODCALLTYPE *SetOutputFilename)(
+        IWMWriter* This,
+        const WCHAR *pwszFilename);
+
+    HRESULT (STDMETHODCALLTYPE *GetInputCount)(
+        IWMWriter* This,
+        DWORD *pcInputs);
+
+    HRESULT (STDMETHODCALLTYPE *GetInputProps)(
+        IWMWriter* This,
+        DWORD dwInputNum,
+        IWMInputMediaProps **ppInput);
+
+    HRESULT (STDMETHODCALLTYPE *SetInputProps)(
+        IWMWriter* This,
+        DWORD dwInputNum,
+        IWMInputMediaProps *pInput);
+
+    HRESULT (STDMETHODCALLTYPE *GetInputFormatCount)(
+        IWMWriter* This,
+        DWORD dwInputNumber,
+        DWORD *pcFormats);
+
+    HRESULT (STDMETHODCALLTYPE *GetInputFormat)(
+        IWMWriter* This,
+        DWORD dwInputNumber,
+        DWORD dwFormatNumber,
+        IWMInputMediaProps **pProps);
+
+    HRESULT (STDMETHODCALLTYPE *BeginWriting)(
+        IWMWriter* This);
+
+    HRESULT (STDMETHODCALLTYPE *EndWriting)(
+        IWMWriter* This);
+
+    HRESULT (STDMETHODCALLTYPE *AllocateSample)(
+        IWMWriter* This,
+        DWORD dwSampleSize,
+        INSSBuffer **ppSample);
+
+    HRESULT (STDMETHODCALLTYPE *WriteSample)(
+        IWMWriter* This,
+        DWORD dwInputNum,
+        QWORD cnsSampleTime,
+        DWORD dwFlags,
+        INSSBuffer *pSample);
+
+    HRESULT (STDMETHODCALLTYPE *Flush)(
+        IWMWriter* This);
+
+    END_INTERFACE
+} IWMWriterVtbl;
+interface IWMWriter {
+    CONST_VTBL IWMWriterVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMWriter_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMWriter methods ***/
+#define IWMWriter_SetProfileByID(This,guidProfile) (This)->lpVtbl->SetProfileByID(This,guidProfile)
+#define IWMWriter_SetProfile(This,pProfile) (This)->lpVtbl->SetProfile(This,pProfile)
+#define IWMWriter_SetOutputFilename(This,pwszFilename) (This)->lpVtbl->SetOutputFilename(This,pwszFilename)
+#define IWMWriter_GetInputCount(This,pcInputs) (This)->lpVtbl->GetInputCount(This,pcInputs)
+#define IWMWriter_GetInputProps(This,dwInputNum,ppInput) (This)->lpVtbl->GetInputProps(This,dwInputNum,ppInput)
+#define IWMWriter_SetInputProps(This,dwInputNum,pInput) (This)->lpVtbl->SetInputProps(This,dwInputNum,pInput)
+#define IWMWriter_GetInputFormatCount(This,dwInputNumber,pcFormats) (This)->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats)
+#define IWMWriter_GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps) (This)->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps)
+#define IWMWriter_BeginWriting(This) (This)->lpVtbl->BeginWriting(This)
+#define IWMWriter_EndWriting(This) (This)->lpVtbl->EndWriting(This)
+#define IWMWriter_AllocateSample(This,dwSampleSize,ppSample) (This)->lpVtbl->AllocateSample(This,dwSampleSize,ppSample)
+#define IWMWriter_WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample) (This)->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample)
+#define IWMWriter_Flush(This) (This)->lpVtbl->Flush(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMWriter_QueryInterface(IWMWriter* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMWriter_AddRef(IWMWriter* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMWriter_Release(IWMWriter* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMWriter methods ***/
+static FORCEINLINE HRESULT IWMWriter_SetProfileByID(IWMWriter* This,REFGUID guidProfile) {
+    return This->lpVtbl->SetProfileByID(This,guidProfile);
+}
+static FORCEINLINE HRESULT IWMWriter_SetProfile(IWMWriter* This,IWMProfile *pProfile) {
+    return This->lpVtbl->SetProfile(This,pProfile);
+}
+static FORCEINLINE HRESULT IWMWriter_SetOutputFilename(IWMWriter* This,const WCHAR *pwszFilename) {
+    return This->lpVtbl->SetOutputFilename(This,pwszFilename);
+}
+static FORCEINLINE HRESULT IWMWriter_GetInputCount(IWMWriter* This,DWORD *pcInputs) {
+    return This->lpVtbl->GetInputCount(This,pcInputs);
+}
+static FORCEINLINE HRESULT IWMWriter_GetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps **ppInput) {
+    return This->lpVtbl->GetInputProps(This,dwInputNum,ppInput);
+}
+static FORCEINLINE HRESULT IWMWriter_SetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps *pInput) {
+    return This->lpVtbl->SetInputProps(This,dwInputNum,pInput);
+}
+static FORCEINLINE HRESULT IWMWriter_GetInputFormatCount(IWMWriter* This,DWORD dwInputNumber,DWORD *pcFormats) {
+    return This->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats);
+}
+static FORCEINLINE HRESULT IWMWriter_GetInputFormat(IWMWriter* This,DWORD dwInputNumber,DWORD dwFormatNumber,IWMInputMediaProps **pProps) {
+    return This->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps);
+}
+static FORCEINLINE HRESULT IWMWriter_BeginWriting(IWMWriter* This) {
+    return This->lpVtbl->BeginWriting(This);
+}
+static FORCEINLINE HRESULT IWMWriter_EndWriting(IWMWriter* This) {
+    return This->lpVtbl->EndWriting(This);
+}
+static FORCEINLINE HRESULT IWMWriter_AllocateSample(IWMWriter* This,DWORD dwSampleSize,INSSBuffer **ppSample) {
+    return This->lpVtbl->AllocateSample(This,dwSampleSize,ppSample);
+}
+static FORCEINLINE HRESULT IWMWriter_WriteSample(IWMWriter* This,DWORD dwInputNum,QWORD cnsSampleTime,DWORD dwFlags,INSSBuffer *pSample) {
+    return This->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample);
+}
+static FORCEINLINE HRESULT IWMWriter_Flush(IWMWriter* This) {
+    return This->lpVtbl->Flush(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMWriter_SetProfileByID_Proxy(
+    IWMWriter* This,
+    REFGUID guidProfile);
+void __RPC_STUB IWMWriter_SetProfileByID_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_SetProfile_Proxy(
+    IWMWriter* This,
+    IWMProfile *pProfile);
+void __RPC_STUB IWMWriter_SetProfile_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_SetOutputFilename_Proxy(
+    IWMWriter* This,
+    const WCHAR *pwszFilename);
+void __RPC_STUB IWMWriter_SetOutputFilename_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_GetInputCount_Proxy(
+    IWMWriter* This,
+    DWORD *pcInputs);
+void __RPC_STUB IWMWriter_GetInputCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_GetInputProps_Proxy(
+    IWMWriter* This,
+    DWORD dwInputNum,
+    IWMInputMediaProps **ppInput);
+void __RPC_STUB IWMWriter_GetInputProps_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_SetInputProps_Proxy(
+    IWMWriter* This,
+    DWORD dwInputNum,
+    IWMInputMediaProps *pInput);
+void __RPC_STUB IWMWriter_SetInputProps_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_GetInputFormatCount_Proxy(
+    IWMWriter* This,
+    DWORD dwInputNumber,
+    DWORD *pcFormats);
+void __RPC_STUB IWMWriter_GetInputFormatCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_GetInputFormat_Proxy(
+    IWMWriter* This,
+    DWORD dwInputNumber,
+    DWORD dwFormatNumber,
+    IWMInputMediaProps **pProps);
+void __RPC_STUB IWMWriter_GetInputFormat_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_BeginWriting_Proxy(
+    IWMWriter* This);
+void __RPC_STUB IWMWriter_BeginWriting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_EndWriting_Proxy(
+    IWMWriter* This);
+void __RPC_STUB IWMWriter_EndWriting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_AllocateSample_Proxy(
+    IWMWriter* This,
+    DWORD dwSampleSize,
+    INSSBuffer **ppSample);
+void __RPC_STUB IWMWriter_AllocateSample_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_WriteSample_Proxy(
+    IWMWriter* This,
+    DWORD dwInputNum,
+    QWORD cnsSampleTime,
+    DWORD dwFlags,
+    INSSBuffer *pSample);
+void __RPC_STUB IWMWriter_WriteSample_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriter_Flush_Proxy(
+    IWMWriter* This);
+void __RPC_STUB IWMWriter_Flush_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMWriter_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWMWriterAdvanced interface
+ */
+#ifndef __IWMWriterAdvanced_INTERFACE_DEFINED__
+#define __IWMWriterAdvanced_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("96406be3-2b2b-11d3-b36b-00c04f6108ff")
+IWMWriterAdvanced : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSinkCount(
+        DWORD *pcSinks) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSink(
+        DWORD dwSinkNum,
+        IWMWriterSink **ppSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddSink(
+        IWMWriterSink *pSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveSink(
+        IWMWriterSink *pSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WriteStreamSample(
+        WORD wStreamNum,
+        QWORD cnsSampleTime,
+        DWORD msSampleSendTime,
+        QWORD cnsSampleDuration,
+        DWORD dwFlags,
+        INSSBuffer *pSample) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLiveSource(
+        WINBOOL fIsLiveSource) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
+        WINBOOL *pfRealTime) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetWriterTime(
+        QWORD *pCurrentTime) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS *pStats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSyncTolerance(
+        DWORD msWindow) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSyncTolerance(
+        DWORD *pmsWindow) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
+#endif
+#else
+typedef struct IWMWriterAdvancedVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMWriterAdvanced* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMWriterAdvanced* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMWriterAdvanced* This);
+
+    /*** IWMWriterAdvanced methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
+        IWMWriterAdvanced* This,
+        DWORD *pcSinks);
+
+    HRESULT (STDMETHODCALLTYPE *GetSink)(
+        IWMWriterAdvanced* This,
+        DWORD dwSinkNum,
+        IWMWriterSink **ppSink);
+
+    HRESULT (STDMETHODCALLTYPE *AddSink)(
+        IWMWriterAdvanced* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
+        IWMWriterAdvanced* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
+        IWMWriterAdvanced* This,
+        WORD wStreamNum,
+        QWORD cnsSampleTime,
+        DWORD msSampleSendTime,
+        QWORD cnsSampleDuration,
+        DWORD dwFlags,
+        INSSBuffer *pSample);
+
+    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
+        IWMWriterAdvanced* This,
+        WINBOOL fIsLiveSource);
+
+    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
+        IWMWriterAdvanced* This,
+        WINBOOL *pfRealTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
+        IWMWriterAdvanced* This,
+        QWORD *pCurrentTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
+        IWMWriterAdvanced* This,
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS *pStats);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
+        IWMWriterAdvanced* This,
+        DWORD msWindow);
+
+    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
+        IWMWriterAdvanced* This,
+        DWORD *pmsWindow);
+
+    END_INTERFACE
+} IWMWriterAdvancedVtbl;
+interface IWMWriterAdvanced {
+    CONST_VTBL IWMWriterAdvancedVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMWriterAdvanced_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMWriterAdvanced_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMWriterAdvanced_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMWriterAdvanced methods ***/
+#define IWMWriterAdvanced_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
+#define IWMWriterAdvanced_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
+#define IWMWriterAdvanced_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
+#define IWMWriterAdvanced_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
+#define IWMWriterAdvanced_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
+#define IWMWriterAdvanced_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
+#define IWMWriterAdvanced_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
+#define IWMWriterAdvanced_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
+#define IWMWriterAdvanced_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
+#define IWMWriterAdvanced_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
+#define IWMWriterAdvanced_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced_QueryInterface(IWMWriterAdvanced* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced_AddRef(IWMWriterAdvanced* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced_Release(IWMWriterAdvanced* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMWriterAdvanced methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced_GetSinkCount(IWMWriterAdvanced* This,DWORD *pcSinks) {
+    return This->lpVtbl->GetSinkCount(This,pcSinks);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_GetSink(IWMWriterAdvanced* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
+    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_AddSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->AddSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_RemoveSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->RemoveSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_WriteStreamSample(IWMWriterAdvanced* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
+    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_SetLiveSource(IWMWriterAdvanced* This,WINBOOL fIsLiveSource) {
+    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_IsRealTime(IWMWriterAdvanced* This,WINBOOL *pfRealTime) {
+    return This->lpVtbl->IsRealTime(This,pfRealTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_GetWriterTime(IWMWriterAdvanced* This,QWORD *pCurrentTime) {
+    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_GetStatistics(IWMWriterAdvanced* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
+    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_SetSyncTolerance(IWMWriterAdvanced* This,DWORD msWindow) {
+    return This->lpVtbl->SetSyncTolerance(This,msWindow);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced_GetSyncTolerance(IWMWriterAdvanced* This,DWORD *pmsWindow) {
+    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSinkCount_Proxy(
+    IWMWriterAdvanced* This,
+    DWORD *pcSinks);
+void __RPC_STUB IWMWriterAdvanced_GetSinkCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSink_Proxy(
+    IWMWriterAdvanced* This,
+    DWORD dwSinkNum,
+    IWMWriterSink **ppSink);
+void __RPC_STUB IWMWriterAdvanced_GetSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_AddSink_Proxy(
+    IWMWriterAdvanced* This,
+    IWMWriterSink *pSink);
+void __RPC_STUB IWMWriterAdvanced_AddSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_RemoveSink_Proxy(
+    IWMWriterAdvanced* This,
+    IWMWriterSink *pSink);
+void __RPC_STUB IWMWriterAdvanced_RemoveSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_WriteStreamSample_Proxy(
+    IWMWriterAdvanced* This,
+    WORD wStreamNum,
+    QWORD cnsSampleTime,
+    DWORD msSampleSendTime,
+    QWORD cnsSampleDuration,
+    DWORD dwFlags,
+    INSSBuffer *pSample);
+void __RPC_STUB IWMWriterAdvanced_WriteStreamSample_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_SetLiveSource_Proxy(
+    IWMWriterAdvanced* This,
+    WINBOOL fIsLiveSource);
+void __RPC_STUB IWMWriterAdvanced_SetLiveSource_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_IsRealTime_Proxy(
+    IWMWriterAdvanced* This,
+    WINBOOL *pfRealTime);
+void __RPC_STUB IWMWriterAdvanced_IsRealTime_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetWriterTime_Proxy(
+    IWMWriterAdvanced* This,
+    QWORD *pCurrentTime);
+void __RPC_STUB IWMWriterAdvanced_GetWriterTime_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetStatistics_Proxy(
+    IWMWriterAdvanced* This,
+    WORD wStreamNum,
+    WM_WRITER_STATISTICS *pStats);
+void __RPC_STUB IWMWriterAdvanced_GetStatistics_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_SetSyncTolerance_Proxy(
+    IWMWriterAdvanced* This,
+    DWORD msWindow);
+void __RPC_STUB IWMWriterAdvanced_SetSyncTolerance_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSyncTolerance_Proxy(
+    IWMWriterAdvanced* This,
+    DWORD *pmsWindow);
+void __RPC_STUB IWMWriterAdvanced_GetSyncTolerance_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMWriterAdvanced_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWMWriterAdvanced2 interface
+ */
+#ifndef __IWMWriterAdvanced2_INTERFACE_DEFINED__
+#define __IWMWriterAdvanced2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("962dc1ec-c046-4db8-9cc7-26ceae500817")
+IWMWriterAdvanced2 : public IWMWriterAdvanced
+{
+    virtual HRESULT STDMETHODCALLTYPE GetInputSetting(
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE *pType,
+        BYTE *pValue,
+        WORD *pcbLength) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetInputSetting(
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE Type,
+        const BYTE *pValue,
+        WORD cbLength) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17)
+#endif
+#else
+typedef struct IWMWriterAdvanced2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMWriterAdvanced2* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMWriterAdvanced2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMWriterAdvanced2* This);
+
+    /*** IWMWriterAdvanced methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
+        IWMWriterAdvanced2* This,
+        DWORD *pcSinks);
+
+    HRESULT (STDMETHODCALLTYPE *GetSink)(
+        IWMWriterAdvanced2* This,
+        DWORD dwSinkNum,
+        IWMWriterSink **ppSink);
+
+    HRESULT (STDMETHODCALLTYPE *AddSink)(
+        IWMWriterAdvanced2* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
+        IWMWriterAdvanced2* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
+        IWMWriterAdvanced2* This,
+        WORD wStreamNum,
+        QWORD cnsSampleTime,
+        DWORD msSampleSendTime,
+        QWORD cnsSampleDuration,
+        DWORD dwFlags,
+        INSSBuffer *pSample);
+
+    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
+        IWMWriterAdvanced2* This,
+        WINBOOL fIsLiveSource);
+
+    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
+        IWMWriterAdvanced2* This,
+        WINBOOL *pfRealTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
+        IWMWriterAdvanced2* This,
+        QWORD *pCurrentTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
+        IWMWriterAdvanced2* This,
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS *pStats);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
+        IWMWriterAdvanced2* This,
+        DWORD msWindow);
+
+    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
+        IWMWriterAdvanced2* This,
+        DWORD *pmsWindow);
+
+    /*** IWMWriterAdvanced2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
+        IWMWriterAdvanced2* This,
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE *pType,
+        BYTE *pValue,
+        WORD *pcbLength);
+
+    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
+        IWMWriterAdvanced2* This,
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE Type,
+        const BYTE *pValue,
+        WORD cbLength);
+
+    END_INTERFACE
+} IWMWriterAdvanced2Vtbl;
+interface IWMWriterAdvanced2 {
+    CONST_VTBL IWMWriterAdvanced2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMWriterAdvanced2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMWriterAdvanced2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMWriterAdvanced2_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMWriterAdvanced methods ***/
+#define IWMWriterAdvanced2_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
+#define IWMWriterAdvanced2_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
+#define IWMWriterAdvanced2_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
+#define IWMWriterAdvanced2_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
+#define IWMWriterAdvanced2_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
+#define IWMWriterAdvanced2_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
+#define IWMWriterAdvanced2_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
+#define IWMWriterAdvanced2_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
+#define IWMWriterAdvanced2_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
+#define IWMWriterAdvanced2_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
+#define IWMWriterAdvanced2_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
+/*** IWMWriterAdvanced2 methods ***/
+#define IWMWriterAdvanced2_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
+#define IWMWriterAdvanced2_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced2_QueryInterface(IWMWriterAdvanced2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced2_AddRef(IWMWriterAdvanced2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced2_Release(IWMWriterAdvanced2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMWriterAdvanced methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSinkCount(IWMWriterAdvanced2* This,DWORD *pcSinks) {
+    return This->lpVtbl->GetSinkCount(This,pcSinks);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSink(IWMWriterAdvanced2* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
+    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_AddSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->AddSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_RemoveSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->RemoveSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_WriteStreamSample(IWMWriterAdvanced2* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
+    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_SetLiveSource(IWMWriterAdvanced2* This,WINBOOL fIsLiveSource) {
+    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_IsRealTime(IWMWriterAdvanced2* This,WINBOOL *pfRealTime) {
+    return This->lpVtbl->IsRealTime(This,pfRealTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetWriterTime(IWMWriterAdvanced2* This,QWORD *pCurrentTime) {
+    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetStatistics(IWMWriterAdvanced2* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
+    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_SetSyncTolerance(IWMWriterAdvanced2* This,DWORD msWindow) {
+    return This->lpVtbl->SetSyncTolerance(This,msWindow);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSyncTolerance(IWMWriterAdvanced2* This,DWORD *pmsWindow) {
+    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
+}
+/*** IWMWriterAdvanced2 methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced2_GetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
+    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced2_SetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
+    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced2_GetInputSetting_Proxy(
+    IWMWriterAdvanced2* This,
+    DWORD dwInputNum,
+    LPCWSTR pszName,
+    WMT_ATTR_DATATYPE *pType,
+    BYTE *pValue,
+    WORD *pcbLength);
+void __RPC_STUB IWMWriterAdvanced2_GetInputSetting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced2_SetInputSetting_Proxy(
+    IWMWriterAdvanced2* This,
+    DWORD dwInputNum,
+    LPCWSTR pszName,
+    WMT_ATTR_DATATYPE Type,
+    const BYTE *pValue,
+    WORD cbLength);
+void __RPC_STUB IWMWriterAdvanced2_SetInputSetting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMWriterAdvanced2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWMWriterAdvanced3 interface
+ */
+#ifndef __IWMWriterAdvanced3_INTERFACE_DEFINED__
+#define __IWMWriterAdvanced3_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2cd6492d-7c37-4e76-9d3b-59261183a22e")
+IWMWriterAdvanced3 : public IWMWriterAdvanced2
+{
+    virtual HRESULT STDMETHODCALLTYPE GetStatisticsEx(
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS_EX *pStats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetNonBlocking(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e)
+#endif
+#else
+typedef struct IWMWriterAdvanced3Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWMWriterAdvanced3* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWMWriterAdvanced3* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWMWriterAdvanced3* This);
+
+    /*** IWMWriterAdvanced methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
+        IWMWriterAdvanced3* This,
+        DWORD *pcSinks);
+
+    HRESULT (STDMETHODCALLTYPE *GetSink)(
+        IWMWriterAdvanced3* This,
+        DWORD dwSinkNum,
+        IWMWriterSink **ppSink);
+
+    HRESULT (STDMETHODCALLTYPE *AddSink)(
+        IWMWriterAdvanced3* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
+        IWMWriterAdvanced3* This,
+        IWMWriterSink *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
+        IWMWriterAdvanced3* This,
+        WORD wStreamNum,
+        QWORD cnsSampleTime,
+        DWORD msSampleSendTime,
+        QWORD cnsSampleDuration,
+        DWORD dwFlags,
+        INSSBuffer *pSample);
+
+    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
+        IWMWriterAdvanced3* This,
+        WINBOOL fIsLiveSource);
+
+    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
+        IWMWriterAdvanced3* This,
+        WINBOOL *pfRealTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
+        IWMWriterAdvanced3* This,
+        QWORD *pCurrentTime);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
+        IWMWriterAdvanced3* This,
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS *pStats);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
+        IWMWriterAdvanced3* This,
+        DWORD msWindow);
+
+    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
+        IWMWriterAdvanced3* This,
+        DWORD *pmsWindow);
+
+    /*** IWMWriterAdvanced2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
+        IWMWriterAdvanced3* This,
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE *pType,
+        BYTE *pValue,
+        WORD *pcbLength);
+
+    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
+        IWMWriterAdvanced3* This,
+        DWORD dwInputNum,
+        LPCWSTR pszName,
+        WMT_ATTR_DATATYPE Type,
+        const BYTE *pValue,
+        WORD cbLength);
+
+    /*** IWMWriterAdvanced3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetStatisticsEx)(
+        IWMWriterAdvanced3* This,
+        WORD wStreamNum,
+        WM_WRITER_STATISTICS_EX *pStats);
+
+    HRESULT (STDMETHODCALLTYPE *SetNonBlocking)(
+        IWMWriterAdvanced3* This);
+
+    END_INTERFACE
+} IWMWriterAdvanced3Vtbl;
+interface IWMWriterAdvanced3 {
+    CONST_VTBL IWMWriterAdvanced3Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWMWriterAdvanced3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWMWriterAdvanced3_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWMWriterAdvanced3_Release(This) (This)->lpVtbl->Release(This)
+/*** IWMWriterAdvanced methods ***/
+#define IWMWriterAdvanced3_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
+#define IWMWriterAdvanced3_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
+#define IWMWriterAdvanced3_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
+#define IWMWriterAdvanced3_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
+#define IWMWriterAdvanced3_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
+#define IWMWriterAdvanced3_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
+#define IWMWriterAdvanced3_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
+#define IWMWriterAdvanced3_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
+#define IWMWriterAdvanced3_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
+#define IWMWriterAdvanced3_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
+#define IWMWriterAdvanced3_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
+/*** IWMWriterAdvanced2 methods ***/
+#define IWMWriterAdvanced3_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
+#define IWMWriterAdvanced3_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
+/*** IWMWriterAdvanced3 methods ***/
+#define IWMWriterAdvanced3_GetStatisticsEx(This,wStreamNum,pStats) (This)->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats)
+#define IWMWriterAdvanced3_SetNonBlocking(This) (This)->lpVtbl->SetNonBlocking(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced3_QueryInterface(IWMWriterAdvanced3* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced3_AddRef(IWMWriterAdvanced3* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWMWriterAdvanced3_Release(IWMWriterAdvanced3* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWMWriterAdvanced methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSinkCount(IWMWriterAdvanced3* This,DWORD *pcSinks) {
+    return This->lpVtbl->GetSinkCount(This,pcSinks);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSink(IWMWriterAdvanced3* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
+    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_AddSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->AddSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_RemoveSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
+    return This->lpVtbl->RemoveSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_WriteStreamSample(IWMWriterAdvanced3* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
+    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_SetLiveSource(IWMWriterAdvanced3* This,WINBOOL fIsLiveSource) {
+    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_IsRealTime(IWMWriterAdvanced3* This,WINBOOL *pfRealTime) {
+    return This->lpVtbl->IsRealTime(This,pfRealTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetWriterTime(IWMWriterAdvanced3* This,QWORD *pCurrentTime) {
+    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatistics(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
+    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_SetSyncTolerance(IWMWriterAdvanced3* This,DWORD msWindow) {
+    return This->lpVtbl->SetSyncTolerance(This,msWindow);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSyncTolerance(IWMWriterAdvanced3* This,DWORD *pmsWindow) {
+    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
+}
+/*** IWMWriterAdvanced2 methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
+    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_SetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
+    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
+}
+/*** IWMWriterAdvanced3 methods ***/
+static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatisticsEx(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS_EX *pStats) {
+    return This->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats);
+}
+static FORCEINLINE HRESULT IWMWriterAdvanced3_SetNonBlocking(IWMWriterAdvanced3* This) {
+    return This->lpVtbl->SetNonBlocking(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced3_GetStatisticsEx_Proxy(
+    IWMWriterAdvanced3* This,
+    WORD wStreamNum,
+    WM_WRITER_STATISTICS_EX *pStats);
+void __RPC_STUB IWMWriterAdvanced3_GetStatisticsEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWMWriterAdvanced3_SetNonBlocking_Proxy(
+    IWMWriterAdvanced3* This);
+void __RPC_STUB IWMWriterAdvanced3_SetNonBlocking_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWMWriterAdvanced3_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI WMCreateWriter(IUnknown*,IWMWriter**);
 EXTERN_GUID(WMMEDIASUBTYPE_Base,   0x00000000,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
 EXTERN_GUID(WMMEDIATYPE_Video,     0x73646976,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
 EXTERN_GUID(WMMEDIASUBTYPE_RGB1,   0xe436eb78,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
diff --git a/mingw-w64-headers/include/wmsdkidl.idl b/mingw-w64-headers/include/wmsdkidl.idl
index 984e283..1618f86 100644
--- a/mingw-w64-headers/include/wmsdkidl.idl
+++ b/mingw-w64-headers/include/wmsdkidl.idl
@@ -35,6 +35,31 @@
     [size_is(cbFormat)] BYTE *pbFormat;
 } WM_MEDIA_TYPE;
 
+typedef struct _WMWriterStatistics
+{
+    QWORD qwSampleCount;
+    QWORD qwByteCount;
+    QWORD qwDroppedSampleCount;
+    QWORD qwDroppedByteCount;
+    DWORD dwCurrentBitrate;
+    DWORD dwAverageBitrate;
+    DWORD dwExpectedBitrate;
+    DWORD dwCurrentSampleRate;
+    DWORD dwAverageSampleRate;
+    DWORD dwExpectedSampleRate;
+} WM_WRITER_STATISTICS;
+
+typedef struct _WMWriterStatisticsEx
+{
+    DWORD dwBitratePlusOverhead;
+    DWORD dwCurrentSampleDropRateInQueue;
+    DWORD dwCurrentSampleDropRateInCodec;
+    DWORD dwCurrentSampleDropRateInMultiplexer;
+    DWORD dwTotalSampleDropsInQueue;
+    DWORD dwTotalSampleDropsInCodec;
+    DWORD dwTotalSampleDropsInMultiplexer;
+} WM_WRITER_STATISTICS_EX;
+
 typedef enum WMT_ATTR_DATATYPE
 {
     WMT_TYPE_DWORD      = 0,
@@ -516,6 +541,190 @@
         [in] IStream *pStream);
 };
 
+[
+    object,
+    uuid(96406bd5-2b2b-11d3-b36b-00c04f6108ff),
+    pointer_default(unique),
+    local
+]
+interface IWMInputMediaProps : IWMMediaProps
+{
+    HRESULT GetConnectionName(
+        [out, size_is(*pcchName)] WCHAR *pwszName,
+        [in, out] WORD *pcchName);
+
+    HRESULT GetGroupName(
+        [out, size_is(*pcchName)] WCHAR *pwszName,
+        [in, out] WORD *pcchName);
+}
+
+[
+    object,
+    uuid(96406be4-2b2b-11d3-b36b-00c04f6108ff),
+    pointer_default(unique),
+    local
+]
+interface IWMWriterSink : IUnknown
+{
+    HRESULT OnHeader(
+        [in] INSSBuffer *pHeader);
+
+    HRESULT IsRealTime(
+        [out] BOOL *pfRealTime);
+
+    HRESULT AllocateDataUnit(
+        [in] DWORD cbDataUnit,
+        [out] INSSBuffer **ppDataUnit);
+
+    HRESULT OnDataUnit(
+        [in] INSSBuffer *pDataUnit);
+
+    HRESULT OnEndWriting();
+}
+
+[
+    object,
+    uuid(96406bd4-2b2b-11d3-b36b-00c04f6108ff),
+    pointer_default(unique),
+    local
+]
+interface IWMWriter : IUnknown
+{
+    HRESULT SetProfileByID(
+        [in] REFGUID guidProfile);
+
+    HRESULT SetProfile(
+        [in] IWMProfile *pProfile);
+
+    HRESULT SetOutputFilename(
+        [in] const WCHAR *pwszFilename);
+
+    HRESULT GetInputCount(
+        [out] DWORD *pcInputs);
+
+    HRESULT GetInputProps(
+        [in] DWORD dwInputNum,
+        [out] IWMInputMediaProps **ppInput);
+
+    HRESULT SetInputProps(
+        [in] DWORD dwInputNum,
+        [in] IWMInputMediaProps *pInput);
+
+    HRESULT GetInputFormatCount(
+        [in] DWORD dwInputNumber,
+        [out] DWORD *pcFormats);
+
+    HRESULT GetInputFormat(
+        [in] DWORD dwInputNumber,
+        [in] DWORD dwFormatNumber,
+        [out] IWMInputMediaProps **pProps);
+
+    HRESULT BeginWriting();
+
+    HRESULT EndWriting();
+
+    HRESULT AllocateSample(
+        [in] DWORD dwSampleSize,
+        [out] INSSBuffer **ppSample);
+
+    HRESULT WriteSample(
+        [in] DWORD dwInputNum,
+        [in] QWORD cnsSampleTime,
+        [in] DWORD dwFlags,
+        [in] INSSBuffer *pSample);
+
+    HRESULT Flush();
+}
+
+[
+    object,
+    uuid(96406be3-2b2b-11d3-b36b-00C04f6108ff),
+    pointer_default(unique),
+    local
+]
+interface IWMWriterAdvanced : IUnknown
+{
+    HRESULT GetSinkCount(
+        [out] DWORD *pcSinks);
+
+    HRESULT GetSink(
+        [in] DWORD dwSinkNum,
+        [out] IWMWriterSink **ppSink);
+
+    HRESULT AddSink(
+        [in] IWMWriterSink *pSink);
+
+    HRESULT RemoveSink(
+        [in] IWMWriterSink *pSink);
+
+    HRESULT WriteStreamSample(
+        [in] WORD wStreamNum,
+        [in] QWORD cnsSampleTime,
+        [in] DWORD msSampleSendTime,
+        [in] QWORD cnsSampleDuration,
+        [in] DWORD dwFlags,
+        [in] INSSBuffer *pSample);
+
+    HRESULT SetLiveSource(
+        BOOL fIsLiveSource);
+
+    HRESULT IsRealTime(
+        [out] BOOL *pfRealTime);
+
+    HRESULT GetWriterTime(
+        [out] QWORD *pCurrentTime);
+
+    HRESULT GetStatistics(
+        [in] WORD wStreamNum,
+        [out] WM_WRITER_STATISTICS *pStats);
+
+    HRESULT SetSyncTolerance(
+        [in] DWORD msWindow);
+
+    HRESULT GetSyncTolerance(
+        [out] DWORD *pmsWindow);
+}
+
+[
+    object,
+    uuid(962dc1ec-c046-4db8-9cc7-26ceae500817),
+    pointer_default(unique),
+    local
+]
+interface IWMWriterAdvanced2 : IWMWriterAdvanced
+{
+    HRESULT GetInputSetting(
+        [in] DWORD dwInputNum,
+        [in] LPCWSTR pszName,
+        [out] WMT_ATTR_DATATYPE *pType,
+        [out, size_is(*pcbLength)] BYTE *pValue,
+        [in, out] WORD *pcbLength);
+
+    HRESULT SetInputSetting(
+        [in] DWORD dwInputNum,
+        [in] LPCWSTR pszName,
+        [in] WMT_ATTR_DATATYPE Type,
+        [in, size_is(cbLength)] const BYTE *pValue,
+        [in] WORD cbLength);
+}
+
+[
+    object,
+    uuid(2cd6492d-7c37-4e76-9d3b-59261183a22e),
+    pointer_default(unique),
+    local
+]
+interface IWMWriterAdvanced3 : IWMWriterAdvanced2
+{
+    HRESULT GetStatisticsEx(
+        [in] WORD wStreamNum,
+        [out] WM_WRITER_STATISTICS_EX *pStats);
+
+    HRESULT SetNonBlocking();
+}
+
+cpp_quote("HRESULT WINAPI WMCreateWriter(IUnknown*,IWMWriter**);")
+
 cpp_quote("EXTERN_GUID(WMMEDIASUBTYPE_Base,   0x00000000,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);")
 cpp_quote("EXTERN_GUID(WMMEDIATYPE_Video,     0x73646976,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);")
 cpp_quote("EXTERN_GUID(WMMEDIASUBTYPE_RGB1,   0xe436eb78,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);")
