cpp_quote("#include <winapifamily.h>")

//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File: objidlbase.idl
//
//--------------------------------------------------------------------------

cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//")
cpp_quote("//  Microsoft Windows")
cpp_quote("//  Copyright (c) Microsoft Corporation. All rights reserved.")
cpp_quote("//")
cpp_quote("//--------------------------------------------------------------------------")


cpp_quote("#if(NTDDI_VERSION >= NTDDI_VISTA && !defined(_WIN32_WINNT))")
cpp_quote("#define _WIN32_WINNT 0x0600")
cpp_quote("#endif")

cpp_quote("#if(NTDDI_VERSION >= NTDDI_WS03 && !defined(_WIN32_WINNT))")
cpp_quote("#define _WIN32_WINNT 0x0502")
cpp_quote("#endif")

cpp_quote("#if(NTDDI_VERSION >= NTDDI_WINXP && !defined(_WIN32_WINNT))")
cpp_quote("#define _WIN32_WINNT 0x0501")
cpp_quote("#endif")

cpp_quote("#if(NTDDI_VERSION >= NTDDI_WIN2K && !defined(_WIN32_WINNT))")
cpp_quote("#define _WIN32_WINNT 0x0500")
cpp_quote("#endif")

#if OLE_OBJIDL_PROXY_STUB_BUILD
#define DISABLE_CONSISTENCY_CHK ,disable_consistency_check
#else
#define DISABLE_CONSISTENCY_CHK 
#endif

#if (__midl >= 501)
midl_pragma warning( disable: 2007 )   // file already imported
midl_pragma warning( disable: 2209 )   // ignored redundantly specified attributes
midl_pragma warning( disable: 2298 )   // version ignored for object interfaces
#endif

cpp_quote("#if ( _MSC_VER >= 800 )")
cpp_quote("#if _MSC_VER >= 1200")
cpp_quote("#pragma warning(push)")
cpp_quote("#ifndef _MSC_EXTENSIONS")
cpp_quote("#pragma warning(disable:4309) /* truncation of constant value */")
cpp_quote("#endif")
cpp_quote("#pragma warning(disable:4820) /* padding added after data member */")
cpp_quote("#endif")
cpp_quote("#pragma warning(disable:4201)")
cpp_quote("#endif")
cpp_quote("#if ( _MSC_VER >= 1020 )")
cpp_quote("#pragma once")
cpp_quote("#endif")

#ifndef DO_NO_IMPORTS
import "unknwnbase.idl";
import "wtypesbase.idl";
#endif

cpp_quote("#include <limits.h>")

cpp_quote("#ifndef _OBJIDLBASE_")

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

interface IStream;
interface IEnumString;

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

interface IAsyncManager;
interface ICallFactory;
interface ISynchronize;

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

midl_pragma warning (disable: 2480)
typedef struct _COSERVERINFO
{
    DWORD             dwReserved1;
    LPWSTR            pwszName;
    COAUTHINFO *      pAuthInfo;
    DWORD             dwReserved2;
} COSERVERINFO;
midl_pragma warning (default: 2480)

/****************************************************************************
 *  Component Object Interfaces
 ****************************************************************************/

[
    local,
    object,
    uuid(00000003-0000-0000-C000-000000000046)
]

interface IMarshal : IUnknown
{

    typedef [unique] IMarshal *LPMARSHAL;

    HRESULT GetUnmarshalClass
    (
        [in, annotation("_In_")] REFIID riid,
        [in, unique, annotation("_In_opt_")] void *pv,
        [in, annotation("_In_")] DWORD dwDestContext,
        [in, unique, annotation("_Reserved_")] void *pvDestContext,
        [in, annotation("_In_")] DWORD mshlflags,
        [out, annotation("_Out_")] CLSID *pCid
    );

    HRESULT GetMarshalSizeMax
    (
        [in, annotation("_In_")] REFIID riid,
        [in, unique, annotation("_In_opt_")] void *pv,
        [in, annotation("_In_")] DWORD dwDestContext,
        [in, unique, annotation("_Reserved_")] void *pvDestContext,
        [in, annotation("_In_")] DWORD mshlflags,
        [out, annotation("_Out_")] DWORD *pSize
    );

    HRESULT MarshalInterface
    (
        [in, unique, annotation("_In_")] IStream *pStm,
        [in, annotation("_In_")] REFIID riid,
        [in, unique, annotation("_In_opt_")] void *pv,
        [in, annotation("_In_")] DWORD dwDestContext,
        [in, unique, annotation("_Reserved_")] void *pvDestContext,
        [in, annotation("_In_")] DWORD mshlflags
    );

    HRESULT UnmarshalInterface
    (
        [in, unique, annotation("_In_")] IStream *pStm,
        [in, annotation("_In_")] REFIID riid,
        [out, annotation("_Outptr_")] void **ppv
    );

    HRESULT ReleaseMarshalData
    (
        [in, unique, annotation("_In_")] IStream *pStm
    );

    HRESULT DisconnectObject
    (
        [in, annotation("_In_")] DWORD dwReserved
    );
}

// INoMarshal - marks an object that does not support being marshaled 
// or stored in the global interface table
[
    local,
    object,
    uuid(ecc8691b-c1db-4dc0-855e-65f6c551af49)
]
interface INoMarshal : IUnknown
{
}

// IAgileObject - marks an interface as agile across apartments, e.g. if it 
// aggregates the Free Threaded Marshaler.
[
    local,
    object,
    uuid(94ea2b94-e9cc-49e0-c0ff-ee64ca8f5b90)
]
interface IAgileObject : IUnknown
{
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(00000017-0000-0000-C000-000000000046)
]

interface IActivationFilter : IUnknown
{

// possible values for dwActivationType
typedef enum tagACTIVATIONTYPE { 
    ACTIVATIONTYPE_UNCATEGORIZED    = 0x0,
    ACTIVATIONTYPE_FROM_MONIKER     = 0x1,
    ACTIVATIONTYPE_FROM_DATA        = 0x2,
    ACTIVATIONTYPE_FROM_STORAGE     = 0x4,
    ACTIVATIONTYPE_FROM_STREAM      = 0x8,
    ACTIVATIONTYPE_FROM_FILE        = 0x10
} ACTIVATIONTYPE;

    HRESULT HandleActivation
    (
       [in]     DWORD     dwActivationType,
       [in]     REFCLSID  rclsid,
       [out]    CLSID    *pReplacementClsId
    );
}

[
    local,
    object,
    uuid(000001cf-0000-0000-C000-000000000046)
]

interface IMarshal2 : IMarshal
{

    typedef [unique] IMarshal2 *LPMARSHAL2;
}

[
    local,
    object,
    uuid(00000002-0000-0000-C000-000000000046)
]

interface IMalloc : IUnknown
{

    typedef [unique] IMalloc *LPMALLOC;

    void *Alloc([in, annotation("_In_")] SIZE_T cb);

    void *Realloc ([in, annotation("_In_opt_")] void *pv,
                   [in, annotation("_In_")] SIZE_T cb);

    void Free([in, annotation("_In_opt_")] void *pv);

    //[annotation("_Success_(return != SIZE_MAX)")] #pragma prefast(disable:28285 28309, "MSENG:186222")
    SIZE_T GetSize([in, annotation("_In_opt_ _Post_writable_byte_size_(return)")] void *pv);

    int DidAlloc([in, annotation("_In_opt_")] void *pv);

    void HeapMinimize(void);
}

[
    local,
    object,
    uuid(00000018-0000-0000-C000-000000000046)
]

interface IStdMarshalInfo : IUnknown
{

    typedef [unique] IStdMarshalInfo * LPSTDMARSHALINFO;

    HRESULT GetClassForHandler
    (
        [in, annotation("_In_")] DWORD dwDestContext,
        [in, unique, annotation("_Reserved_")] void *pvDestContext,
        [out, annotation("_Out_")] CLSID *pClsid
    );
}

[
    object,
    local,
    uuid(00000019-0000-0000-C000-000000000046)
]

interface IExternalConnection : IUnknown
{

    typedef [unique] IExternalConnection* LPEXTERNALCONNECTION;


    // bit flags for IExternalConnection
    typedef enum tagEXTCONN
    {
        EXTCONN_STRONG      = 0x0001,   // strong connection
        EXTCONN_WEAK        = 0x0002,   // weak connection (table, container)
        EXTCONN_CALLABLE    = 0x0004,   // table .vs. callable
    } EXTCONN;

    // *** IExternalConnection methods ***
    DWORD AddConnection
    (
        [in, annotation("_In_")] DWORD extconn,
        [in, annotation("_In_")] DWORD reserved
    );

    DWORD ReleaseConnection
    (
        [in, annotation("_In_")] DWORD extconn,
        [in, annotation("_In_")] DWORD reserved,
        [in, annotation("_In_")] BOOL  fLastReleaseCloses
    );
}


typedef [unique] IMultiQI* LPMULTIQI;

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

typedef struct tagMULTI_QI
{
    const IID  *pIID; // pass this one in
    IUnknown   *pItf; // get these out (you must set to NULL before calling)
    HRESULT     hr;
} MULTI_QI;

[
    object,
    local,
    uuid(00000020-0000-0000-C000-000000000046),
#if (__midl >= 500)
    async_uuid(000e0020-0000-0000-C000-000000000046)
#endif

]

interface IMultiQI : IUnknown
{

    HRESULT QueryMultipleInterfaces
    (
        [in, annotation("_In_")]     ULONG      cMQIs,
        [in, out, annotation("_Inout_updates_(cMQIs)")] MULTI_QI  *pMQIs
    );
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
 object,
 local,
 uuid(00000021-0000-0000-C000-000000000046)
]
interface IInternalUnknown : IUnknown
{
    HRESULT QueryInternalInterface(
           [in, annotation("_In_")]  REFIID riid,
           [out, annotation("_Outptr_")] void **ppv);
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    object,
    uuid(00000100-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface IEnumUnknown : IUnknown
{

    typedef [unique] IEnumUnknown *LPENUMUNKNOWN;

    [local]
    HRESULT Next(
        [in, annotation("_In_")] ULONG celt,
        [out, annotation("_Out_writes_to_(celt,*pceltFetched)")] IUnknown **rgelt,
        [out, annotation("_Out_opt_")] ULONG *pceltFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] IUnknown **rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumUnknown **ppenum);
}

[
    object,
    uuid(00000101-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface IEnumString : IUnknown
{

    typedef [unique] IEnumString *LPENUMSTRING;

    [local]
    HRESULT Next(
        [in] ULONG celt,
        [annotation("_Out_writes_to_(celt,*pceltFetched)")]
        LPOLESTR *rgelt,
        [annotation("_Out_opt_")] ULONG *pceltFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)]
        LPOLESTR *rgelt,
        [out] ULONG *pceltFetched);


    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumString **ppenum);
}

[
    object,
    uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface ISequentialStream : IUnknown
{
    [local]
    HRESULT Read(
        [annotation("_Out_writes_bytes_to_(cb, *pcbRead)")]
        void *pv,
        [in, annotation("_In_")] ULONG cb,
        [annotation("_Out_opt_")] ULONG *pcbRead);

    [call_as(Read)]
    HRESULT RemoteRead(
        [out, size_is(cb), length_is(*pcbRead)]
        byte *pv,
        [in] ULONG cb,
        [out] ULONG *pcbRead);

    [local]
    HRESULT Write(
        [annotation("_In_reads_bytes_(cb)")] void const *pv,
        [in, annotation("_In_")] ULONG cb,
        [annotation("_Out_opt_")] ULONG *pcbWritten);

    [call_as(Write)]
    HRESULT RemoteWrite(
        [in, size_is(cb)] byte const *pv,
        [in] ULONG cb,
        [out] ULONG *pcbWritten);
}



[
    object,
    uuid(0000000c-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface IStream : ISequentialStream
{

    typedef [unique] IStream *LPSTREAM;

    /* Storage stat buffer */

    typedef struct tagSTATSTG
    {
        LPOLESTR pwcsName;
        DWORD type;
        ULARGE_INTEGER cbSize;
        FILETIME mtime;
        FILETIME ctime;
        FILETIME atime;
        DWORD grfMode;
        DWORD grfLocksSupported;
        CLSID clsid;
        DWORD grfStateBits;
    DWORD reserved;
    } STATSTG;


    /* Storage element types */
    typedef enum tagSTGTY
    {
        STGTY_STORAGE   = 1,
        STGTY_STREAM    = 2,
        STGTY_LOCKBYTES = 3,
        STGTY_PROPERTY  = 4
    } STGTY;

    typedef enum tagSTREAM_SEEK
    {
        STREAM_SEEK_SET = 0,
        STREAM_SEEK_CUR = 1,
        STREAM_SEEK_END = 2
    } STREAM_SEEK;

    typedef enum tagLOCKTYPE
    {
        LOCK_WRITE      = 1,
        LOCK_EXCLUSIVE  = 2,
        LOCK_ONLYONCE   = 4
    } LOCKTYPE;

    [local]
    HRESULT Seek(
        [in] LARGE_INTEGER dlibMove,
        [in] DWORD dwOrigin,
        [annotation("_Out_opt_")] ULARGE_INTEGER *plibNewPosition);

    [call_as(Seek)]
    HRESULT RemoteSeek(
        [in] LARGE_INTEGER dlibMove,
        [in] DWORD dwOrigin,
        [out] ULARGE_INTEGER *plibNewPosition);

    HRESULT SetSize(
        [in] ULARGE_INTEGER libNewSize);

    [local]
    HRESULT CopyTo(
        [in, unique, annotation("_In_")] IStream *pstm,
        [in] ULARGE_INTEGER cb,
        [annotation("_Out_opt_")] ULARGE_INTEGER *pcbRead,
        [annotation("_Out_opt_")] ULARGE_INTEGER *pcbWritten);

    [call_as(CopyTo)]
    HRESULT RemoteCopyTo(
        [in, unique] IStream *pstm,
        [in] ULARGE_INTEGER cb,
        [out] ULARGE_INTEGER *pcbRead,
        [out] ULARGE_INTEGER *pcbWritten);

    HRESULT Commit(
        [in] DWORD grfCommitFlags);

    HRESULT Revert();

    HRESULT LockRegion(
        [in] ULARGE_INTEGER libOffset,
        [in] ULARGE_INTEGER cb,
        [in] DWORD dwLockType);

    HRESULT UnlockRegion(
        [in] ULARGE_INTEGER libOffset,
        [in] ULARGE_INTEGER cb,
        [in] DWORD dwLockType);

    HRESULT Stat(
        [out] STATSTG *pstatstg,
        [in] DWORD grfStatFlag);

    HRESULT Clone(
        [out] IStream **ppstm);

}


/****************************************************************************
 *  Object Remoting Interfaces
 ****************************************************************************/

[
    local,
    object,
    uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
]
interface IRpcChannelBuffer : IUnknown
{

    typedef ULONG RPCOLEDATAREP;

    typedef struct tagRPCOLEMESSAGE
    {
        void             *reserved1;
        RPCOLEDATAREP     dataRepresentation;
        void             *Buffer;
        ULONG             cbBuffer;
        ULONG             iMethod;
        void             *reserved2[5];
        ULONG             rpcFlags;
    } RPCOLEMESSAGE;

    typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;

    HRESULT GetBuffer
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMessage,
        [in, annotation("_In_")] REFIID riid
    );

    HRESULT SendReceive
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMessage,
        [out, annotation("_Out_opt_")] ULONG *pStatus
    );

    HRESULT FreeBuffer
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMessage
    );

    HRESULT GetDestCtx
    (
        [out, annotation("_Out_")] DWORD *pdwDestContext,
        [out, annotation("_Outptr_result_maybenull_")] void **ppvDestContext
    );

    HRESULT IsConnected
    (
        void
    );

}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
]
interface IRpcChannelBuffer2 : IRpcChannelBuffer
{

    HRESULT GetProtocolVersion
    (
        [out, annotation("_Out_")] DWORD *pdwVersion
    );
}

[
    local,
    object,
    uuid(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
    pointer_default(unique)
]
interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
{

    HRESULT Send(
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg,
        [in, annotation("_In_")]     ISynchronize *pSync,
        [out, annotation("_Out_")]    ULONG *pulStatus
        );

    HRESULT Receive(
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg,
        [out, annotation("_Out_")]     ULONG *pulStatus);

    HRESULT GetDestCtxEx
    (
        [in, annotation("_In_")] RPCOLEMESSAGE *pMsg,
        [out, annotation("_Out_")] DWORD *pdwDestContext,
        [out, annotation("_Outptr_opt_result_maybenull_")] void **ppvDestContext
    );

};

[
    local,
    object,
    uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
]
interface IRpcChannelBuffer3 : IRpcChannelBuffer2
{

    HRESULT Send
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg,
        [out, annotation("_Out_")]    ULONG *pulStatus
    );

    HRESULT Receive
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg,
        [in, annotation("_In_")]     ULONG ulSize,
        [out, annotation("_Out_")]    ULONG *pulStatus
    );

    HRESULT Cancel
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg
    );

    HRESULT GetCallContext
    (
        [in, annotation("_In_")]  RPCOLEMESSAGE *pMsg,
        [in, annotation("_In_")]  REFIID riid,
        [out, annotation("_Outptr_")] void **pInterface
    );

    HRESULT GetDestCtxEx
    (
        [in, annotation("_In_")] RPCOLEMESSAGE *pMsg,
        [out, annotation("_Out_")] DWORD *pdwDestContext,
        [out, annotation("_Outptr_opt_result_maybenull_")] void **ppvDestContext
    );

    HRESULT GetState
    (
        [in, annotation("_In_")]  RPCOLEMESSAGE   *pMsg,
        [out, annotation("_Out_")] DWORD           *pState
    );

    HRESULT RegisterAsync
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *pMsg,
        [in, annotation("_In_")] IAsyncManager *pAsyncMgr
    );

}

[
    local,
    object,
    uuid(58a08519-24c8-4935-b482-3fd823333a4f)
]
interface IRpcSyntaxNegotiate : IUnknown
{
    HRESULT NegotiateSyntax ( [in,out, annotation("_Inout_")] RPCOLEMESSAGE * pMsg );
}


[
    local,
    object,
    uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
]
interface IRpcProxyBuffer : IUnknown
{

    HRESULT Connect
    (
        [in, unique, annotation("_In_")] IRpcChannelBuffer *pRpcChannelBuffer
    );

    void Disconnect
    (
        void
    );

}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
]
interface IRpcStubBuffer : IUnknown
{

    HRESULT Connect
    (
        [in, annotation("_In_")] IUnknown *pUnkServer
    );

    void Disconnect();

    HRESULT Invoke
    (
        [in,out, annotation("_Inout_")] RPCOLEMESSAGE *_prpcmsg,
        [in, annotation("_In_")] IRpcChannelBuffer *_pRpcChannelBuffer
    );

    IRpcStubBuffer *IsIIDSupported
    (
        [in, annotation("_In_")] REFIID riid
    );

    ULONG CountRefs
    (
        void
    );

    HRESULT DebugServerQueryInterface
    (
        [out, annotation("_Outptr_")] void **ppv
    );

    void DebugServerRelease
    (
        [in, annotation("_In_")] void *pv
    );

}



[
    local,
    object,
    uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
]
interface IPSFactoryBuffer : IUnknown
{

    HRESULT CreateProxy
    (
        [in, annotation("_In_")] IUnknown *pUnkOuter,
        [in, annotation("_In_")] REFIID riid,
        [out, annotation("_Outptr_")] IRpcProxyBuffer **ppProxy,
        [out, annotation("_Outptr_")] void **ppv
    );

    HRESULT CreateStub
    (
        [in, annotation("_In_")] REFIID riid,
        [in, unique, annotation("_In_opt_")] IUnknown *pUnkServer,
        [out, annotation("_Outptr_")] IRpcStubBuffer **ppStub
    );
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

cpp_quote( "#if  (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM" )
cpp_quote( "// This interface is only valid on Windows NT 4.0" )

// This structure contains additional data for hooks.  As a backward
// compatability hack, the entire structure is passed in place of the
// RIID parameter on all hook methods.  Thus the IID must be the first
// parameter.  As a forward compatability hack the second field is the
// current size of the structure.
typedef struct SChannelHookCallInfo
{
    IID               iid;
    DWORD             cbSize;
    GUID              uCausality;
    DWORD             dwServerPid;
    DWORD             iMethod;
    void             *pObject;
} SChannelHookCallInfo;

[
    local,
    object,
    uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
]
interface IChannelHook : IUnknown
{
    void ClientGetSize(
        [in, annotation("_In_")]  REFGUID uExtent,
        [in, annotation("_In_")]  REFIID  riid,
        [out, annotation("_Out_")] ULONG  *pDataSize );

    void ClientFillBuffer(
        [in, annotation("_In_")]      REFGUID uExtent,
        [in, annotation("_In_")]      REFIID  riid,
        [in, out, annotation("_Inout_")] ULONG  *pDataSize,
        [in, annotation("_In_")]      void   *pDataBuffer );

    void ClientNotify(
        [in, annotation("_In_")] REFGUID uExtent,
        [in, annotation("_In_")] REFIID  riid,
        [in, annotation("_In_")] ULONG   cbDataSize,
        [in, annotation("_In_")] void   *pDataBuffer,
        [in, annotation("_In_")] DWORD   lDataRep,
        [in, annotation("_In_")] HRESULT hrFault );

    void ServerNotify(
        [in, annotation("_In_")] REFGUID uExtent,
        [in, annotation("_In_")] REFIID  riid,
        [in, annotation("_In_")] ULONG   cbDataSize,
        [in, annotation("_In_")] void   *pDataBuffer,
        [in, annotation("_In_")] DWORD   lDataRep );

    void ServerGetSize(
        [in, annotation("_In_")]  REFGUID uExtent,
        [in, annotation("_In_")]  REFIID  riid,
        [in, annotation("_In_")]  HRESULT hrFault,
        [out, annotation("_Out_")] ULONG  *pDataSize );

    void ServerFillBuffer(
        [in, annotation("_In_")]      REFGUID uExtent,
        [in, annotation("_In_")]      REFIID  riid,
        [in, out, annotation("_Inout_")] ULONG  *pDataSize,
        [in, annotation("_In_")]      void   *pDataBuffer,
        [in, annotation("_In_")]      HRESULT hrFault );
};

cpp_quote( "#endif //DCOM" )

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

cpp_quote( "#if  (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM" )
cpp_quote( "// This interface is only valid on Windows NT 4.0" )

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(0000013D-0000-0000-C000-000000000046)
]
interface IClientSecurity : IUnknown
{

    typedef struct tagSOLE_AUTHENTICATION_SERVICE
    {
        DWORD    dwAuthnSvc;
        DWORD    dwAuthzSvc;
        OLECHAR *pPrincipalName;
        HRESULT  hr;
    } SOLE_AUTHENTICATION_SERVICE;

    typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;

    typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES
    {
        EOAC_NONE             = 0x0,
        EOAC_MUTUAL_AUTH      = 0x1,
        EOAC_STATIC_CLOAKING  = 0x20,
        EOAC_DYNAMIC_CLOAKING = 0x40,
        EOAC_ANY_AUTHORITY    = 0x80,
        EOAC_MAKE_FULLSIC     = 0x100,
        EOAC_DEFAULT          = 0x800,

        // These are only valid for CoInitializeSecurity
        EOAC_SECURE_REFS       = 0x2,
        EOAC_ACCESS_CONTROL    = 0x4,
        EOAC_APPID             = 0x8,
        EOAC_DYNAMIC           = 0x10,
        EOAC_REQUIRE_FULLSIC   = 0x200,
        EOAC_AUTO_IMPERSONATE  = 0x400,
        EOAC_DISABLE_AAA       = 0x1000,
        EOAC_NO_CUSTOM_MARSHAL = 0x2000,
        EOAC_RESERVED1         = 0x4000,
    } EOLE_AUTHENTICATION_CAPABILITIES;

    const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR *)((INT_PTR) -1);
    const void    *COLE_DEFAULT_AUTHINFO  = (void *)((INT_PTR) -1);

    typedef struct tagSOLE_AUTHENTICATION_INFO
    {
        DWORD  dwAuthnSvc;
        DWORD  dwAuthzSvc;
        void  *pAuthInfo;
    } SOLE_AUTHENTICATION_INFO, *PSOLE_AUTHENTICATION_INFO;

    typedef struct tagSOLE_AUTHENTICATION_LIST
    {
        DWORD                     cAuthInfo;
        SOLE_AUTHENTICATION_INFO *aAuthInfo;
    } SOLE_AUTHENTICATION_LIST, *PSOLE_AUTHENTICATION_LIST;

    HRESULT QueryBlanket
    (
        [in, annotation("_In_")]  IUnknown                *pProxy,
        [out, annotation("_Out_")] DWORD                  *pAuthnSvc,
        [out, annotation("_Out_opt_")] DWORD              *pAuthzSvc,
        [out, annotation("__RPC__deref_out_opt")] 
              OLECHAR                **pServerPrincName,
        [out, annotation("_Out_opt_")] DWORD              *pAuthnLevel,
        [out, annotation("_Out_opt_")] DWORD              *pImpLevel,
        [out, annotation("_Outptr_result_maybenull_")] void        **pAuthInfo,
        [out, annotation("_Out_opt_")] DWORD              *pCapabilites
    );

    HRESULT SetBlanket
    (
        [in, annotation("_In_")] IUnknown                 *pProxy,
        [in, annotation("_In_")] DWORD                     dwAuthnSvc,
        [in, annotation("_In_")] DWORD                     dwAuthzSvc,
        [in, annotation("__RPC__in_opt")] 
             OLECHAR                  *pServerPrincName,
        [in, annotation("_In_")] DWORD                     dwAuthnLevel,
        [in, annotation("_In_")] DWORD                     dwImpLevel,
        [in, annotation("_In_opt_")] void                 *pAuthInfo,
        [in, annotation("_In_")] DWORD                     dwCapabilities
    );

    HRESULT CopyProxy
    (
        [in, annotation("_In_")]         IUnknown  *pProxy,
        [out, annotation("_Outptr_")] IUnknown **ppCopy
    );
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(0000013E-0000-0000-C000-000000000046)
]
interface IServerSecurity : IUnknown
{
    HRESULT QueryBlanket
    (
        [out, annotation("_Out_opt_")] DWORD         *pAuthnSvc,
        [out, annotation("_Out_opt_")] DWORD         *pAuthzSvc,
        [out, annotation("__RPC__deref_out_opt")] 
              OLECHAR **pServerPrincName,
        [out, annotation("_Out_opt_")] DWORD         *pAuthnLevel,
        [out, annotation("_Out_opt_")] DWORD         *pImpLevel,
        [out, annotation("_Outptr_result_maybenull_")] void   **pPrivs,
        [in,out, annotation("_Inout_opt_")] DWORD    *pCapabilities
    );

    HRESULT ImpersonateClient();

    HRESULT RevertToSelf();

    BOOL IsImpersonating();
}

typedef enum tagRPCOPT_PROPERTIES
{
   COMBND_RPCTIMEOUT = 0x01, // Rpc transport-specific timeout.
   COMBND_SERVER_LOCALITY = 0x02, // server locality
   COMBND_RESERVED1 = 0x04, // Reserved
   COMBND_RESERVED2 = 0x05, // Reserved
   COMBND_RESERVED3 = 0x08, // Reserved
   COMBND_RESERVED4 = 0x10, // Reserved
} RPCOPT_PROPERTIES;  

typedef enum tagRPCOPT_SERVER_LOCALITY_VALUES
{
   SERVER_LOCALITY_PROCESS_LOCAL=0,
   SERVER_LOCALITY_MACHINE_LOCAL=1,
   SERVER_LOCALITY_REMOTE=2     
} RPCOPT_SERVER_LOCALITY_VALUES;


[
object,
local,
uuid(00000144-0000-0000-C000-000000000046)
]
interface IRpcOptions : IUnknown
{
    HRESULT Set([in, annotation("_In_")] IUnknown * pPrx,
                [in, annotation("_In_")] RPCOPT_PROPERTIES dwProperty,
                [in, annotation("_In_")] ULONG_PTR dwValue);

    HRESULT Query([in, annotation("_In_")] IUnknown * pPrx,
                  [in, annotation("_In_")] RPCOPT_PROPERTIES dwProperty,
                  [out, annotation("_Out_")] ULONG_PTR * pdwValue);
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

//properties
typedef enum tagGLOBALOPT_PROPERTIES
{
   COMGLB_EXCEPTION_HANDLING = 1,  //defines COM exception handling behavior
   COMGLB_APPID = 2,   //sets the AppID for the process
   COMGLB_RPC_THREADPOOL_SETTING = 3,   // sets the ThreadPool behavior of RPC runtime in the process.
   COMGLB_RO_SETTINGS = 4,   // miscellaneous settings.
   COMGLB_UNMARSHALING_POLICY = 5,  // policy applied to CoUnmarshalInterface
   COMGLB_PROPERTIES_RESERVED1 = 6,
   COMGLB_PROPERTIES_RESERVED2 = 7,
   COMGLB_PROPERTIES_RESERVED3 = 8,
} GLOBALOPT_PROPERTIES;

//values
typedef enum tagGLOBALOPT_EH_VALUES
{
   COMGLB_EXCEPTION_HANDLE=0,
   COMGLB_EXCEPTION_DONOT_HANDLE_FATAL=1,
   COMGLB_EXCEPTION_DONOT_HANDLE=COMGLB_EXCEPTION_DONOT_HANDLE_FATAL, // Alias for compatibility
   COMGLB_EXCEPTION_DONOT_HANDLE_ANY=2
} GLOBALOPT_EH_VALUES;

//values
typedef enum tagGLOBALOPT_RPCTP_VALUES
{
   COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL = 0, // Not legal for Set.
   COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL = 1,
} GLOBALOPT_RPCTP_VALUES;

typedef enum tagGLOBALOPT_RO_FLAGS
{
   // Remove touch messages from the message queue in the STA modal loop.
   COMGLB_STA_MODALLOOP_REMOVE_TOUCH_MESSAGES = 0x1,

   // Flags that control the behavior of input message removal in
   // the STA modal loop when the thread's message queue is attached.
   COMGLB_STA_MODALLOOP_SHARED_QUEUE_REMOVE_INPUT_MESSAGES = 0x2,
   COMGLB_STA_MODALLOOP_SHARED_QUEUE_DONOT_REMOVE_INPUT_MESSAGES = 0x4,

   // Flag to opt-in to the fast rundown option.
   COMGLB_FAST_RUNDOWN = 0x8,

   // Reserved
   COMGLB_RESERVED1 = 0x10,
   COMGLB_RESERVED2 = 0x20,
   COMGLB_RESERVED3 = 0x40,

   // Flag to opt-in to pointer message re-ordering when 
   // queues are attached.
   COMGLB_STA_MODALLOOP_SHARED_QUEUE_REORDER_POINTER_MESSAGES = 0x80,

   COMGLB_RESERVED4 = 0x100,
   COMGLB_RESERVED5 = 0x200,
   COMGLB_RESERVED6 = 0x400,

} GLOBALOPT_RO_FLAGS;

typedef enum tagGLOBALOPT_UNMARSHALING_POLICY_VALUES
{
   COMGLB_UNMARSHALING_POLICY_NORMAL = 0,
   COMGLB_UNMARSHALING_POLICY_STRONG = 1,
   COMGLB_UNMARSHALING_POLICY_HYBRID = 2
} GLOBALOPT_UNMARSHALING_POLICY_VALUES;

[
    object,
    local,
    pointer_default(unique),
    uuid(0000015B-0000-0000-C000-000000000046)
]
interface IGlobalOptions : IUnknown
{
    HRESULT Set([in, annotation("_In_")] GLOBALOPT_PROPERTIES dwProperty,
                [in, annotation("_In_")] ULONG_PTR dwValue);
    HRESULT Query([in, annotation("_In_")] GLOBALOPT_PROPERTIES dwProperty,
                  [out, annotation("_Out_")] ULONG_PTR * pdwValue);
}

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

cpp_quote( "#endif //DCOM" )

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
 uuid(00000022-0000-0000-C000-000000000046),
 version(1.0),
 pointer_default(unique)
  , object
]

interface ISurrogate : IUnknown
{
    typedef [unique] ISurrogate* LPSURROGATE;

        HRESULT LoadDllServer(
                [in] REFCLSID           Clsid);
        HRESULT FreeSurrogate();
}


[
    local,
    object,
    uuid(00000146-0000-0000-C000-000000000046)
]
interface IGlobalInterfaceTable : IUnknown
{
    typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;

    HRESULT RegisterInterfaceInGlobal
    (
        [in, annotation("_In_")]  IUnknown *pUnk,
        [in, annotation("_In_")]  REFIID    riid,
        [out, annotation("_Out_")] DWORD    *pdwCookie
    );

    HRESULT RevokeInterfaceFromGlobal
    (
        [in, annotation("_In_")] DWORD      dwCookie
    );

    HRESULT GetInterfaceFromGlobal
    (
        [in, annotation("_In_")]  DWORD          dwCookie,
        [in, annotation("_In_")]  REFIID         riid,
        [out, iid_is(riid), annotation("_Outptr_")] void **ppv
    );
};

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    object,
    uuid(00000030-0000-0000-C000-000000000046)
]

interface ISynchronize : IUnknown
{
    HRESULT Wait([in] DWORD dwFlags, [in] DWORD dwMilliseconds);
    HRESULT Signal();
    HRESULT Reset();
}


[
 local,
 object,
 uuid(00000031-0000-0000-C000-000000000046)
]
interface ISynchronizeHandle : IUnknown
{
    HRESULT GetHandle([out, annotation("_Out_")] HANDLE *ph );
}


[
 local,
 object,
 uuid(00000032-0000-0000-C000-000000000046)
]
interface ISynchronizeEvent : ISynchronizeHandle
{
    HRESULT SetEventHandle([in, annotation("_In_")] HANDLE *ph );
}


[
 local,
 object,
 uuid(00000033-0000-0000-C000-000000000046)
]
interface ISynchronizeContainer : IUnknown
{

    HRESULT AddSynchronize([in, annotation("_In_")] ISynchronize *pSync);

    HRESULT WaitMultiple([in, annotation("_In_")] DWORD dwFlags,
                         [in, annotation("_In_")] DWORD dwTimeOut,
                         [out, annotation("_Outptr_")] ISynchronize **ppSync);


}

[
 local,
 object,
 uuid(00000025-0000-0000-C000-000000000046)
]
interface ISynchronizeMutex : ISynchronize
{
    HRESULT ReleaseMutex();
}



[
 local,
 object,
 uuid(00000029-0000-0000-C000-000000000046)
]

interface ICancelMethodCalls : IUnknown
{
    typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;

    HRESULT Cancel          ([in, annotation("_In_")] ULONG ulSeconds);
    HRESULT TestCancel      (void);
}

[
 local,
 object,
 uuid(0000002A-0000-0000-C000-000000000046)
]
interface IAsyncManager : IUnknown
{
    typedef enum tagDCOM_CALL_STATE
    {
        DCOM_NONE           = 0x0,
        DCOM_CALL_COMPLETE  = 0x1,
        DCOM_CALL_CANCELED  = 0x2,
    } DCOM_CALL_STATE;

    HRESULT CompleteCall  ( [in, annotation("_In_")] HRESULT Result );
    HRESULT GetCallContext( 
        [in, annotation("_In_")] REFIID riid, 
        [out, annotation("_Outptr_")] void **pInterface );
    HRESULT GetState      ( [out, annotation("_Out_")] ULONG *pulStateFlags);
}

[
 local,
 object,
 uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
 pointer_default(unique)
]
interface ICallFactory : IUnknown
{
    HRESULT CreateCall(
        [in, annotation("_In_")]     REFIID                riid,
        [in, annotation("_In_opt_")] IUnknown             *pCtrlUnk,
        [in, annotation("_In_")]     REFIID                riid2,
        [out, iid_is(riid2), annotation("_Outptr_")] IUnknown **ppv );
}

[ uuid(00000149-0000-0000-C000-000000000046),
  version(0.0),
  pointer_default(unique),
  local,
  object
]
interface IRpcHelper : IUnknown
{
    HRESULT GetDCOMProtocolVersion(
        [out, annotation("_Out_")] DWORD *pComVersion);

    HRESULT GetIIDFromOBJREF(
         [in, annotation("_In_")] void *pObjRef,
         [out, annotation("_Outptr_")] IID **piid);
}

[local,
 object,
 uuid(eb0cb9e8-7996-11d2-872e-0000f8080859),
]
interface IReleaseMarshalBuffers : IUnknown
{
    HRESULT ReleaseMarshalBuffer(
        [in,out, annotation("_Inout_")]  RPCOLEMESSAGE  *pMsg,
        [in, annotation("_In_")]  DWORD                  dwFlags,
        [in,unique, annotation("_In_opt_")] IUnknown    *pChnl);
}

[
 local,
 object,
 uuid(0000002B-0000-0000-C000-000000000046)
]
interface IWaitMultiple : IUnknown
{
    HRESULT WaitMultiple  (
        [in, annotation("_In_")] DWORD timeout, 
        [out, annotation("_Outptr_")] ISynchronize **pSync );
    HRESULT AddSynchronize( [in, annotation("_In_")] ISynchronize *pSync );
}


[
    local,
    object,
    uuid(00000147-0000-0000-C000-000000000046)
]
interface IAddrTrackingControl : IUnknown
{
    typedef [unique] IAddrTrackingControl* LPADDRTRACKINGCONTROL;

    HRESULT EnableCOMDynamicAddrTracking();
    HRESULT DisableCOMDynamicAddrTracking();
};

[
    local,
    object,
    uuid(00000148-0000-0000-C000-000000000046)
]
interface IAddrExclusionControl : IUnknown
{
    typedef [unique] IAddrExclusionControl* LPADDREXCLUSIONCONTROL;

    HRESULT GetCurrentAddrExclusionList(
        [in, annotation("_In_")]REFIID riid, 
        [out, iid_is(riid), annotation("_Outptr_")]void** ppEnumerator);
    HRESULT UpdateAddrExclusionList([in, annotation("_In_")]IUnknown* pEnumerator);
};

/****************************************************************************
* Pipe interfaces
****************************************************************************/
#if (__midl >= 500)
#define PIPE_ASYNC_UUID(async_iid) async_uuid(async_iid),
#else
#define PIPE_ASYNC_UUID(async_iid)
#endif

#define NEW_PIPE_INTERFACE(iid, async_iid, name, type)                          \
[                                                                               \
    object,                                                                     \
    uuid(iid),                                                                  \
    PIPE_ASYNC_UUID(async_iid)                                                  \
    pointer_default(unique)                                                     \
]                                                                               \
    interface IPipe##name : IUnknown                                            \
    {                                                                           \
        HRESULT Pull                                                            \
        (                                                                       \
            [out, size_is(cRequest), length_is(*pcReturned)] type *buf,         \
            [in]  ULONG  cRequest,                                         \
            [out] ULONG *pcReturned                                             \
        );                                                                      \
                                                                                \
        HRESULT Push                                                            \
        (                                                                       \
            [in, size_is(cSent)] type  *buf,                                    \
            [in] ULONG cSent                                                    \
        );                                                                      \
    }

NEW_PIPE_INTERFACE( DB2F3ACA-2F86-11d1-8E04-00C04FB9989A,
                    DB2F3ACB-2F86-11d1-8E04-00C04FB9989A,
                    Byte,
                    BYTE)
NEW_PIPE_INTERFACE( DB2F3ACC-2F86-11d1-8E04-00C04FB9989A,
                    DB2F3ACD-2F86-11d1-8E04-00C04FB9989A,
                    Long,
                    LONG)
NEW_PIPE_INTERFACE( DB2F3ACE-2F86-11d1-8E04-00C04FB9989A,
                    DB2F3ACF-2F86-11d1-8E04-00C04FB9989A,
                    Double,
                    DOUBLE)


/****************************************************************************
* Context related structures and interfaces
****************************************************************************/
cpp_quote("#if defined USE_COM_CONTEXT_DEF || defined BUILDTYPE_COMSVCS || defined _COMBASEAPI_ || defined _OLE32_")

typedef DWORD CPFLAGS;

typedef struct tagContextProperty {
    GUID policyId;
    CPFLAGS flags;
    [unique] IUnknown *pUnk;
} ContextProperty;


[
    local,
    object,
    uuid(000001c1-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IEnumContextProps : IUnknown
{
    typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS;

    HRESULT Next([in, annotation("_In_")] ULONG celt,
                 [out, size_is(celt), length_is(*pceltFetched), annotation("_Out_writes_to_(celt, *pceltFetched)")] 
                          ContextProperty *pContextProperties,
                 [out, annotation("_Out_")] ULONG *pceltFetched);
    HRESULT Skip([in, annotation("_In_")] ULONG celt);
    HRESULT Reset();
    HRESULT Clone([out, annotation("_Outptr_")] IEnumContextProps **ppEnumContextProps);
    HRESULT Count([out, annotation("_Out_")] ULONG *pcelt);
}


[
    local,
    object,
    uuid(000001c0-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IContext : IUnknown
{
    //typedef [unique] IContext *LPCONTEXT;

    HRESULT SetProperty([in, annotation("_In_")] REFGUID rpolicyId,
                        [in, annotation("_In_")] CPFLAGS flags,
                        [in, annotation("_In_")] IUnknown *pUnk);
    HRESULT RemoveProperty([in, annotation("_In_")] REFGUID rPolicyId);
    HRESULT GetProperty([in, annotation("_In_")] REFGUID rGuid,
                        [out, annotation("_Out_")] CPFLAGS *pFlags,
                        [out, annotation("_Outptr_")] IUnknown **ppUnk);
    HRESULT EnumContextProps([out, annotation("_Outptr_")] IEnumContextProps **ppEnumContextProps);
}


///////////////////////////////////////////////////////////////////////////////
//NOTE: This is the section where we define OLE  *PUBLIC ONLY* interfaces. If users need to 
//use this definition of this interface they will need to define _OBJIDL_PUBLIC in their code.
///////////////////////////////////////////////////////////////////////////////
#ifdef _OBJIDL_PUBLIC

cpp_quote("#if !defined BUILDTYPE_COMSVCS && ! (defined _COMBASEAPI_ || defined _OLE32_)")

// IObjContext interface
[
    local,
    object,
    uuid(000001c6-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IObjContext : IContext
{

	void Reserved1();
	void Reserved2();
	void Reserved3();
	void Reserved4();
	void Reserved5();
	void Reserved6();
	void Reserved7();

}

cpp_quote("#endif")

#endif

cpp_quote("#endif")

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

/****************************************************************************
* GetApartmentType  enums
****************************************************************************/
typedef enum _APTTYPEQUALIFIER
{
    APTTYPEQUALIFIER_NONE               = 0,
    APTTYPEQUALIFIER_IMPLICIT_MTA       = 1,
    APTTYPEQUALIFIER_NA_ON_MTA          = 2,
    APTTYPEQUALIFIER_NA_ON_STA          = 3,
    APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA = 4,
    APTTYPEQUALIFIER_NA_ON_MAINSTA      = 5,
    APTTYPEQUALIFIER_APPLICATION_STA    = 6,
    APTTYPEQUALIFIER_RESERVED_1         = 7,
 } APTTYPEQUALIFIER;


/****************************************************************************
* ICOMThreadingInfo and enums
****************************************************************************/
typedef enum _APTTYPE
{
    APTTYPE_CURRENT         = -1,
    APTTYPE_STA             = 0,
    APTTYPE_MTA             = 1,
    APTTYPE_NA              = 2,
    APTTYPE_MAINSTA         = 3
} APTTYPE;

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Desktop Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

typedef enum _THDTYPE
{
    THDTYPE_BLOCKMESSAGES   = 0,
    THDTYPE_PROCESSMESSAGES = 1
} THDTYPE;

typedef DWORD APARTMENTID;

[
    local,
    object,
    uuid(000001ce-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IComThreadingInfo : IUnknown
{
    HRESULT GetCurrentApartmentType( [out, annotation("_Out_")] APTTYPE* pAptType );
    HRESULT GetCurrentThreadType( [out, annotation("_Out_")] THDTYPE* pThreadType );
    HRESULT GetCurrentLogicalThreadId( [out, annotation("_Out_")] GUID* pguidLogicalThreadId );
    HRESULT SetCurrentLogicalThreadId( [in, annotation("_In_")] REFGUID rguid );
};

[
    object,
    pointer_default(unique),
    uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
]
interface IProcessInitControl : IUnknown
{
    HRESULT ResetInitializerTimeout([in] DWORD dwSecondsRemaining);
};

// marker interface for objects that want to opt into the fast rundown feature.
[
    object,
    local,
    pointer_default(unique),
    uuid(00000040-0000-0000-C000-000000000046)
]
interface IFastRundown : IUnknown
{
};


typedef enum CO_MARSHALING_CONTEXT_ATTRIBUTES
{
    CO_MARSHALING_SOURCE_IS_APP_CONTAINER = 0,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_1 = 0x80000000,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_2 = 0x80000001,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_3 = 0x80000002,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_4 = 0x80000003,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_5 = 0x80000004,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_6 = 0x80000005,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_7 = 0x80000006,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_8 = 0x80000007,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_9 = 0x80000008,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_10 = 0x80000009,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_11 = 0x8000000a,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_12 = 0x8000000b,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_13 = 0x8000000c,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_14 = 0x8000000d,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_15 = 0x8000000e,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_16 = 0x8000000f,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_17 = 0x80000010,
    CO_MARSHALING_CONTEXT_ATTRIBUTE_RESERVED_18 = 0x80000011,
} CO_MARSHALING_CONTEXT_ATTRIBUTES;

[
    local,
    object,
    uuid(D8F2F5E6-6102-4863-9F26-389A4676EFDE),
    pointer_default(unique)
]
interface IMarshalingStream : IStream
{
    HRESULT GetMarshalingContextAttribute
    (
        [in] CO_MARSHALING_CONTEXT_ATTRIBUTES attribute,
        [out] ULONG_PTR *pAttributeValue
    );
};

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

[
    local,
    object,
    uuid(C03F6A43-65A4-9818-987E-E0B810D2A6F2),
    pointer_default(unique)
]
interface IAgileReference : IUnknown
{
cpp_quote("#if defined(__cplusplus) && !defined(CINTERFACE)")
cpp_quote("    EXTERN_C const IID IID_IAgileReference;")
cpp_quote("    extern \"C++\"")
cpp_quote("    {")
cpp_quote("        MIDL_INTERFACE(\"C03F6A43-65A4-9818-987E-E0B810D2A6F2\")")
cpp_quote("        IAgileReference : public IUnknown")
cpp_quote("        {")
cpp_quote("        public:")
cpp_quote("            virtual HRESULT STDMETHODCALLTYPE Resolve( ")
cpp_quote("                /* [in] */ REFIID riid,")
cpp_quote("                /* [iid_is][retval][out] */ void **ppvObjectReference) = 0;")
cpp_quote("")
cpp_quote("            template<class Q>")
cpp_quote("            HRESULT")
cpp_quote("#ifdef _M_CEE_PURE")
cpp_quote("            __clrcall")
cpp_quote("#else")
cpp_quote("            STDMETHODCALLTYPE")
cpp_quote("#endif")
cpp_quote("            Resolve(_COM_Outptr_ Q** pp)")
cpp_quote("            {")
cpp_quote("                return Resolve(__uuidof(Q), (void **)pp);")
cpp_quote("            }")
cpp_quote("")
cpp_quote("        };")
cpp_quote("    } // extern C++")
cpp_quote("#else")
   HRESULT Resolve([in] REFIID riid, 
                   [out, retval, iid_is(riid)] void **ppvObjectReference);
};
cpp_quote("#endif")

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

#pragma region Application Family or OneCore Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)")

cpp_quote ("EXTERN_C const GUID  IID_ICallbackWithNoReentrancyToApplicationSTA;")

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */")
#pragma endregion

cpp_quote("#define _OBJIDLBASE_")
cpp_quote("#endif") //_OBJIDLBASE_

cpp_quote("#if ( _MSC_VER >= 800 )")
cpp_quote("#if _MSC_VER >= 1200")
cpp_quote("#pragma warning(pop)")
cpp_quote("#else")
cpp_quote("#pragma warning(default:4201)")
cpp_quote("#endif")
cpp_quote("#endif")
