/*** Autogenerated by WIDL 1.6 from include/wsdbase.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wsdbase_h__
#define __wsdbase_h__

/* Forward declarations */

#ifndef __IWSDAddress_FWD_DEFINED__
#define __IWSDAddress_FWD_DEFINED__
typedef interface IWSDAddress IWSDAddress;
#endif

#ifndef __IWSDTransportAddress_FWD_DEFINED__
#define __IWSDTransportAddress_FWD_DEFINED__
typedef interface IWSDTransportAddress IWSDTransportAddress;
#endif

#ifndef __IWSDMessageParameters_FWD_DEFINED__
#define __IWSDMessageParameters_FWD_DEFINED__
typedef interface IWSDMessageParameters IWSDMessageParameters;
#endif

#ifndef __IWSDUdpMessageParameters_FWD_DEFINED__
#define __IWSDUdpMessageParameters_FWD_DEFINED__
typedef interface IWSDUdpMessageParameters IWSDUdpMessageParameters;
#endif

#ifndef __IWSDUdpAddress_FWD_DEFINED__
#define __IWSDUdpAddress_FWD_DEFINED__
typedef interface IWSDUdpAddress IWSDUdpAddress;
#endif

#ifndef __IWSDHttpMessageParameters_FWD_DEFINED__
#define __IWSDHttpMessageParameters_FWD_DEFINED__
typedef interface IWSDHttpMessageParameters IWSDHttpMessageParameters;
#endif

#ifndef __IWSDHttpAddress_FWD_DEFINED__
#define __IWSDHttpAddress_FWD_DEFINED__
typedef interface IWSDHttpAddress IWSDHttpAddress;
#endif

#ifndef __IWSDSSLClientCertificate_FWD_DEFINED__
#define __IWSDSSLClientCertificate_FWD_DEFINED__
typedef interface IWSDSSLClientCertificate IWSDSSLClientCertificate;
#endif

#ifndef __IWSDHttpAuthParameters_FWD_DEFINED__
#define __IWSDHttpAuthParameters_FWD_DEFINED__
typedef interface IWSDHttpAuthParameters IWSDHttpAuthParameters;
#endif

#ifndef __IWSDSignatureProperty_FWD_DEFINED__
#define __IWSDSignatureProperty_FWD_DEFINED__
typedef interface IWSDSignatureProperty IWSDSignatureProperty;
#endif

/* Headers for imported files */

#include <objidl.h>
#include <wincrypt.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#ifndef __IWSDAddress_FWD_DEFINED__
#define __IWSDAddress_FWD_DEFINED__
typedef interface IWSDAddress IWSDAddress;
#endif

#ifndef __IWSDMessageParameters_FWD_DEFINED__
#define __IWSDMessageParameters_FWD_DEFINED__
typedef interface IWSDMessageParameters IWSDMessageParameters;
#endif

#ifndef __IWSDUdpAddress_FWD_DEFINED__
#define __IWSDUdpAddress_FWD_DEFINED__
typedef interface IWSDUdpAddress IWSDUdpAddress;
#endif

#ifndef __IWSDUdpMessageParameters_FWD_DEFINED__
#define __IWSDUdpMessageParameters_FWD_DEFINED__
typedef interface IWSDUdpMessageParameters IWSDUdpMessageParameters;
#endif

#ifndef __IWSDHttpAddress_FWD_DEFINED__
#define __IWSDHttpAddress_FWD_DEFINED__
typedef interface IWSDHttpAddress IWSDHttpAddress;
#endif

#ifndef __IWSDHttpMessageParameters_FWD_DEFINED__
#define __IWSDHttpMessageParameters_FWD_DEFINED__
typedef interface IWSDHttpMessageParameters IWSDHttpMessageParameters;
#endif


#if WINVER >= 0x601
typedef enum __WIDL_wsdbase_generated_name_00000005 {
    WSD_CONFIG_MAX_INBOUND_MESSAGE_SIZE = 1,
    WSD_CONFIG_MAX_OUTBOUND_MESSAGE_SIZE = 2,
    WSD_SECURITY_SSL_CERT_FOR_CLIENT_AUTH = 3,
    WSD_SECURITY_SSL_SERVER_CERT_VALIDATION = 4,
    WSD_SECURITY_SSL_CLIENT_CERT_VALIDATION = 5,
    WSD_SECURITY_SSL_NEGOTIATE_CLIENT_CERT = 6,
    WSD_SECURITY_COMPACTSIG_SIGNING_CERT = 7,
    WSD_SECURITY_COMPACTSIG_VALIDATION = 8,
    WSD_CONFIG_HOSTING_ADDRESSES = 9,
    WSD_CONFIG_DEVICE_ADDRESSES = 10,
    WSD_SECURITY_REQUIRE_HTTP_CLIENT_AUTH = 11,
    WSD_SECURITY_REQUIRE_CLIENT_CERT_OR_HTTP_CLIENT_AUTH = 12,
    WSD_SECURITY_USE_HTTP_CLIENT_AUTH = 13
} WSD_CONFIG_PARAM_TYPE;
typedef struct _WSD_CONFIG_PARAM {
    WSD_CONFIG_PARAM_TYPE configParamType;
    PVOID pConfigData;
    DWORD dwConfigDataSize;
} WSD_CONFIG_PARAM;
typedef struct _WSD_CONFIG_PARAM *PWSD_CONFIG_PARAM;
typedef struct _WSD_SECURITY_CERT_VALIDATION_V1 {
    PCCERT_CONTEXT *certMatchArray;
    DWORD dwCertMatchArrayCount;
    HCERTSTORE hCertMatchStore;
    HCERTSTORE hCertIssuerStore;
    DWORD dwCertCheckOptions;
} WSD_SECURITY_CERT_VALIDATION_V1;
#if _WIN32_WINNT >= 0x602
typedef struct _WSD_SECURITY_CERT_VALIDATION {
    PCCERT_CONTEXT *certMatchArray;
    DWORD dwCertMatchArrayCount;
    HCERTSTORE hCertMatchStore;
    HCERTSTORE hCertIssuerStore;
    DWORD dwCertCheckOptions;
    LPCWSTR pszCNGHashAlgId;
    BYTE *pbCertHash;
    DWORD dwCertHashSize;
} WSD_SECURITY_CERT_VALIDATION;
#else
typedef WSD_SECURITY_CERT_VALIDATION_V1 WSD_SECURITY_CERT_VALIDATION;
#endif

typedef WSD_SECURITY_CERT_VALIDATION *PWSD_SECURITY_CERT_VALIDATION;
typedef struct _WSD_SECURITY_SIGNATURE_VALIDATION {
    PCCERT_CONTEXT *signingCertArray;
    DWORD dwSigningCertArrayCount;
    HCERTSTORE hSigningCertStore;
    DWORD dwFlags;
} WSD_SECURITY_SIGNATURE_VALIDATION;
typedef struct _WSD_SECURITY_SIGNATURE_VALIDATION *PWSD_SECURITY_SIGNATURE_VALIDATION;
typedef DWORD WSD_SECURITY_HTTP_AUTH_SCHEMES;
typedef DWORD *PWSD_SECURITY_HTTP_AUTH_SCHEMES;

#define WSDAPI_SSL_CERT_APPLY_DEFAULT_CHECKS 0x0
#define WSDAPI_SSL_CERT_IGNORE_REVOCATION 0x1
#define WSDAPI_SSL_CERT_IGNORE_EXPIRY 0x2
#define WSDAPI_SSL_CERT_IGNORE_WRONG_USAGE 0x4
#define WSDAPI_SSL_CERT_IGNORE_UNKNOWN_CA 0x8
#define WSDAPI_SSL_CERT_IGNORE_INVALID_CN 0x10

#define WSDAPI_COMPACTSIG_ACCEPT_ALL_MESSAGES 0x1

#define WSD_SECURITY_HTTP_AUTH_SCHEME_NEGOTIATE 0x1
#define WSD_SECURITY_HTTP_AUTH_SCHEME_NTLM 0x2

typedef struct _WSD_CONFIG_ADDRESSES {
    IWSDAddress **addresses;
    DWORD dwAddressCount;
} WSD_CONFIG_ADDRESSES;
typedef struct _WSD_CONFIG_ADDRESSES *PWSD_CONFIG_ADDRESSES;
#endif
#define WSDAPI_ADDRESSFAMILY_IPV4 1
#define WSDAPI_ADDRESSFAMILY_IPV6 2
/*****************************************************************************
 * IWSDAddress interface
 */
#ifndef __IWSDAddress_INTERFACE_DEFINED__
#define __IWSDAddress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDAddress, 0xb9574c6c, 0x12a6, 0x4f74, 0x93,0xa1, 0x33,0x18,0xff,0x60,0x57,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b9574c6c-12a6-4f74-93a1-3318ff605759")
IWSDAddress : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Serialize(
        LPWSTR pszBuffer,
        DWORD cchLength,
        WINBOOL fSafe) = 0;

    virtual HRESULT STDMETHODCALLTYPE Deserialize(
        LPCWSTR pszBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDAddress, 0xb9574c6c, 0x12a6, 0x4f74, 0x93,0xa1, 0x33,0x18,0xff,0x60,0x57,0x59)
#endif
#else
typedef struct IWSDAddressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDAddress* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDAddress* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDAddress* This);

    /*** IWSDAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *Serialize)(
        IWSDAddress* This,
        LPWSTR pszBuffer,
        DWORD cchLength,
        WINBOOL fSafe);

    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IWSDAddress* This,
        LPCWSTR pszBuffer);

    END_INTERFACE
} IWSDAddressVtbl;
interface IWSDAddress {
    CONST_VTBL IWSDAddressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDAddress_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAddress methods ***/
#define IWSDAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
#define IWSDAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDAddress_QueryInterface(IWSDAddress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDAddress_AddRef(IWSDAddress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDAddress_Release(IWSDAddress* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAddress methods ***/
static FORCEINLINE HRESULT IWSDAddress_Serialize(IWSDAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
}
static FORCEINLINE HRESULT IWSDAddress_Deserialize(IWSDAddress* This,LPCWSTR pszBuffer) {
    return This->lpVtbl->Deserialize(This,pszBuffer);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDAddress_Serialize_Proxy(
    IWSDAddress* This,
    LPWSTR pszBuffer,
    DWORD cchLength,
    WINBOOL fSafe);
void __RPC_STUB IWSDAddress_Serialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDAddress_Deserialize_Proxy(
    IWSDAddress* This,
    LPCWSTR pszBuffer);
void __RPC_STUB IWSDAddress_Deserialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDAddress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDTransportAddress interface
 */
#ifndef __IWSDTransportAddress_INTERFACE_DEFINED__
#define __IWSDTransportAddress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDTransportAddress, 0x70d23498, 0x4ee6, 0x4340, 0xa3,0xdf, 0xd8,0x45,0xd2,0x23,0x54,0x67);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("70d23498-4ee6-4340-a3df-d845d2235467")
IWSDTransportAddress : public IWSDAddress
{
    virtual HRESULT STDMETHODCALLTYPE GetPort(
        WORD *pwPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPort(
        WORD wPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransportAddress(
        LPCWSTR *ppszAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransportAddressEx(
        WINBOOL fSafe,
        LPCWSTR *ppszAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransportAddress(
        LPCWSTR pszAddress) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDTransportAddress, 0x70d23498, 0x4ee6, 0x4340, 0xa3,0xdf, 0xd8,0x45,0xd2,0x23,0x54,0x67)
#endif
#else
typedef struct IWSDTransportAddressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDTransportAddress* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDTransportAddress* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDTransportAddress* This);

    /*** IWSDAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *Serialize)(
        IWSDTransportAddress* This,
        LPWSTR pszBuffer,
        DWORD cchLength,
        WINBOOL fSafe);

    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IWSDTransportAddress* This,
        LPCWSTR pszBuffer);

    /*** IWSDTransportAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPort)(
        IWSDTransportAddress* This,
        WORD *pwPort);

    HRESULT (STDMETHODCALLTYPE *SetPort)(
        IWSDTransportAddress* This,
        WORD wPort);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
        IWSDTransportAddress* This,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
        IWSDTransportAddress* This,
        WINBOOL fSafe,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
        IWSDTransportAddress* This,
        LPCWSTR pszAddress);

    END_INTERFACE
} IWSDTransportAddressVtbl;
interface IWSDTransportAddress {
    CONST_VTBL IWSDTransportAddressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDTransportAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDTransportAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDTransportAddress_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAddress methods ***/
#define IWSDTransportAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
#define IWSDTransportAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
/*** IWSDTransportAddress methods ***/
#define IWSDTransportAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
#define IWSDTransportAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
#define IWSDTransportAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
#define IWSDTransportAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
#define IWSDTransportAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDTransportAddress_QueryInterface(IWSDTransportAddress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDTransportAddress_AddRef(IWSDTransportAddress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDTransportAddress_Release(IWSDTransportAddress* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAddress methods ***/
static FORCEINLINE HRESULT IWSDTransportAddress_Serialize(IWSDTransportAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
}
static FORCEINLINE HRESULT IWSDTransportAddress_Deserialize(IWSDTransportAddress* This,LPCWSTR pszBuffer) {
    return This->lpVtbl->Deserialize(This,pszBuffer);
}
/*** IWSDTransportAddress methods ***/
static FORCEINLINE HRESULT IWSDTransportAddress_GetPort(IWSDTransportAddress* This,WORD *pwPort) {
    return This->lpVtbl->GetPort(This,pwPort);
}
static FORCEINLINE HRESULT IWSDTransportAddress_SetPort(IWSDTransportAddress* This,WORD wPort) {
    return This->lpVtbl->SetPort(This,wPort);
}
static FORCEINLINE HRESULT IWSDTransportAddress_GetTransportAddress(IWSDTransportAddress* This,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
}
static FORCEINLINE HRESULT IWSDTransportAddress_GetTransportAddressEx(IWSDTransportAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
}
static FORCEINLINE HRESULT IWSDTransportAddress_SetTransportAddress(IWSDTransportAddress* This,LPCWSTR pszAddress) {
    return This->lpVtbl->SetTransportAddress(This,pszAddress);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetPort_Proxy(
    IWSDTransportAddress* This,
    WORD *pwPort);
void __RPC_STUB IWSDTransportAddress_GetPort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDTransportAddress_SetPort_Proxy(
    IWSDTransportAddress* This,
    WORD wPort);
void __RPC_STUB IWSDTransportAddress_SetPort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetTransportAddress_Proxy(
    IWSDTransportAddress* This,
    LPCWSTR *ppszAddress);
void __RPC_STUB IWSDTransportAddress_GetTransportAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetTransportAddressEx_Proxy(
    IWSDTransportAddress* This,
    WINBOOL fSafe,
    LPCWSTR *ppszAddress);
void __RPC_STUB IWSDTransportAddress_GetTransportAddressEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDTransportAddress_SetTransportAddress_Proxy(
    IWSDTransportAddress* This,
    LPCWSTR pszAddress);
void __RPC_STUB IWSDTransportAddress_SetTransportAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDTransportAddress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDMessageParameters interface
 */
#ifndef __IWSDMessageParameters_INTERFACE_DEFINED__
#define __IWSDMessageParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDMessageParameters, 0x1fafe8a2, 0xe6fc, 0x4b80, 0xb6,0xcf, 0xb7,0xd4,0x5c,0x41,0x6d,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1fafe8a2-e6fc-4b80-b6cf-b7d45c416d7c")
IWSDMessageParameters : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLocalAddress(
        IWSDAddress **ppAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLocalAddress(
        IWSDAddress *pAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRemoteAddress(
        IWSDAddress **ppAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRemoteAddress(
        IWSDAddress *pAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLowerParameters(
        IWSDMessageParameters **ppTxParams) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDMessageParameters, 0x1fafe8a2, 0xe6fc, 0x4b80, 0xb6,0xcf, 0xb7,0xd4,0x5c,0x41,0x6d,0x7c)
#endif
#else
typedef struct IWSDMessageParametersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDMessageParameters* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDMessageParameters* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDMessageParameters* This);

    /*** IWSDMessageParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
        IWSDMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
        IWSDMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
        IWSDMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
        IWSDMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
        IWSDMessageParameters* This,
        IWSDMessageParameters **ppTxParams);

    END_INTERFACE
} IWSDMessageParametersVtbl;
interface IWSDMessageParameters {
    CONST_VTBL IWSDMessageParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDMessageParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMessageParameters methods ***/
#define IWSDMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
#define IWSDMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
#define IWSDMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
#define IWSDMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
#define IWSDMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDMessageParameters_QueryInterface(IWSDMessageParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDMessageParameters_AddRef(IWSDMessageParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDMessageParameters_Release(IWSDMessageParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMessageParameters methods ***/
static FORCEINLINE HRESULT IWSDMessageParameters_GetLocalAddress(IWSDMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetLocalAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDMessageParameters_SetLocalAddress(IWSDMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetLocalAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDMessageParameters_GetRemoteAddress(IWSDMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDMessageParameters_SetRemoteAddress(IWSDMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetRemoteAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDMessageParameters_GetLowerParameters(IWSDMessageParameters* This,IWSDMessageParameters **ppTxParams) {
    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetLocalAddress_Proxy(
    IWSDMessageParameters* This,
    IWSDAddress **ppAddress);
void __RPC_STUB IWSDMessageParameters_GetLocalAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDMessageParameters_SetLocalAddress_Proxy(
    IWSDMessageParameters* This,
    IWSDAddress *pAddress);
void __RPC_STUB IWSDMessageParameters_SetLocalAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetRemoteAddress_Proxy(
    IWSDMessageParameters* This,
    IWSDAddress **ppAddress);
void __RPC_STUB IWSDMessageParameters_GetRemoteAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDMessageParameters_SetRemoteAddress_Proxy(
    IWSDMessageParameters* This,
    IWSDAddress *pAddress);
void __RPC_STUB IWSDMessageParameters_SetRemoteAddress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetLowerParameters_Proxy(
    IWSDMessageParameters* This,
    IWSDMessageParameters **ppTxParams);
void __RPC_STUB IWSDMessageParameters_GetLowerParameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDMessageParameters_INTERFACE_DEFINED__ */

HRESULT WINAPI
WSDCreateUdpMessageParameters(
IWSDUdpMessageParameters** ppTxParams);
typedef struct _WSDUdpRetransmitParams {
    ULONG ulSendDelay;
    ULONG ulRepeat;
    ULONG ulRepeatMinDelay;
    ULONG ulRepeatMaxDelay;
    ULONG ulRepeatUpperDelay;
} WSDUdpRetransmitParams;
/*****************************************************************************
 * IWSDUdpMessageParameters interface
 */
#ifndef __IWSDUdpMessageParameters_INTERFACE_DEFINED__
#define __IWSDUdpMessageParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDUdpMessageParameters, 0x9934149f, 0x8f0c, 0x447b, 0xaa,0x0b, 0x73,0x12,0x4b,0x0c,0xa7,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9934149f-8f0c-447b-aa0b-73124b0ca7f0")
IWSDUdpMessageParameters : public IWSDMessageParameters
{
    virtual HRESULT STDMETHODCALLTYPE SetRetransmitParams(
        const WSDUdpRetransmitParams *pParams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRetransmitParams(
        WSDUdpRetransmitParams *pParams) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDUdpMessageParameters, 0x9934149f, 0x8f0c, 0x447b, 0xaa,0x0b, 0x73,0x12,0x4b,0x0c,0xa7,0xf0)
#endif
#else
typedef struct IWSDUdpMessageParametersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDUdpMessageParameters* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDUdpMessageParameters* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDUdpMessageParameters* This);

    /*** IWSDMessageParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
        IWSDUdpMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
        IWSDUdpMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
        IWSDUdpMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
        IWSDUdpMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
        IWSDUdpMessageParameters* This,
        IWSDMessageParameters **ppTxParams);

    /*** IWSDUdpMessageParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRetransmitParams)(
        IWSDUdpMessageParameters* This,
        const WSDUdpRetransmitParams *pParams);

    HRESULT (STDMETHODCALLTYPE *GetRetransmitParams)(
        IWSDUdpMessageParameters* This,
        WSDUdpRetransmitParams *pParams);

    END_INTERFACE
} IWSDUdpMessageParametersVtbl;
interface IWSDUdpMessageParameters {
    CONST_VTBL IWSDUdpMessageParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDUdpMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDUdpMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDUdpMessageParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMessageParameters methods ***/
#define IWSDUdpMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
#define IWSDUdpMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
#define IWSDUdpMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
#define IWSDUdpMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
#define IWSDUdpMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
/*** IWSDUdpMessageParameters methods ***/
#define IWSDUdpMessageParameters_SetRetransmitParams(This,pParams) (This)->lpVtbl->SetRetransmitParams(This,pParams)
#define IWSDUdpMessageParameters_GetRetransmitParams(This,pParams) (This)->lpVtbl->GetRetransmitParams(This,pParams)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDUdpMessageParameters_QueryInterface(IWSDUdpMessageParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDUdpMessageParameters_AddRef(IWSDUdpMessageParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDUdpMessageParameters_Release(IWSDUdpMessageParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMessageParameters methods ***/
static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetLocalAddress(IWSDUdpMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetLocalAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetLocalAddress(IWSDUdpMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetLocalAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetRemoteAddress(IWSDUdpMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetRemoteAddress(IWSDUdpMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetRemoteAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetLowerParameters(IWSDUdpMessageParameters* This,IWSDMessageParameters **ppTxParams) {
    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
}
/*** IWSDUdpMessageParameters methods ***/
static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetRetransmitParams(IWSDUdpMessageParameters* This,const WSDUdpRetransmitParams *pParams) {
    return This->lpVtbl->SetRetransmitParams(This,pParams);
}
static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetRetransmitParams(IWSDUdpMessageParameters* This,WSDUdpRetransmitParams *pParams) {
    return This->lpVtbl->GetRetransmitParams(This,pParams);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDUdpMessageParameters_SetRetransmitParams_Proxy(
    IWSDUdpMessageParameters* This,
    const WSDUdpRetransmitParams *pParams);
void __RPC_STUB IWSDUdpMessageParameters_SetRetransmitParams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpMessageParameters_GetRetransmitParams_Proxy(
    IWSDUdpMessageParameters* This,
    WSDUdpRetransmitParams *pParams);
void __RPC_STUB IWSDUdpMessageParameters_GetRetransmitParams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDUdpMessageParameters_INTERFACE_DEFINED__ */

HRESULT WINAPI
WSDCreateUdpAddress(
 IWSDUdpAddress** ppAddress);
#if 1

#ifndef __CSADDR_DEFINED__
struct SOCKADDR_STORAGE;
#endif
#else
typedef void SOCKADDR_STORAGE;
#endif
typedef enum _WSDUdpMessageType {
    ONE_WAY = 0,
    TWO_WAY = 1
} WSDUdpMessageType;
/*****************************************************************************
 * IWSDUdpAddress interface
 */
#ifndef __IWSDUdpAddress_INTERFACE_DEFINED__
#define __IWSDUdpAddress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDUdpAddress, 0x74d6124a, 0xa441, 0x4f78, 0xa1,0xeb, 0x97,0xa8,0xd1,0x99,0x68,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("74d6124a-a441-4f78-a1eb-97a8d1996893")
IWSDUdpAddress : public IWSDTransportAddress
{
    virtual HRESULT STDMETHODCALLTYPE SetSockaddr(
        const SOCKADDR_STORAGE *pSockAddr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSockaddr(
        SOCKADDR_STORAGE *pSockAddr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetExclusive(
        WINBOOL fExclusive) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExclusive(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMessageType(
        WSDUdpMessageType messageType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMessageType(
        WSDUdpMessageType *pMessageType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTTL(
        DWORD dwTTL) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTTL(
        DWORD *pdwTTL) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAlias(
        const GUID *pAlias) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlias(
        GUID *pAlias) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDUdpAddress, 0x74d6124a, 0xa441, 0x4f78, 0xa1,0xeb, 0x97,0xa8,0xd1,0x99,0x68,0x93)
#endif
#else
typedef struct IWSDUdpAddressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDUdpAddress* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDUdpAddress* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDUdpAddress* This);

    /*** IWSDAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *Serialize)(
        IWSDUdpAddress* This,
        LPWSTR pszBuffer,
        DWORD cchLength,
        WINBOOL fSafe);

    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IWSDUdpAddress* This,
        LPCWSTR pszBuffer);

    /*** IWSDTransportAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPort)(
        IWSDUdpAddress* This,
        WORD *pwPort);

    HRESULT (STDMETHODCALLTYPE *SetPort)(
        IWSDUdpAddress* This,
        WORD wPort);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
        IWSDUdpAddress* This,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
        IWSDUdpAddress* This,
        WINBOOL fSafe,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
        IWSDUdpAddress* This,
        LPCWSTR pszAddress);

    /*** IWSDUdpAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSockaddr)(
        IWSDUdpAddress* This,
        const SOCKADDR_STORAGE *pSockAddr);

    HRESULT (STDMETHODCALLTYPE *GetSockaddr)(
        IWSDUdpAddress* This,
        SOCKADDR_STORAGE *pSockAddr);

    HRESULT (STDMETHODCALLTYPE *SetExclusive)(
        IWSDUdpAddress* This,
        WINBOOL fExclusive);

    HRESULT (STDMETHODCALLTYPE *GetExclusive)(
        IWSDUdpAddress* This);

    HRESULT (STDMETHODCALLTYPE *SetMessageType)(
        IWSDUdpAddress* This,
        WSDUdpMessageType messageType);

    HRESULT (STDMETHODCALLTYPE *GetMessageType)(
        IWSDUdpAddress* This,
        WSDUdpMessageType *pMessageType);

    HRESULT (STDMETHODCALLTYPE *SetTTL)(
        IWSDUdpAddress* This,
        DWORD dwTTL);

    HRESULT (STDMETHODCALLTYPE *GetTTL)(
        IWSDUdpAddress* This,
        DWORD *pdwTTL);

    HRESULT (STDMETHODCALLTYPE *SetAlias)(
        IWSDUdpAddress* This,
        const GUID *pAlias);

    HRESULT (STDMETHODCALLTYPE *GetAlias)(
        IWSDUdpAddress* This,
        GUID *pAlias);

    END_INTERFACE
} IWSDUdpAddressVtbl;
interface IWSDUdpAddress {
    CONST_VTBL IWSDUdpAddressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDUdpAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDUdpAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDUdpAddress_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAddress methods ***/
#define IWSDUdpAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
#define IWSDUdpAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
/*** IWSDTransportAddress methods ***/
#define IWSDUdpAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
#define IWSDUdpAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
#define IWSDUdpAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
#define IWSDUdpAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
#define IWSDUdpAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
/*** IWSDUdpAddress methods ***/
#define IWSDUdpAddress_SetSockaddr(This,pSockAddr) (This)->lpVtbl->SetSockaddr(This,pSockAddr)
#define IWSDUdpAddress_GetSockaddr(This,pSockAddr) (This)->lpVtbl->GetSockaddr(This,pSockAddr)
#define IWSDUdpAddress_SetExclusive(This,fExclusive) (This)->lpVtbl->SetExclusive(This,fExclusive)
#define IWSDUdpAddress_GetExclusive(This) (This)->lpVtbl->GetExclusive(This)
#define IWSDUdpAddress_SetMessageType(This,messageType) (This)->lpVtbl->SetMessageType(This,messageType)
#define IWSDUdpAddress_GetMessageType(This,pMessageType) (This)->lpVtbl->GetMessageType(This,pMessageType)
#define IWSDUdpAddress_SetTTL(This,dwTTL) (This)->lpVtbl->SetTTL(This,dwTTL)
#define IWSDUdpAddress_GetTTL(This,pdwTTL) (This)->lpVtbl->GetTTL(This,pdwTTL)
#define IWSDUdpAddress_SetAlias(This,pAlias) (This)->lpVtbl->SetAlias(This,pAlias)
#define IWSDUdpAddress_GetAlias(This,pAlias) (This)->lpVtbl->GetAlias(This,pAlias)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDUdpAddress_QueryInterface(IWSDUdpAddress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDUdpAddress_AddRef(IWSDUdpAddress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDUdpAddress_Release(IWSDUdpAddress* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAddress methods ***/
static FORCEINLINE HRESULT IWSDUdpAddress_Serialize(IWSDUdpAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
}
static FORCEINLINE HRESULT IWSDUdpAddress_Deserialize(IWSDUdpAddress* This,LPCWSTR pszBuffer) {
    return This->lpVtbl->Deserialize(This,pszBuffer);
}
/*** IWSDTransportAddress methods ***/
static FORCEINLINE HRESULT IWSDUdpAddress_GetPort(IWSDUdpAddress* This,WORD *pwPort) {
    return This->lpVtbl->GetPort(This,pwPort);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetPort(IWSDUdpAddress* This,WORD wPort) {
    return This->lpVtbl->SetPort(This,wPort);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetTransportAddress(IWSDUdpAddress* This,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetTransportAddressEx(IWSDUdpAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetTransportAddress(IWSDUdpAddress* This,LPCWSTR pszAddress) {
    return This->lpVtbl->SetTransportAddress(This,pszAddress);
}
/*** IWSDUdpAddress methods ***/
static FORCEINLINE HRESULT IWSDUdpAddress_SetSockaddr(IWSDUdpAddress* This,const SOCKADDR_STORAGE *pSockAddr) {
    return This->lpVtbl->SetSockaddr(This,pSockAddr);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetSockaddr(IWSDUdpAddress* This,SOCKADDR_STORAGE *pSockAddr) {
    return This->lpVtbl->GetSockaddr(This,pSockAddr);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetExclusive(IWSDUdpAddress* This,WINBOOL fExclusive) {
    return This->lpVtbl->SetExclusive(This,fExclusive);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetExclusive(IWSDUdpAddress* This) {
    return This->lpVtbl->GetExclusive(This);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetMessageType(IWSDUdpAddress* This,WSDUdpMessageType messageType) {
    return This->lpVtbl->SetMessageType(This,messageType);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetMessageType(IWSDUdpAddress* This,WSDUdpMessageType *pMessageType) {
    return This->lpVtbl->GetMessageType(This,pMessageType);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetTTL(IWSDUdpAddress* This,DWORD dwTTL) {
    return This->lpVtbl->SetTTL(This,dwTTL);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetTTL(IWSDUdpAddress* This,DWORD *pdwTTL) {
    return This->lpVtbl->GetTTL(This,pdwTTL);
}
static FORCEINLINE HRESULT IWSDUdpAddress_SetAlias(IWSDUdpAddress* This,const GUID *pAlias) {
    return This->lpVtbl->SetAlias(This,pAlias);
}
static FORCEINLINE HRESULT IWSDUdpAddress_GetAlias(IWSDUdpAddress* This,GUID *pAlias) {
    return This->lpVtbl->GetAlias(This,pAlias);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetSockaddr_Proxy(
    IWSDUdpAddress* This,
    const SOCKADDR_STORAGE *pSockAddr);
void __RPC_STUB IWSDUdpAddress_SetSockaddr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetSockaddr_Proxy(
    IWSDUdpAddress* This,
    SOCKADDR_STORAGE *pSockAddr);
void __RPC_STUB IWSDUdpAddress_GetSockaddr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetExclusive_Proxy(
    IWSDUdpAddress* This,
    WINBOOL fExclusive);
void __RPC_STUB IWSDUdpAddress_SetExclusive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetExclusive_Proxy(
    IWSDUdpAddress* This);
void __RPC_STUB IWSDUdpAddress_GetExclusive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetMessageType_Proxy(
    IWSDUdpAddress* This,
    WSDUdpMessageType messageType);
void __RPC_STUB IWSDUdpAddress_SetMessageType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetMessageType_Proxy(
    IWSDUdpAddress* This,
    WSDUdpMessageType *pMessageType);
void __RPC_STUB IWSDUdpAddress_GetMessageType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetTTL_Proxy(
    IWSDUdpAddress* This,
    DWORD dwTTL);
void __RPC_STUB IWSDUdpAddress_SetTTL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetTTL_Proxy(
    IWSDUdpAddress* This,
    DWORD *pdwTTL);
void __RPC_STUB IWSDUdpAddress_GetTTL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetAlias_Proxy(
    IWSDUdpAddress* This,
    const GUID *pAlias);
void __RPC_STUB IWSDUdpAddress_SetAlias_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetAlias_Proxy(
    IWSDUdpAddress* This,
    GUID *pAlias);
void __RPC_STUB IWSDUdpAddress_GetAlias_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDUdpAddress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDHttpMessageParameters interface
 */
#ifndef __IWSDHttpMessageParameters_INTERFACE_DEFINED__
#define __IWSDHttpMessageParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDHttpMessageParameters, 0x540bd122, 0x5c83, 0x4dec, 0xb3,0x96, 0xea,0x62,0xa2,0x69,0x7f,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("540bd122-5c83-4dec-b396-ea62a2697fdf")
IWSDHttpMessageParameters : public IWSDMessageParameters
{
    virtual HRESULT STDMETHODCALLTYPE SetInboundHttpHeaders(
        LPCWSTR pszHeaders) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInboundHttpHeaders(
        LPCWSTR *ppszHeaders) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutboundHttpHeaders(
        LPCWSTR pszHeaders) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutboundHttpHeaders(
        LPCWSTR *ppszHeaders) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetID(
        LPCWSTR pszId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetID(
        LPCWSTR *ppszId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContext(
        IUnknown *pContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContext(
        IUnknown **ppContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDHttpMessageParameters, 0x540bd122, 0x5c83, 0x4dec, 0xb3,0x96, 0xea,0x62,0xa2,0x69,0x7f,0xdf)
#endif
#else
typedef struct IWSDHttpMessageParametersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDHttpMessageParameters* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDHttpMessageParameters* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDHttpMessageParameters* This);

    /*** IWSDMessageParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
        IWSDHttpMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
        IWSDHttpMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
        IWSDHttpMessageParameters* This,
        IWSDAddress **ppAddress);

    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
        IWSDHttpMessageParameters* This,
        IWSDAddress *pAddress);

    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
        IWSDHttpMessageParameters* This,
        IWSDMessageParameters **ppTxParams);

    /*** IWSDHttpMessageParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInboundHttpHeaders)(
        IWSDHttpMessageParameters* This,
        LPCWSTR pszHeaders);

    HRESULT (STDMETHODCALLTYPE *GetInboundHttpHeaders)(
        IWSDHttpMessageParameters* This,
        LPCWSTR *ppszHeaders);

    HRESULT (STDMETHODCALLTYPE *SetOutboundHttpHeaders)(
        IWSDHttpMessageParameters* This,
        LPCWSTR pszHeaders);

    HRESULT (STDMETHODCALLTYPE *GetOutboundHttpHeaders)(
        IWSDHttpMessageParameters* This,
        LPCWSTR *ppszHeaders);

    HRESULT (STDMETHODCALLTYPE *SetID)(
        IWSDHttpMessageParameters* This,
        LPCWSTR pszId);

    HRESULT (STDMETHODCALLTYPE *GetID)(
        IWSDHttpMessageParameters* This,
        LPCWSTR *ppszId);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IWSDHttpMessageParameters* This,
        IUnknown *pContext);

    HRESULT (STDMETHODCALLTYPE *GetContext)(
        IWSDHttpMessageParameters* This,
        IUnknown **ppContext);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IWSDHttpMessageParameters* This);

    END_INTERFACE
} IWSDHttpMessageParametersVtbl;
interface IWSDHttpMessageParameters {
    CONST_VTBL IWSDHttpMessageParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDHttpMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDHttpMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDHttpMessageParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDMessageParameters methods ***/
#define IWSDHttpMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
#define IWSDHttpMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
#define IWSDHttpMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
#define IWSDHttpMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
#define IWSDHttpMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
/*** IWSDHttpMessageParameters methods ***/
#define IWSDHttpMessageParameters_SetInboundHttpHeaders(This,pszHeaders) (This)->lpVtbl->SetInboundHttpHeaders(This,pszHeaders)
#define IWSDHttpMessageParameters_GetInboundHttpHeaders(This,ppszHeaders) (This)->lpVtbl->GetInboundHttpHeaders(This,ppszHeaders)
#define IWSDHttpMessageParameters_SetOutboundHttpHeaders(This,pszHeaders) (This)->lpVtbl->SetOutboundHttpHeaders(This,pszHeaders)
#define IWSDHttpMessageParameters_GetOutboundHttpHeaders(This,ppszHeaders) (This)->lpVtbl->GetOutboundHttpHeaders(This,ppszHeaders)
#define IWSDHttpMessageParameters_SetID(This,pszId) (This)->lpVtbl->SetID(This,pszId)
#define IWSDHttpMessageParameters_GetID(This,ppszId) (This)->lpVtbl->GetID(This,ppszId)
#define IWSDHttpMessageParameters_SetContext(This,pContext) (This)->lpVtbl->SetContext(This,pContext)
#define IWSDHttpMessageParameters_GetContext(This,ppContext) (This)->lpVtbl->GetContext(This,ppContext)
#define IWSDHttpMessageParameters_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDHttpMessageParameters_QueryInterface(IWSDHttpMessageParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDHttpMessageParameters_AddRef(IWSDHttpMessageParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDHttpMessageParameters_Release(IWSDHttpMessageParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDMessageParameters methods ***/
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetLocalAddress(IWSDHttpMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetLocalAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetLocalAddress(IWSDHttpMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetLocalAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetRemoteAddress(IWSDHttpMessageParameters* This,IWSDAddress **ppAddress) {
    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetRemoteAddress(IWSDHttpMessageParameters* This,IWSDAddress *pAddress) {
    return This->lpVtbl->SetRemoteAddress(This,pAddress);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetLowerParameters(IWSDHttpMessageParameters* This,IWSDMessageParameters **ppTxParams) {
    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
}
/*** IWSDHttpMessageParameters methods ***/
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetInboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR pszHeaders) {
    return This->lpVtbl->SetInboundHttpHeaders(This,pszHeaders);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetInboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR *ppszHeaders) {
    return This->lpVtbl->GetInboundHttpHeaders(This,ppszHeaders);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetOutboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR pszHeaders) {
    return This->lpVtbl->SetOutboundHttpHeaders(This,pszHeaders);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetOutboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR *ppszHeaders) {
    return This->lpVtbl->GetOutboundHttpHeaders(This,ppszHeaders);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetID(IWSDHttpMessageParameters* This,LPCWSTR pszId) {
    return This->lpVtbl->SetID(This,pszId);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetID(IWSDHttpMessageParameters* This,LPCWSTR *ppszId) {
    return This->lpVtbl->GetID(This,ppszId);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetContext(IWSDHttpMessageParameters* This,IUnknown *pContext) {
    return This->lpVtbl->SetContext(This,pContext);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetContext(IWSDHttpMessageParameters* This,IUnknown **ppContext) {
    return This->lpVtbl->GetContext(This,ppContext);
}
static FORCEINLINE HRESULT IWSDHttpMessageParameters_Clear(IWSDHttpMessageParameters* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetInboundHttpHeaders_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR pszHeaders);
void __RPC_STUB IWSDHttpMessageParameters_SetInboundHttpHeaders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetInboundHttpHeaders_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR *ppszHeaders);
void __RPC_STUB IWSDHttpMessageParameters_GetInboundHttpHeaders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetOutboundHttpHeaders_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR pszHeaders);
void __RPC_STUB IWSDHttpMessageParameters_SetOutboundHttpHeaders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetOutboundHttpHeaders_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR *ppszHeaders);
void __RPC_STUB IWSDHttpMessageParameters_GetOutboundHttpHeaders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetID_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR pszId);
void __RPC_STUB IWSDHttpMessageParameters_SetID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetID_Proxy(
    IWSDHttpMessageParameters* This,
    LPCWSTR *ppszId);
void __RPC_STUB IWSDHttpMessageParameters_GetID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetContext_Proxy(
    IWSDHttpMessageParameters* This,
    IUnknown *pContext);
void __RPC_STUB IWSDHttpMessageParameters_SetContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetContext_Proxy(
    IWSDHttpMessageParameters* This,
    IUnknown **ppContext);
void __RPC_STUB IWSDHttpMessageParameters_GetContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_Clear_Proxy(
    IWSDHttpMessageParameters* This);
void __RPC_STUB IWSDHttpMessageParameters_Clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDHttpMessageParameters_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDHttpAddress interface
 */
#ifndef __IWSDHttpAddress_INTERFACE_DEFINED__
#define __IWSDHttpAddress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDHttpAddress, 0xd09ac7bd, 0x2a3e, 0x4b85, 0x86,0x05, 0x27,0x37,0xff,0x3e,0x4e,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d09ac7bd-2a3e-4b85-8605-2737ff3e4ea0")
IWSDHttpAddress : public IWSDTransportAddress
{
    virtual HRESULT STDMETHODCALLTYPE GetSecure(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSecure(
        WINBOOL fSecure) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPCWSTR *ppszPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        LPCWSTR pszPath) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDHttpAddress, 0xd09ac7bd, 0x2a3e, 0x4b85, 0x86,0x05, 0x27,0x37,0xff,0x3e,0x4e,0xa0)
#endif
#else
typedef struct IWSDHttpAddressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDHttpAddress* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDHttpAddress* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDHttpAddress* This);

    /*** IWSDAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *Serialize)(
        IWSDHttpAddress* This,
        LPWSTR pszBuffer,
        DWORD cchLength,
        WINBOOL fSafe);

    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IWSDHttpAddress* This,
        LPCWSTR pszBuffer);

    /*** IWSDTransportAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPort)(
        IWSDHttpAddress* This,
        WORD *pwPort);

    HRESULT (STDMETHODCALLTYPE *SetPort)(
        IWSDHttpAddress* This,
        WORD wPort);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
        IWSDHttpAddress* This,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
        IWSDHttpAddress* This,
        WINBOOL fSafe,
        LPCWSTR *ppszAddress);

    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
        IWSDHttpAddress* This,
        LPCWSTR pszAddress);

    /*** IWSDHttpAddress methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSecure)(
        IWSDHttpAddress* This);

    HRESULT (STDMETHODCALLTYPE *SetSecure)(
        IWSDHttpAddress* This,
        WINBOOL fSecure);

    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IWSDHttpAddress* This,
        LPCWSTR *ppszPath);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IWSDHttpAddress* This,
        LPCWSTR pszPath);

    END_INTERFACE
} IWSDHttpAddressVtbl;
interface IWSDHttpAddress {
    CONST_VTBL IWSDHttpAddressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDHttpAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDHttpAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDHttpAddress_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDAddress methods ***/
#define IWSDHttpAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
#define IWSDHttpAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
/*** IWSDTransportAddress methods ***/
#define IWSDHttpAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
#define IWSDHttpAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
#define IWSDHttpAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
#define IWSDHttpAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
#define IWSDHttpAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
/*** IWSDHttpAddress methods ***/
#define IWSDHttpAddress_GetSecure(This) (This)->lpVtbl->GetSecure(This)
#define IWSDHttpAddress_SetSecure(This,fSecure) (This)->lpVtbl->SetSecure(This,fSecure)
#define IWSDHttpAddress_GetPath(This,ppszPath) (This)->lpVtbl->GetPath(This,ppszPath)
#define IWSDHttpAddress_SetPath(This,pszPath) (This)->lpVtbl->SetPath(This,pszPath)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDHttpAddress_QueryInterface(IWSDHttpAddress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDHttpAddress_AddRef(IWSDHttpAddress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDHttpAddress_Release(IWSDHttpAddress* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDAddress methods ***/
static FORCEINLINE HRESULT IWSDHttpAddress_Serialize(IWSDHttpAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
}
static FORCEINLINE HRESULT IWSDHttpAddress_Deserialize(IWSDHttpAddress* This,LPCWSTR pszBuffer) {
    return This->lpVtbl->Deserialize(This,pszBuffer);
}
/*** IWSDTransportAddress methods ***/
static FORCEINLINE HRESULT IWSDHttpAddress_GetPort(IWSDHttpAddress* This,WORD *pwPort) {
    return This->lpVtbl->GetPort(This,pwPort);
}
static FORCEINLINE HRESULT IWSDHttpAddress_SetPort(IWSDHttpAddress* This,WORD wPort) {
    return This->lpVtbl->SetPort(This,wPort);
}
static FORCEINLINE HRESULT IWSDHttpAddress_GetTransportAddress(IWSDHttpAddress* This,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
}
static FORCEINLINE HRESULT IWSDHttpAddress_GetTransportAddressEx(IWSDHttpAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
}
static FORCEINLINE HRESULT IWSDHttpAddress_SetTransportAddress(IWSDHttpAddress* This,LPCWSTR pszAddress) {
    return This->lpVtbl->SetTransportAddress(This,pszAddress);
}
/*** IWSDHttpAddress methods ***/
static FORCEINLINE HRESULT IWSDHttpAddress_GetSecure(IWSDHttpAddress* This) {
    return This->lpVtbl->GetSecure(This);
}
static FORCEINLINE HRESULT IWSDHttpAddress_SetSecure(IWSDHttpAddress* This,WINBOOL fSecure) {
    return This->lpVtbl->SetSecure(This,fSecure);
}
static FORCEINLINE HRESULT IWSDHttpAddress_GetPath(IWSDHttpAddress* This,LPCWSTR *ppszPath) {
    return This->lpVtbl->GetPath(This,ppszPath);
}
static FORCEINLINE HRESULT IWSDHttpAddress_SetPath(IWSDHttpAddress* This,LPCWSTR pszPath) {
    return This->lpVtbl->SetPath(This,pszPath);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDHttpAddress_GetSecure_Proxy(
    IWSDHttpAddress* This);
void __RPC_STUB IWSDHttpAddress_GetSecure_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpAddress_SetSecure_Proxy(
    IWSDHttpAddress* This,
    WINBOOL fSecure);
void __RPC_STUB IWSDHttpAddress_SetSecure_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpAddress_GetPath_Proxy(
    IWSDHttpAddress* This,
    LPCWSTR *ppszPath);
void __RPC_STUB IWSDHttpAddress_GetPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpAddress_SetPath_Proxy(
    IWSDHttpAddress* This,
    LPCWSTR pszPath);
void __RPC_STUB IWSDHttpAddress_SetPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDHttpAddress_INTERFACE_DEFINED__ */

#if WINVER >= 0x601
/*****************************************************************************
 * IWSDSSLClientCertificate interface
 */
#ifndef __IWSDSSLClientCertificate_INTERFACE_DEFINED__
#define __IWSDSSLClientCertificate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDSSLClientCertificate, 0xde105e87, 0xa0da, 0x418e, 0x98,0xad, 0x27,0xb9,0xee,0xd8,0x7b,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("de105e87-a0da-418e-98ad-27b9eed87bdc")
IWSDSSLClientCertificate : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetClientCertificate(
        PCCERT_CONTEXT *ppCertContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMappedAccessToken(
        HANDLE *phToken) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDSSLClientCertificate, 0xde105e87, 0xa0da, 0x418e, 0x98,0xad, 0x27,0xb9,0xee,0xd8,0x7b,0xdc)
#endif
#else
typedef struct IWSDSSLClientCertificateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDSSLClientCertificate* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDSSLClientCertificate* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDSSLClientCertificate* This);

    /*** IWSDSSLClientCertificate methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClientCertificate)(
        IWSDSSLClientCertificate* This,
        PCCERT_CONTEXT *ppCertContext);

    HRESULT (STDMETHODCALLTYPE *GetMappedAccessToken)(
        IWSDSSLClientCertificate* This,
        HANDLE *phToken);

    END_INTERFACE
} IWSDSSLClientCertificateVtbl;
interface IWSDSSLClientCertificate {
    CONST_VTBL IWSDSSLClientCertificateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDSSLClientCertificate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDSSLClientCertificate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDSSLClientCertificate_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDSSLClientCertificate methods ***/
#define IWSDSSLClientCertificate_GetClientCertificate(This,ppCertContext) (This)->lpVtbl->GetClientCertificate(This,ppCertContext)
#define IWSDSSLClientCertificate_GetMappedAccessToken(This,phToken) (This)->lpVtbl->GetMappedAccessToken(This,phToken)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDSSLClientCertificate_QueryInterface(IWSDSSLClientCertificate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDSSLClientCertificate_AddRef(IWSDSSLClientCertificate* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDSSLClientCertificate_Release(IWSDSSLClientCertificate* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDSSLClientCertificate methods ***/
static FORCEINLINE HRESULT IWSDSSLClientCertificate_GetClientCertificate(IWSDSSLClientCertificate* This,PCCERT_CONTEXT *ppCertContext) {
    return This->lpVtbl->GetClientCertificate(This,ppCertContext);
}
static FORCEINLINE HRESULT IWSDSSLClientCertificate_GetMappedAccessToken(IWSDSSLClientCertificate* This,HANDLE *phToken) {
    return This->lpVtbl->GetMappedAccessToken(This,phToken);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDSSLClientCertificate_GetClientCertificate_Proxy(
    IWSDSSLClientCertificate* This,
    PCCERT_CONTEXT *ppCertContext);
void __RPC_STUB IWSDSSLClientCertificate_GetClientCertificate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDSSLClientCertificate_GetMappedAccessToken_Proxy(
    IWSDSSLClientCertificate* This,
    HANDLE *phToken);
void __RPC_STUB IWSDSSLClientCertificate_GetMappedAccessToken_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDSSLClientCertificate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDHttpAuthParameters interface
 */
#ifndef __IWSDHttpAuthParameters_INTERFACE_DEFINED__
#define __IWSDHttpAuthParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDHttpAuthParameters, 0x0b476df0, 0x8dac, 0x480d, 0xb0,0x5c, 0x99,0x78,0x1a,0x58,0x84,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0b476df0-8dac-480d-b05c-99781a5884aa")
IWSDHttpAuthParameters : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetClientAccessToken(
        HANDLE *phToken) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAuthType(
        PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDHttpAuthParameters, 0x0b476df0, 0x8dac, 0x480d, 0xb0,0x5c, 0x99,0x78,0x1a,0x58,0x84,0xaa)
#endif
#else
typedef struct IWSDHttpAuthParametersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDHttpAuthParameters* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDHttpAuthParameters* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDHttpAuthParameters* This);

    /*** IWSDHttpAuthParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClientAccessToken)(
        IWSDHttpAuthParameters* This,
        HANDLE *phToken);

    HRESULT (STDMETHODCALLTYPE *GetAuthType)(
        IWSDHttpAuthParameters* This,
        PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType);

    END_INTERFACE
} IWSDHttpAuthParametersVtbl;
interface IWSDHttpAuthParameters {
    CONST_VTBL IWSDHttpAuthParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDHttpAuthParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDHttpAuthParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDHttpAuthParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDHttpAuthParameters methods ***/
#define IWSDHttpAuthParameters_GetClientAccessToken(This,phToken) (This)->lpVtbl->GetClientAccessToken(This,phToken)
#define IWSDHttpAuthParameters_GetAuthType(This,pAuthType) (This)->lpVtbl->GetAuthType(This,pAuthType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDHttpAuthParameters_QueryInterface(IWSDHttpAuthParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDHttpAuthParameters_AddRef(IWSDHttpAuthParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDHttpAuthParameters_Release(IWSDHttpAuthParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDHttpAuthParameters methods ***/
static FORCEINLINE HRESULT IWSDHttpAuthParameters_GetClientAccessToken(IWSDHttpAuthParameters* This,HANDLE *phToken) {
    return This->lpVtbl->GetClientAccessToken(This,phToken);
}
static FORCEINLINE HRESULT IWSDHttpAuthParameters_GetAuthType(IWSDHttpAuthParameters* This,PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType) {
    return This->lpVtbl->GetAuthType(This,pAuthType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDHttpAuthParameters_GetClientAccessToken_Proxy(
    IWSDHttpAuthParameters* This,
    HANDLE *phToken);
void __RPC_STUB IWSDHttpAuthParameters_GetClientAccessToken_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDHttpAuthParameters_GetAuthType_Proxy(
    IWSDHttpAuthParameters* This,
    PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType);
void __RPC_STUB IWSDHttpAuthParameters_GetAuthType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDHttpAuthParameters_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSDSignatureProperty interface
 */
#ifndef __IWSDSignatureProperty_INTERFACE_DEFINED__
#define __IWSDSignatureProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSDSignatureProperty, 0x03ce20aa, 0x71c4, 0x45e2, 0xb3,0x2e, 0x37,0x66,0xc6,0x1c,0x79,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("03ce20aa-71c4-45e2-b32e-3766c61c790f")
IWSDSignatureProperty : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsMessageSigned(
        WINBOOL *pbSigned) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsMessageSignatureTrusted(
        WINBOOL *pbSignatureTrusted) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetKeyInfo(
        BYTE *pbKeyInfo,
        DWORD *pdwKeyInfoSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignature(
        BYTE *pbSignature,
        DWORD *pdwSignatureSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignedInfoHash(
        BYTE *pbSignedInfoHash,
        DWORD *pdwHashSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSDSignatureProperty, 0x03ce20aa, 0x71c4, 0x45e2, 0xb3,0x2e, 0x37,0x66,0xc6,0x1c,0x79,0x0f)
#endif
#else
typedef struct IWSDSignaturePropertyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSDSignatureProperty* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSDSignatureProperty* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSDSignatureProperty* This);

    /*** IWSDSignatureProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *IsMessageSigned)(
        IWSDSignatureProperty* This,
        WINBOOL *pbSigned);

    HRESULT (STDMETHODCALLTYPE *IsMessageSignatureTrusted)(
        IWSDSignatureProperty* This,
        WINBOOL *pbSignatureTrusted);

    HRESULT (STDMETHODCALLTYPE *GetKeyInfo)(
        IWSDSignatureProperty* This,
        BYTE *pbKeyInfo,
        DWORD *pdwKeyInfoSize);

    HRESULT (STDMETHODCALLTYPE *GetSignature)(
        IWSDSignatureProperty* This,
        BYTE *pbSignature,
        DWORD *pdwSignatureSize);

    HRESULT (STDMETHODCALLTYPE *GetSignedInfoHash)(
        IWSDSignatureProperty* This,
        BYTE *pbSignedInfoHash,
        DWORD *pdwHashSize);

    END_INTERFACE
} IWSDSignaturePropertyVtbl;
interface IWSDSignatureProperty {
    CONST_VTBL IWSDSignaturePropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSDSignatureProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSDSignatureProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSDSignatureProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IWSDSignatureProperty methods ***/
#define IWSDSignatureProperty_IsMessageSigned(This,pbSigned) (This)->lpVtbl->IsMessageSigned(This,pbSigned)
#define IWSDSignatureProperty_IsMessageSignatureTrusted(This,pbSignatureTrusted) (This)->lpVtbl->IsMessageSignatureTrusted(This,pbSignatureTrusted)
#define IWSDSignatureProperty_GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize) (This)->lpVtbl->GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize)
#define IWSDSignatureProperty_GetSignature(This,pbSignature,pdwSignatureSize) (This)->lpVtbl->GetSignature(This,pbSignature,pdwSignatureSize)
#define IWSDSignatureProperty_GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize) (This)->lpVtbl->GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSDSignatureProperty_QueryInterface(IWSDSignatureProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSDSignatureProperty_AddRef(IWSDSignatureProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSDSignatureProperty_Release(IWSDSignatureProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IWSDSignatureProperty methods ***/
static FORCEINLINE HRESULT IWSDSignatureProperty_IsMessageSigned(IWSDSignatureProperty* This,WINBOOL *pbSigned) {
    return This->lpVtbl->IsMessageSigned(This,pbSigned);
}
static FORCEINLINE HRESULT IWSDSignatureProperty_IsMessageSignatureTrusted(IWSDSignatureProperty* This,WINBOOL *pbSignatureTrusted) {
    return This->lpVtbl->IsMessageSignatureTrusted(This,pbSignatureTrusted);
}
static FORCEINLINE HRESULT IWSDSignatureProperty_GetKeyInfo(IWSDSignatureProperty* This,BYTE *pbKeyInfo,DWORD *pdwKeyInfoSize) {
    return This->lpVtbl->GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize);
}
static FORCEINLINE HRESULT IWSDSignatureProperty_GetSignature(IWSDSignatureProperty* This,BYTE *pbSignature,DWORD *pdwSignatureSize) {
    return This->lpVtbl->GetSignature(This,pbSignature,pdwSignatureSize);
}
static FORCEINLINE HRESULT IWSDSignatureProperty_GetSignedInfoHash(IWSDSignatureProperty* This,BYTE *pbSignedInfoHash,DWORD *pdwHashSize) {
    return This->lpVtbl->GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_IsMessageSigned_Proxy(
    IWSDSignatureProperty* This,
    WINBOOL *pbSigned);
void __RPC_STUB IWSDSignatureProperty_IsMessageSigned_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_IsMessageSignatureTrusted_Proxy(
    IWSDSignatureProperty* This,
    WINBOOL *pbSignatureTrusted);
void __RPC_STUB IWSDSignatureProperty_IsMessageSignatureTrusted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetKeyInfo_Proxy(
    IWSDSignatureProperty* This,
    BYTE *pbKeyInfo,
    DWORD *pdwKeyInfoSize);
void __RPC_STUB IWSDSignatureProperty_GetKeyInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetSignature_Proxy(
    IWSDSignatureProperty* This,
    BYTE *pbSignature,
    DWORD *pdwSignatureSize);
void __RPC_STUB IWSDSignatureProperty_GetSignature_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetSignedInfoHash_Proxy(
    IWSDSignatureProperty* This,
    BYTE *pbSignedInfoHash,
    DWORD *pdwHashSize);
void __RPC_STUB IWSDSignatureProperty_GetSignedInfoHash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSDSignatureProperty_INTERFACE_DEFINED__ */

#endif
HRESULT WINAPI WSDCreateHttpAddress(IWSDHttpAddress **ppAdress);
HRESULT WINAPI WSDCreateHttpMessageParameters(IWSDHttpMessageParameters **ppTxParams);
#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wsdbase_h__ */
