#pragma option push -b -a8 -pc -A- -w-pun /*P_O_Push*/ //+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (c) Microsoft Corporation. All rights reserved. // // File: combaseapi.h // // Contents: Base Component Object Model defintions. // //---------------------------------------------------------------------------- #include #include /* APISET_NAME: api-ms-win-core-com-l1 */ #if !defined(RC_INVOKED) #ifndef _APISET_COM_VER #ifdef _APISET_TARGET_VERSION #if _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 #include #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 //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 // 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++" { #if defined(__CODEGEARC__) && defined(__clang__) struct IUnknown; #endif template _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(*pp); // make sure everyone derives from IUnknown return reinterpret_cast(pp); } #if defined(__CODEGEARC__) template const GUID& _CG_GUID_PPT_Helper(T**) { return __uuidof(T); } #endif } #if defined(__CODEGEARC__) #define IID_PPV_ARGS(ppType) _CG_GUID_PPT_Helper(ppType), IID_PPV_ARGS_Helper(ppType) #else #define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType) #endif #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 #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 #include #include #include #ifndef INITGUID // TODO change to cguidbase.h #include #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 Application or OneCore Family #if WINAPI_PARTITION_APP && !WINAPI_PARTITION_DESKTOP __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 #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( _Pre_maybenull_ __drv_freesMem(Mem) _Post_invalid_ LPVOID pv ); #ifndef RC_INVOKED #include #endif // RC_INVOKED #endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) #pragma endregion #endif // __COMBASEAPI_H__ #pragma option pop /*P_O_Pop*/