 
//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File:       combaseapi.h
//
//  Contents:   Base Component Object Model defintions.
//
//----------------------------------------------------------------------------


#include <apiset.h>
#include <apisetcconv.h>

/* APISET_NAME: api-ms-win-core-com-l1 */
/* APISET_TAG: public */

//TODO version number should be bumped when _APISET_TARGET_VERSION_WIN10_RS2 becomes available
#if !defined(RC_INVOKED)

#ifndef _APISET_COM_VER
#ifdef _APISET_TARGET_VERSION
#if _APISET_TARGET_VERSION >= _APISET_TARGET_VERSION_WIN10_RS1
#define _APISET_COM_VER 0x0102
#elif _APISET_TARGET_VERSION >= _APISET_TARGET_VERSION_WINBLUE
#define _APISET_COM_VER 0x0101
#elif _APISET_TARGET_VERSION >= _APISET_TARGET_VERSION_WIN8
#define _APISET_COM_VER 0x0100
#endif
#endif
#endif

#endif // !defined(RC_INVOKED)


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


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


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


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


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



#if !defined(_COMBASEAPI_H_)
#define _COMBASEAPI_H_

#ifdef _MSC_VER
#pragma once
#endif  // _MSC_VER

#include <pshpack8.h>

//TODO change _OLE32_ to _COMBASEAPI_
#ifdef _OLE32_
#define WINOLEAPI        STDAPI
#define WINOLEAPI_(type) STDAPI_(type)
#else

#ifdef _68K_
#ifndef REQUIRESAPPLEPASCAL
#define WINOLEAPI        EXTERN_C DECLSPEC_IMPORT HRESULT PASCAL
#define WINOLEAPI_(type) EXTERN_C DECLSPEC_IMPORT type PASCAL
#else
#define WINOLEAPI        EXTERN_C DECLSPEC_IMPORT PASCAL HRESULT
#define WINOLEAPI_(type) EXTERN_C DECLSPEC_IMPORT PASCAL type
#endif
#else
#define WINOLEAPI        EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define WINOLEAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

#endif

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/****** Interface Declaration ***********************************************/

/*
 *      These are macros for declaring interfaces.  They exist so that
 *      a single definition of the interface is simulataneously a proper
 *      declaration of the interface structures (C++ abstract classes)
 *      for both C and C++.
 *
 *      DECLARE_INTERFACE(iface) is used to declare an interface that does
 *      not derive from a base interface.
 *      DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
 *      that does derive from a base interface.
 *
 *      By default if the source file has a .c extension the C version of
 *      the interface declaratations will be expanded; if it has a .cpp
 *      extension the C++ version will be expanded. if you want to force
 *      the C version expansion even though the source file has a .cpp
 *      extension, then define the macro "CINTERFACE".
 *      eg.     cl -DCINTERFACE file.cpp
 *
 *      Example Interface declaration:
 *
 *          #undef  INTERFACE
 *          #define INTERFACE   IClassFactory
 *
 *          DECLARE_INTERFACE_(IClassFactory, IUnknown)
 *          {
 *              // *** IUnknown methods ***
 *              STDMETHOD(QueryInterface) (THIS_
 *                                        REFIID riid,
 *                                        LPVOID FAR* ppvObj) PURE;
 *              STDMETHOD_(ULONG,AddRef) (THIS) PURE;
 *              STDMETHOD_(ULONG,Release) (THIS) PURE;
 *
 *              // *** IClassFactory methods ***
 *              STDMETHOD(CreateInstance) (THIS_
 *                                        LPUNKNOWN pUnkOuter,
 *                                        REFIID riid,
 *                                        LPVOID FAR* ppvObject) PURE;
 *          };
 *
 *      Example C++ expansion:
 *
 *          struct FAR IClassFactory : public IUnknown
 *          {
 *              virtual HRESULT STDMETHODCALLTYPE QueryInterface(
 *                                                  IID FAR& riid,
 *                                                  LPVOID FAR* ppvObj) = 0;
 *              virtual HRESULT STDMETHODCALLTYPE AddRef(void) = 0;
 *              virtual HRESULT STDMETHODCALLTYPE Release(void) = 0;
 *              virtual HRESULT STDMETHODCALLTYPE CreateInstance(
 *                                              LPUNKNOWN pUnkOuter,
 *                                              IID FAR& riid,
 *                                              LPVOID FAR* ppvObject) = 0;
 *          };
 *
 *          NOTE: Our documentation says '#define interface class' but we use
 *          'struct' instead of 'class' to keep a lot of 'public:' lines
 *          out of the interfaces.  The 'FAR' forces the 'this' pointers to
 *          be far, which is what we need.
 *
 *      Example C expansion:
 *
 *          typedef struct IClassFactory
 *          {
 *              const struct IClassFactoryVtbl FAR* lpVtbl;
 *          } IClassFactory;
 *
 *          typedef struct IClassFactoryVtbl IClassFactoryVtbl;
 *
 *          struct IClassFactoryVtbl
 *          {
 *              HRESULT (STDMETHODCALLTYPE * QueryInterface) (
 *                                                  IClassFactory FAR* This,
 *                                                  IID FAR* riid,
 *                                                  LPVOID FAR* ppvObj) ;
 *              HRESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
 *              HRESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
 *              HRESULT (STDMETHODCALLTYPE * CreateInstance) (
 *                                                  IClassFactory FAR* This,
 *                                                  LPUNKNOWN pUnkOuter,
 *                                                  IID FAR* riid,
 *                                                  LPVOID FAR* ppvObject);
 *              HRESULT (STDMETHODCALLTYPE * LockServer) (
 *                                                  IClassFactory FAR* This,
 *                                                  BOOL fLock);
 *          };
 */


#if defined(__cplusplus) && !defined(CINTERFACE)
//#define interface               struct FAR

#ifdef COM_STDMETHOD_CAN_THROW
#define COM_DECLSPEC_NOTHROW
#else
#define COM_DECLSPEC_NOTHROW DECLSPEC_NOTHROW
#endif

#define __STRUCT__ struct
#define interface __STRUCT__
#define STDMETHOD(method)        virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method
#define STDMETHOD_(type,method)  virtual COM_DECLSPEC_NOTHROW type STDMETHODCALLTYPE method
#define STDMETHODV(method)       virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODVCALLTYPE method
#define STDMETHODV_(type,method) virtual COM_DECLSPEC_NOTHROW type STDMETHODVCALLTYPE method
#define PURE                    = 0
#define THIS_
#define THIS                    void
#define DECLARE_INTERFACE(iface)                        interface DECLSPEC_NOVTABLE iface
#define DECLARE_INTERFACE_(iface, baseiface)            interface DECLSPEC_NOVTABLE iface : public baseiface
#define DECLARE_INTERFACE_IID(iface, iid)               interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface
#define DECLARE_INTERFACE_IID_(iface, baseiface, iid)   interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public baseiface

#define IFACEMETHOD(method)         __override STDMETHOD(method)
#define IFACEMETHOD_(type,method)   __override STDMETHOD_(type,method)
#define IFACEMETHODV(method)        __override STDMETHODV(method)
#define IFACEMETHODV_(type,method)  __override STDMETHODV_(type,method)


#if !defined(BEGIN_INTERFACE)

#if defined(_MPPC_) && ((defined(_MSC_VER) || defined(__SC__) || defined(__MWERKS__)) && !defined(NO_NULL_VTABLE_ENTRY))
   #define BEGIN_INTERFACE virtual void a() {}
   #define END_INTERFACE
#else
   #define BEGIN_INTERFACE
   #define END_INTERFACE
#endif
#endif

#ifndef SORTPP_PASS

// This forward declaration has been left where this type was previously defined, to preserve ordering.
extern "C++"
{
    template<typename T> _Post_equal_to_(pp) _Post_satisfies_(return == pp) void** IID_PPV_ARGS_Helper(T** pp);
}

#endif  // !SORTPP_PASS

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

#else

#define interface               struct

#define STDMETHOD(method)       HRESULT (STDMETHODCALLTYPE * method)
#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
#define STDMETHODV(method)       HRESULT (STDMETHODVCALLTYPE * method)
#define STDMETHODV_(type,method) type (STDMETHODVCALLTYPE * method)

#define IFACEMETHOD(method)         __override STDMETHOD(method)
#define IFACEMETHOD_(type,method)   __override STDMETHOD_(type,method)
#define IFACEMETHODV(method)        __override STDMETHODV(method)
#define IFACEMETHODV_(type,method)  __override STDMETHODV_(type,method)


#if !defined(BEGIN_INTERFACE)

#if defined(_MPPC_)
    #define BEGIN_INTERFACE       void    *b;
    #define END_INTERFACE
#else
    #define BEGIN_INTERFACE
    #define END_INTERFACE
#endif
#endif


#define PURE
#define THIS_                   INTERFACE FAR* This,
#define THIS                    INTERFACE FAR* This
#ifdef CONST_VTABLE
#undef CONST_VTBL
#define CONST_VTBL const
#define DECLARE_INTERFACE(iface)    typedef interface iface { \
                                    const struct iface##Vtbl FAR* lpVtbl; \
                                } iface; \
                                typedef const struct iface##Vtbl iface##Vtbl; \
                                const struct iface##Vtbl
#else
#undef CONST_VTBL
#define CONST_VTBL
#define DECLARE_INTERFACE(iface)    typedef interface iface { \
                                    struct iface##Vtbl FAR* lpVtbl; \
                                } iface; \
                                typedef struct iface##Vtbl iface##Vtbl; \
                                struct iface##Vtbl
#endif
#define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
#define DECLARE_INTERFACE_IID(iface, iid)               DECLARE_INTERFACE(iface)
#define DECLARE_INTERFACE_IID_(iface, baseiface, iid)   DECLARE_INTERFACE_(iface, baseiface)
#endif




/****** Additional basic types **********************************************/


#ifndef FARSTRUCT
#ifdef __cplusplus
#define FARSTRUCT   FAR
#else
#define FARSTRUCT
#endif  // __cplusplus
#endif  // FARSTRUCT



#ifndef HUGEP

#if defined(_WIN32) || defined(_MPPC_)
#define HUGEP
#else
#define HUGEP __huge
#endif // WIN32
#endif // HUGEP

#include <stdlib.h>

#define LISet32(li, v) ((li).HighPart = ((LONG) (v)) < 0 ? -1 : 0, (li).LowPart = (v))

#define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))






#define CLSCTX_INPROC           (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)

// With DCOM, CLSCTX_REMOTE_SERVER should be included
// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)
#define CLSCTX_ALL              (CLSCTX_INPROC_SERVER| \
                                 CLSCTX_INPROC_HANDLER| \
                                 CLSCTX_LOCAL_SERVER| \
                                 CLSCTX_REMOTE_SERVER)

#define CLSCTX_SERVER           (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER)
#else
#define CLSCTX_ALL              (CLSCTX_INPROC_SERVER| \
                                 CLSCTX_INPROC_HANDLER| \
                                 CLSCTX_LOCAL_SERVER )

#define CLSCTX_SERVER           (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)
#endif


// class registration flags; passed to CoRegisterClassObject
typedef enum tagREGCLS
{
    REGCLS_SINGLEUSE = 0,       // class object only generates one instance
    REGCLS_MULTIPLEUSE = 1,     // same class object genereates multiple inst.
                                // and local automatically goes into inproc tbl.
    REGCLS_MULTI_SEPARATE = 2,  // multiple use, but separate control over each
                                // context.
    REGCLS_SUSPENDED      = 4,  // register is as suspended, will be activated
                                // when app calls CoResumeClassObjects
    REGCLS_SURROGATE      = 8,  // must be used when a surrogate process
                                // is registering a class object that will be
                                // loaded in the surrogate

#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
    REGCLS_AGILE = 0x10,        // Class object aggregates the free-threaded marshaler
                                // and will be made visible to all inproc apartments.
                                // Can be used together with other flags - for example,
                                // REGCLS_AGILE | REGCLS_MULTIPLEUSE to register a
                                // class object that can be used multiple times from
                                // different apartments. Without other flags, behavior
                                // will retain REGCLS_SINGLEUSE semantics in that only
                                // one instance can be generated.
#endif
} REGCLS;


/* here is where we pull in the MIDL generated headers for the interfaces */
typedef interface    IRpcStubBuffer     IRpcStubBuffer;
typedef interface    IRpcChannelBuffer  IRpcChannelBuffer;

// COM initialization flags; passed to CoInitialize.
typedef enum tagCOINITBASE
{
// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)
  // These constants are only valid on Windows NT 4.0
  COINITBASE_MULTITHREADED      = 0x0,      // OLE calls objects on any thread.
#endif // DCOM
} COINITBASE;

#include <wtypesbase.h>
#include <unknwnbase.h>


#if defined(__cplusplus) && !defined(CINTERFACE)

//  IID_PPV_ARGS(ppType)
//      ppType is the variable of type IType that will be filled
//
//      RESULTS in:  IID_IType, ppvType
//      will create a compiler error if wrong level of indirection is used.
//
extern "C++"
{
    template<typename T> _Post_equal_to_(pp) _Post_satisfies_(return == pp) void** IID_PPV_ARGS_Helper(T** pp)
    {
#pragma prefast(suppress: 6269, "Tool issue with unused static_cast")
        static_cast<IUnknown*>(*pp);    // make sure everyone derives from IUnknown
        return reinterpret_cast<void**>(pp);
    }
}

#endif // defined(__cplusplus) && !defined(CINTERFACE)

#include <objidlbase.h>

#include <guiddef.h>

#ifndef INITGUID
// TODO change to cguidbase.h
#include <cguid.h>
#endif

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

/****** STD Object API Prototypes *****************************************/

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetMalloc(
    _In_ DWORD dwMemContext,
    _Outptr_ LPMALLOC FAR * ppMalloc
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CreateStreamOnHGlobal(
    HGLOBAL hGlobal,
    _In_ BOOL fDeleteOnRelease,
    _Outptr_ LPSTREAM FAR * ppstm
    );


_Check_return_ WINOLEAPI
GetHGlobalFromStream(
    _In_ LPSTREAM pstm,
    _Out_ HGLOBAL FAR * phglobal
    );


/* init/uninit */

WINOLEAPI_(void)
CoUninitialize(
    void
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI_(DWORD)
CoGetCurrentProcess(
    void
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoInitializeEx(
    _In_opt_ LPVOID pvReserved,
    _In_ DWORD dwCoInit
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI
CoGetCallerTID(
    _Out_ LPDWORD lpdwTID
    );



#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI
CoGetCurrentLogicalThreadId(
    _Out_ GUID * pguid
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif // DCOM


#if (_WIN32_WINNT >= 0x0501)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetContextToken(
    _Out_ ULONG_PTR * pToken
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetDefaultContext(
    _In_ APTTYPE aptType,
    _In_ REFIID riid,
    _Outptr_ void ** ppv
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

// definition for Win7 new APIs


#if (NTDDI_VERSION >= NTDDI_WIN7)

_Check_return_ WINOLEAPI
CoGetApartmentType(
    _Out_ APTTYPE * pAptType,
    _Out_ APTTYPEQUALIFIER * pAptQualifier
    );


#endif

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

// definition for Win8 new APIs


#if (NTDDI_VERSION >= NTDDI_WIN8)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

typedef struct tagServerInformation
{
    DWORD  dwServerPid;
    DWORD  dwServerTid;
    UINT64 ui64ServerAddress;
} ServerInformation, *PServerInformation;

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoDecodeProxy(
    _In_ DWORD dwClientPid,
    _In_ UINT64 ui64ProxyAddress,
    _Out_ PServerInformation pServerInformation
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

DECLARE_HANDLE(CO_MTA_USAGE_COOKIE);

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoIncrementMTAUsage(
    _Out_ CO_MTA_USAGE_COOKIE * pCookie
    );

               WINOLEAPI
CoDecrementMTAUsage(
    _In_ CO_MTA_USAGE_COOKIE Cookie
    );


WINOLEAPI
CoAllowUnmarshalerCLSID(
    _In_ REFCLSID clsid
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetObjectContext(
    _In_ REFIID riid,
    _Outptr_ LPVOID FAR * ppv
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

/* register/revoke/get class objects */

_Check_return_ WINOLEAPI
CoGetClassObject(
    _In_ REFCLSID rclsid,
    _In_ DWORD dwClsContext,
    _In_opt_ LPVOID pvReserved,
    _In_ REFIID riid,
    _Outptr_ LPVOID FAR * ppv
    );

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoRegisterClassObject(
    _In_ REFCLSID rclsid,
    _In_ LPUNKNOWN pUnk,
    _In_ DWORD dwClsContext,
    _In_ DWORD flags,
    _Out_ LPDWORD lpdwRegister
    );

WINOLEAPI
CoRevokeClassObject(
    _In_ DWORD dwRegister
    );

_Check_return_ WINOLEAPI
CoResumeClassObjects(
    void
    );

_Check_return_ WINOLEAPI
CoSuspendClassObjects(
    void
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI_(ULONG)
CoAddRefServerProcess(
    void
    );


WINOLEAPI_(ULONG)
CoReleaseServerProcess(
    void
    );


_Check_return_ WINOLEAPI
CoGetPSClsid(
    _In_ REFIID riid,
    _Out_ CLSID * pClsid
    );

_Check_return_ WINOLEAPI
CoRegisterPSClsid(
    _In_ REFIID riid,
    _In_ REFCLSID rclsid
    );


// Registering surrogate processes
_Check_return_ WINOLEAPI
CoRegisterSurrogate(
    _In_ LPSURROGATE pSurrogate
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/* marshaling interface pointers */

_Check_return_ WINOLEAPI
CoGetMarshalSizeMax(
    _Out_ ULONG * pulSize,
    _In_ REFIID riid,
    _In_ LPUNKNOWN pUnk,
    _In_ DWORD dwDestContext,
    _In_opt_ LPVOID pvDestContext,
    _In_ DWORD mshlflags
    );

_Check_return_ WINOLEAPI
CoMarshalInterface(
    _In_ LPSTREAM pStm,
    _In_ REFIID riid,
    _In_ LPUNKNOWN pUnk,
    _In_ DWORD dwDestContext,
    _In_opt_ LPVOID pvDestContext,
    _In_ DWORD mshlflags
    );

_Check_return_ WINOLEAPI
CoUnmarshalInterface(
    _In_ LPSTREAM pStm,
    _In_ REFIID riid,
    _COM_Outptr_ LPVOID FAR * ppv
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI
CoMarshalHresult(
    _In_ LPSTREAM pstm,
    _In_ HRESULT hresult
    );

WINOLEAPI
CoUnmarshalHresult(
    _In_ LPSTREAM pstm,
    _Out_ HRESULT FAR * phresult
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoReleaseMarshalData(
    _In_ LPSTREAM pStm
    );

_Check_return_ WINOLEAPI
CoDisconnectObject(
    _In_ LPUNKNOWN pUnk,
    _In_ DWORD dwReserved
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoLockObjectExternal(
    _In_ LPUNKNOWN pUnk,
    _In_ BOOL fLock,
    _In_ BOOL fLastUnlockReleases
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetStandardMarshal(
    _In_ REFIID riid,
    _In_ LPUNKNOWN pUnk,
    _In_ DWORD dwDestContext,
    _In_opt_ LPVOID pvDestContext,
    _In_ DWORD mshlflags,
    _Outptr_ LPMARSHAL FAR * ppMarshal
    );



#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetStdMarshalEx(
    _In_ LPUNKNOWN pUnkOuter,
    _In_ DWORD smexflags,
    _Outptr_ LPUNKNOWN FAR * ppUnkInner
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/* flags for CoGetStdMarshalEx */
typedef enum tagSTDMSHLFLAGS
{
    SMEXF_SERVER     = 0x01,       // server side aggregated std marshaler
    SMEXF_HANDLER    = 0x02        // client side (handler) agg std marshaler
} STDMSHLFLAGS;


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

WINOLEAPI_(BOOL)
CoIsHandlerConnected(
    _In_ LPUNKNOWN pUnk
    );



#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

// Apartment model inter-thread interface passing helpers
_Check_return_ WINOLEAPI
CoMarshalInterThreadInterfaceInStream(
    _In_ REFIID riid,
    _In_ LPUNKNOWN pUnk,
    _Outptr_ LPSTREAM * ppStm
    );


_Check_return_ WINOLEAPI
CoGetInterfaceAndReleaseStream(
    _In_ LPSTREAM pStm,
    _In_ REFIID iid,
    _COM_Outptr_ LPVOID FAR * ppv
    );


_Check_return_ WINOLEAPI
CoCreateFreeThreadedMarshaler(
    _In_opt_ LPUNKNOWN punkOuter,
    _Outptr_ LPUNKNOWN * ppunkMarshal
    );


WINOLEAPI_(void)
CoFreeUnusedLibraries(
    void
    );


#if (_WIN32_WINNT >= 0x0501)
WINOLEAPI_(void)
CoFreeUnusedLibrariesEx(
    _In_ DWORD dwUnloadDelay,
    _In_ DWORD dwReserved
    );

#endif

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion


#if (_WIN32_WINNT >= 0x0600)

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoDisconnectContext(
    DWORD dwTimeout
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif

// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/* Call Security. */

_Check_return_ WINOLEAPI
CoInitializeSecurity(
    _In_opt_ PSECURITY_DESCRIPTOR pSecDesc,
    _In_ LONG cAuthSvc,
    _In_reads_opt_(cAuthSvc) SOLE_AUTHENTICATION_SERVICE * asAuthSvc,
    _In_opt_ void * pReserved1,
    _In_ DWORD dwAuthnLevel,
    _In_ DWORD dwImpLevel,
    _In_opt_ void * pAuthList,
    _In_ DWORD dwCapabilities,
    _In_opt_ void * pReserved3
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetCallContext(
    _In_ REFIID riid,
    _Outptr_ void ** ppInterface
    );


_Check_return_ WINOLEAPI
CoQueryProxyBlanket(
    _In_ IUnknown * pProxy,
    _Out_opt_ DWORD * pwAuthnSvc,
    _Out_opt_ DWORD * pAuthzSvc,
    _Outptr_opt_ LPOLESTR * pServerPrincName,
    _Out_opt_ DWORD * pAuthnLevel,
    _Out_opt_ DWORD * pImpLevel,
    _Out_opt_ RPC_AUTH_IDENTITY_HANDLE * pAuthInfo,
    _Out_opt_ DWORD * pCapabilites
    );


_Check_return_ WINOLEAPI
CoSetProxyBlanket(
    _In_ IUnknown * pProxy,
    _In_ DWORD dwAuthnSvc,
    _In_ DWORD dwAuthzSvc,
    _In_opt_ OLECHAR * pServerPrincName,
    _In_ DWORD dwAuthnLevel,
    _In_ DWORD dwImpLevel,
    _In_opt_ RPC_AUTH_IDENTITY_HANDLE pAuthInfo,
    _In_ DWORD dwCapabilities
    );


_Check_return_ WINOLEAPI
CoCopyProxy(
    _In_ IUnknown * pProxy,
    _Outptr_ IUnknown ** ppCopy
    );


_Check_return_ WINOLEAPI
CoQueryClientBlanket(
    _Out_opt_ DWORD * pAuthnSvc,
    _Out_opt_ DWORD * pAuthzSvc,
    _Outptr_opt_ LPOLESTR * pServerPrincName,
    _Out_opt_ DWORD * pAuthnLevel,
    _Out_opt_ DWORD * pImpLevel,
    _Outptr_opt_result_buffer_(_Inexpressible_("depends on pAuthnSvc")) RPC_AUTHZ_HANDLE * pPrivs,
    _Inout_opt_ DWORD * pCapabilities
    );


_Check_return_ WINOLEAPI
CoImpersonateClient(
    void
    );


_Check_return_ WINOLEAPI
CoRevertToSelf(
    void
    );


_Check_return_ WINOLEAPI
CoQueryAuthenticationServices(
    _Out_ DWORD * pcAuthSvc,
    _Outptr_result_buffer_(*pcAuthSvc) SOLE_AUTHENTICATION_SERVICE ** asAuthSvc
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoSwitchCallContext(
    _In_opt_ IUnknown * pNewObject,
    _Outptr_ IUnknown ** ppOldObject
    );


#define COM_RIGHTS_EXECUTE 1
#define COM_RIGHTS_EXECUTE_LOCAL 2
#define COM_RIGHTS_EXECUTE_REMOTE 4
#define COM_RIGHTS_ACTIVATE_LOCAL 8
#define COM_RIGHTS_ACTIVATE_REMOTE 16

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion


#endif // DCOM

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

/* helper for creating instances */

_Check_return_ WINOLEAPI
CoCreateInstance(
    _In_ REFCLSID rclsid,
    _In_opt_ LPUNKNOWN pUnkOuter,
    _In_ DWORD dwClsContext,
    _In_ REFIID riid,
    _COM_Outptr_ _At_(*ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID FAR * ppv
    );



// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)

_Check_return_ WINOLEAPI
CoCreateInstanceEx(
    _In_ REFCLSID Clsid,
    _In_opt_ IUnknown * punkOuter,
    _In_ DWORD dwClsCtx,
    _In_opt_ COSERVERINFO * pServerInfo,
    _In_ DWORD dwCount,
    _Inout_updates_(dwCount) MULTI_QI * pResults
    );


#endif // DCOM


#if !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0101)

WINOLEAPI
CoRegisterActivationFilter(
    _In_ IActivationFilter * pActivationFilter
    );


#endif // !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0101)

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion


#if (_WIN32_WINNT >= 0x0602)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoCreateInstanceFromApp(
    _In_ REFCLSID Clsid,
    _In_opt_ IUnknown * punkOuter,
    _In_ DWORD dwClsCtx,
    _In_opt_ PVOID reserved,
    _In_ DWORD dwCount,
    _Inout_updates_(dwCount) MULTI_QI * pResults
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif


#pragma region Not Desktop or OneCore Family

#if WINAPI_PARTITION_APP && !(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

__inline _Check_return_ HRESULT CoCreateInstance(
    _In_     REFCLSID rclsid,
    _In_opt_ LPUNKNOWN pUnkOuter,
    _In_     DWORD dwClsContext,
    _In_     REFIID riid,
    _COM_Outptr_ _At_(*ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID FAR* ppv)
{
    MULTI_QI    OneQI;
    HRESULT     hr;

    OneQI.pItf = NULL;

#ifdef __cplusplus
    OneQI.pIID = &riid;
#else
    OneQI.pIID = riid;
#endif

    hr = CoCreateInstanceFromApp( rclsid, pUnkOuter, dwClsContext, NULL, 1, &OneQI );

#ifdef _PREFAST_
    if (SUCCEEDED(hr) && SUCCEEDED(OneQI.hr))
        _Analysis_assume_(OneQI.pItf != NULL);
    else
        _Analysis_assume_(OneQI.pItf == NULL);
#endif

    *ppv = OneQI.pItf;
    return FAILED(hr) ? hr : OneQI.hr;
}

__inline _Check_return_ HRESULT CoCreateInstanceEx(
    _In_ REFCLSID                      Clsid,
    _In_opt_ IUnknown     *            punkOuter,
    _In_ DWORD                         dwClsCtx,
    _In_opt_ COSERVERINFO *            pServerInfo,
    _In_ DWORD                         dwCount,
    _Inout_updates_(dwCount) MULTI_QI *pResults )
{
    return CoCreateInstanceFromApp(Clsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
}

#endif // WINAPI_PARTITION_APP && !(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

/* Call related APIs */
// DCOM
#if (_WIN32_WINNT >= 0x0500) || defined(_WIN32_DCOM)

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetCancelObject(
    _In_ DWORD dwThreadId,
    _In_ REFIID iid,
    _Outptr_ void ** ppUnk
    );


_Check_return_ WINOLEAPI
CoSetCancelObject(
    _In_opt_ IUnknown * pUnk
    );


_Check_return_ WINOLEAPI
CoCancelCall(
    _In_ DWORD dwThreadId,
    _In_ ULONG ulTimeout
    );


_Check_return_ WINOLEAPI
CoTestCancel(
    void
    );


_Check_return_ WINOLEAPI
CoEnableCallCancellation(
    _In_opt_ LPVOID pReserved
    );


_Check_return_ WINOLEAPI
CoDisableCallCancellation(
    _In_opt_ LPVOID pReserved
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/* other helpers */

_Check_return_ WINOLEAPI
StringFromCLSID(
    _In_ REFCLSID rclsid,
    _Outptr_ LPOLESTR FAR * lplpsz
    );

_Check_return_ WINOLEAPI
CLSIDFromString(
    _In_ LPCOLESTR lpsz,
    _Out_ LPCLSID pclsid
    );

_Check_return_ WINOLEAPI
StringFromIID(
    _In_ REFIID rclsid,
    _Outptr_ LPOLESTR FAR * lplpsz
    );

_Check_return_ WINOLEAPI
IIDFromString(
    _In_ LPCOLESTR lpsz,
    _Out_ LPIID lpiid
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
ProgIDFromCLSID(
    _In_ REFCLSID clsid,
    _Outptr_ LPOLESTR FAR * lplpszProgID
    );

_Check_return_ WINOLEAPI
CLSIDFromProgID(
    _In_ LPCOLESTR lpszProgID,
    _Out_ LPCLSID lpclsid
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI_(int)
StringFromGUID2(
    _In_ REFGUID rguid,
    _Out_writes_to_(cchMax, return) LPOLESTR lpsz,
    _In_ int cchMax
    );


_Check_return_ WINOLEAPI
CoCreateGuid(
    _Out_ GUID FAR * pguid
    );


/* Prop variant support */

typedef struct tagPROPVARIANT PROPVARIANT;

_Check_return_
WINOLEAPI
PropVariantCopy(
    _Out_ PROPVARIANT * pvarDest,
    _In_ const PROPVARIANT * pvarSrc
    );


WINOLEAPI
PropVariantClear(
    _Inout_ PROPVARIANT * pvar
    );


WINOLEAPI
FreePropVariantArray(
    _In_ ULONG cVariants,
    _Inout_updates_(cVariants) PROPVARIANT * rgvars
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif // DCOM

// DCOM
#if (_WIN32_WINNT >= 0x0400) || defined(_WIN32_DCOM)
/* Synchronization API */

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoWaitForMultipleHandles(
    _In_ DWORD dwFlags,
    _In_ DWORD dwTimeout,
    _In_ ULONG cHandles,
    _In_reads_(cHandles) LPHANDLE pHandles,
    _Out_ LPDWORD lpdwindex
    );


/* Flags for Synchronization API and Classes */

typedef enum tagCOWAIT_FLAGS
{
  COWAIT_DEFAULT = 0,
  COWAIT_WAITALL = 1,
  COWAIT_ALERTABLE = 2,
  COWAIT_INPUTAVAILABLE = 4,
  COWAIT_DISPATCH_CALLS = 8,
  COWAIT_DISPATCH_WINDOW_MESSAGES = 0x10,
}COWAIT_FLAGS;


#if (NTDDI_VERSION >= NTDDI_WIN8)

typedef enum CWMO_FLAGS
{
  CWMO_DEFAULT = 0,
  CWMO_DISPATCH_CALLS = 1,
  CWMO_DISPATCH_WINDOW_MESSAGES = 2,
} CWMO_FLAGS;

WINOLEAPI
CoWaitForMultipleObjects(
    _In_ DWORD dwFlags,
    _In_ DWORD dwTimeout,
    _In_ ULONG cHandles,
    _In_reads_(cHandles) const HANDLE * pHandles,
    _Out_ LPDWORD lpdwindex
    );


#endif // (NTDDI_VERSION >= NTDDI_WIN8)

#define CWMO_MAX_HANDLES 56

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif // DCOM

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoGetTreatAsClass(
    _In_ REFCLSID clsidOld,
    _Out_ LPCLSID pClsidNew
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

/* for flushing OLESCM remote binding handles */


#if (_WIN32_WINNT >= 0x0501)

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)

_Check_return_ WINOLEAPI
CoInvalidateRemoteMachineBindings(
    _In_ LPOLESTR pszMachineName
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif


#if (NTDDI_VERSION >= NTDDI_WINBLUE)

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

enum AgileReferenceOptions
{
    AGILEREFERENCE_DEFAULT        = 0,
    AGILEREFERENCE_DELAYEDMARSHAL = 1,
};


#if !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0101)

_Check_return_ WINOLEAPI
RoGetAgileReference(
    _In_ enum AgileReferenceOptions options,
    _In_ REFIID riid,
    _In_ IUnknown * pUnk,
    _COM_Outptr_ IAgileReference ** ppAgileReference
    );


#endif // !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0101)

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#endif

#pragma region Application or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)

/* the server dlls must define their DllGetClassObject and DllCanUnloadNow
 * to match these; the typedefs are located here to ensure all are changed at
 * the same time.
 */

typedef HRESULT (STDAPICALLTYPE * LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID *);
typedef HRESULT (STDAPICALLTYPE * LPFNCANUNLOADNOW)(void);

_Check_return_
STDAPI  DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ LPVOID FAR* ppv);

__control_entrypoint(DllExport)
STDAPI  DllCanUnloadNow(void);


/****** Default Memory Allocation ******************************************/
WINOLEAPI_(_Ret_opt_ _Post_writable_byte_size_(cb)  __drv_allocatesMem(Mem) _Check_return_ LPVOID)
CoTaskMemAlloc(
    _In_ SIZE_T cb
    );

WINOLEAPI_(_Ret_opt_ _Post_writable_byte_size_(cb)  _When_(cb > 0, __drv_allocatesMem(Mem) _Check_return_) LPVOID)
CoTaskMemRealloc(
    _Pre_maybenull_ __drv_freesMem(Mem) _Post_invalid_ LPVOID pv,
    _In_ SIZE_T cb
    );

WINOLEAPI_(void)
CoTaskMemFree(
    _Frees_ptr_opt_ LPVOID pv
    );


#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#pragma region Desktop or OneCore Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)


#if !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0102)

WINOLEAPI
CoFileTimeNow(
    _Out_ FILETIME FAR * lpFileTime
    );

_Check_return_ WINOLEAPI
CLSIDFromProgIDEx(
    _In_ LPCOLESTR lpszProgID,
    _Out_ LPCLSID lpclsid
    );


#endif // !defined(_CONTRACT_GEN) || (_APISET_COM_VER >= 0x0102)

#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion

#ifndef RC_INVOKED
#include <poppack.h>
#endif // RC_INVOKED

#endif     // __COMBASEAPI_H__
