xref: /reactos/sdk/include/psdk/objbase.h (revision 87608521)
1c2c66affSColin Finck /*
2c2c66affSColin Finck  * Copyright (C) 1998-1999 Francois Gouget
3c2c66affSColin Finck  *
4c2c66affSColin Finck  * This library is free software; you can redistribute it and/or
5c2c66affSColin Finck  * modify it under the terms of the GNU Lesser General Public
6c2c66affSColin Finck  * License as published by the Free Software Foundation; either
7c2c66affSColin Finck  * version 2.1 of the License, or (at your option) any later version.
8c2c66affSColin Finck  *
9c2c66affSColin Finck  * This library is distributed in the hope that it will be useful,
10c2c66affSColin Finck  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11c2c66affSColin Finck  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12c2c66affSColin Finck  * Lesser General Public License for more details.
13c2c66affSColin Finck  *
14c2c66affSColin Finck  * You should have received a copy of the GNU Lesser General Public
15c2c66affSColin Finck  * License along with this library; if not, write to the Free Software
16c2c66affSColin Finck  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17c2c66affSColin Finck  */
18c2c66affSColin Finck 
19c2c66affSColin Finck #include <rpc.h>
20c2c66affSColin Finck #include <rpcndr.h>
21c2c66affSColin Finck 
22c2c66affSColin Finck #ifndef _OBJBASE_H_
23c2c66affSColin Finck #define _OBJBASE_H_
24c2c66affSColin Finck 
25c2c66affSColin Finck /*****************************************************************************
26c2c66affSColin Finck  * Macros to define a COM interface
27c2c66affSColin Finck  */
28c2c66affSColin Finck /*
29c2c66affSColin Finck  * The goal of the following set of definitions is to provide a way to use the same
30c2c66affSColin Finck  * header file definitions to provide both a C interface and a C++ object oriented
31c2c66affSColin Finck  * interface to COM interfaces. The type of interface is selected automatically
32c2c66affSColin Finck  * depending on the language but it is always possible to get the C interface in C++
33c2c66affSColin Finck  * by defining CINTERFACE.
34c2c66affSColin Finck  *
35c2c66affSColin Finck  * It is based on the following assumptions:
36c2c66affSColin Finck  *  - all COM interfaces derive from IUnknown, this should not be a problem.
37c2c66affSColin Finck  *  - the header file only defines the interface, the actual fields are defined
38c2c66affSColin Finck  *    separately in the C file implementing the interface.
39c2c66affSColin Finck  *
40c2c66affSColin Finck  * The natural approach to this problem would be to make sure we get a C++ class and
41c2c66affSColin Finck  * virtual methods in C++ and a structure with a table of pointer to functions in C.
42c2c66affSColin Finck  * Unfortunately the layout of the virtual table is compiler specific, the layout of
43c2c66affSColin Finck  * g++ virtual tables is not the same as that of an egcs virtual table which is not the
44c2c66affSColin Finck  * same as that generated by Visual C++. There are workarounds to make the virtual tables
45c2c66affSColin Finck  * compatible via padding but unfortunately the one which is imposed to the WINE emulator
46c2c66affSColin Finck  * by the Windows binaries, i.e. the Visual C++ one, is the most compact of all.
47c2c66affSColin Finck  *
48c2c66affSColin Finck  * So the solution I finally adopted does not use virtual tables. Instead I use inline
49c2c66affSColin Finck  * non virtual methods that dereference the method pointer themselves and perform the call.
50c2c66affSColin Finck  *
51c2c66affSColin Finck  * Let's take Direct3D as an example:
52c2c66affSColin Finck  *
53c2c66affSColin Finck  *    #define INTERFACE IDirect3D
54c2c66affSColin Finck  *    DECLARE_INTERFACE_(IDirect3D,IUnknown)
55c2c66affSColin Finck  *    {
56c2c66affSColin Finck  *        // *** IUnknown methods *** //
57c2c66affSColin Finck  *        STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID, void**) PURE;
58c2c66affSColin Finck  *        STDMETHOD_(ULONG,AddRef)(THIS) PURE;
59c2c66affSColin Finck  *        STDMETHOD_(ULONG,Release)(THIS) PURE;
60c2c66affSColin Finck  *        // *** IDirect3D methods *** //
61c2c66affSColin Finck  *        STDMETHOD(Initialize)(THIS_ REFIID) PURE;
62c2c66affSColin Finck  *        STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE;
63c2c66affSColin Finck  *        STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT *, IUnknown *) PURE;
64c2c66affSColin Finck  *        STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL *, IUnknown *) PURE;
65c2c66affSColin Finck  *        STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT *, IUnknown *) PURE;
66c2c66affSColin Finck  *        STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE;
67c2c66affSColin Finck  *    };
68c2c66affSColin Finck  *    #undef INTERFACE
69c2c66affSColin Finck  *
70c2c66affSColin Finck  *    #ifdef COBJMACROS
71c2c66affSColin Finck  *    // *** IUnknown methods *** //
72c2c66affSColin Finck  *    #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
73c2c66affSColin Finck  *    #define IDirect3D_AddRef(p)             (p)->lpVtbl->AddRef(p)
74c2c66affSColin Finck  *    #define IDirect3D_Release(p)            (p)->lpVtbl->Release(p)
75c2c66affSColin Finck  *    // *** IDirect3D methods *** //
76c2c66affSColin Finck  *    #define IDirect3D_Initialize(p,a)       (p)->lpVtbl->Initialize(p,a)
77c2c66affSColin Finck  *    #define IDirect3D_EnumDevices(p,a,b)    (p)->lpVtbl->EnumDevice(p,a,b)
78c2c66affSColin Finck  *    #define IDirect3D_CreateLight(p,a,b)    (p)->lpVtbl->CreateLight(p,a,b)
79c2c66affSColin Finck  *    #define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b)
80c2c66affSColin Finck  *    #define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b)
81c2c66affSColin Finck  *    #define IDirect3D_FindDevice(p,a,b)     (p)->lpVtbl->FindDevice(p,a,b)
82c2c66affSColin Finck  *    #endif
83c2c66affSColin Finck  *
84c2c66affSColin Finck  * Comments:
85c2c66affSColin Finck  *  - The INTERFACE macro is used in the STDMETHOD macros to define the type of the 'this'
86c2c66affSColin Finck  *    pointer. Defining this macro here saves us the trouble of having to repeat the interface
87c2c66affSColin Finck  *    name everywhere. Note however that because of the way macros work, a macro like STDMETHOD
88c2c66affSColin Finck  *    cannot use 'INTERFACE##_VTABLE' because this would give 'INTERFACE_VTABLE' and not
89c2c66affSColin Finck  *    'IDirect3D_VTABLE'.
90c2c66affSColin Finck  *  - The DECLARE_INTERFACE declares all the structures necessary for the interface. We have to
91c2c66affSColin Finck  *    explicitly use the interface name for macro expansion reasons again. It defines the list of
92c2c66affSColin Finck  *    methods that are inheritable from this interface. It must be written manually (rather than
93c2c66affSColin Finck  *    using a macro to generate the equivalent code) to avoid macro recursion (which compilers
94c2c66affSColin Finck  *    don't like). It must start with the methods definition of the parent interface so that
95c2c66affSColin Finck  *    method inheritance works properly.
96c2c66affSColin Finck  *  - The 'undef INTERFACE' is here to remind you that using INTERFACE in the following macros
97c2c66affSColin Finck  *    will not work.
98c2c66affSColin Finck  *  - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access
99c2c66affSColin Finck  *    to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate
100c2c66affSColin Finck  *    the inherited method definitions there. This time I could have used a trick to use only one
101c2c66affSColin Finck  *    macro whatever the number of parameters but I preferred to have it work the same way as above.
102c2c66affSColin Finck  *  - You probably have noticed that we don't define the fields we need to actually implement this
103c2c66affSColin Finck  *    interface: reference count, pointer to other resources and miscellaneous fields. That's
104c2c66affSColin Finck  *    because these interfaces are just that: interfaces. They may be implemented more than once, in
105c2c66affSColin Finck  *    different contexts and sometimes not even in Wine. Thus it would not make sense to impose
106c2c66affSColin Finck  *    that the interface contains some specific fields.
107c2c66affSColin Finck  *
108c2c66affSColin Finck  *
109c2c66affSColin Finck  * In C this gives:
110c2c66affSColin Finck  *    typedef struct IDirect3DVtbl IDirect3DVtbl;
111c2c66affSColin Finck  *    struct IDirect3D {
112c2c66affSColin Finck  *        IDirect3DVtbl* lpVtbl;
113c2c66affSColin Finck  *    };
114c2c66affSColin Finck  *    struct IDirect3DVtbl {
115c2c66affSColin Finck  *        HRESULT (*QueryInterface)(IDirect3D* me, REFIID riid, LPVOID* ppvObj);
116c2c66affSColin Finck  *        ULONG (*AddRef)(IDirect3D* me);
117c2c66affSColin Finck  *        ULONG (*Release)(IDirect3D* me);
118c2c66affSColin Finck  *        HRESULT (*Initialize)(IDirect3D* me, REFIID a);
119c2c66affSColin Finck  *        HRESULT (*EnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
120c2c66affSColin Finck  *        HRESULT (*CreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
121c2c66affSColin Finck  *        HRESULT (*CreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
122c2c66affSColin Finck  *        HRESULT (*CreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
123c2c66affSColin Finck  *        HRESULT (*FindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
124c2c66affSColin Finck  *    };
125c2c66affSColin Finck  *
126c2c66affSColin Finck  *    #ifdef COBJMACROS
127c2c66affSColin Finck  *    // *** IUnknown methods *** //
128c2c66affSColin Finck  *    #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
129c2c66affSColin Finck  *    #define IDirect3D_AddRef(p)             (p)->lpVtbl->AddRef(p)
130c2c66affSColin Finck  *    #define IDirect3D_Release(p)            (p)->lpVtbl->Release(p)
131c2c66affSColin Finck  *    // *** IDirect3D methods *** //
132c2c66affSColin Finck  *    #define IDirect3D_Initialize(p,a)       (p)->lpVtbl->Initialize(p,a)
133c2c66affSColin Finck  *    #define IDirect3D_EnumDevices(p,a,b)    (p)->lpVtbl->EnumDevice(p,a,b)
134c2c66affSColin Finck  *    #define IDirect3D_CreateLight(p,a,b)    (p)->lpVtbl->CreateLight(p,a,b)
135c2c66affSColin Finck  *    #define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b)
136c2c66affSColin Finck  *    #define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b)
137c2c66affSColin Finck  *    #define IDirect3D_FindDevice(p,a,b)     (p)->lpVtbl->FindDevice(p,a,b)
138c2c66affSColin Finck  *    #endif
139c2c66affSColin Finck  *
140c2c66affSColin Finck  * Comments:
141c2c66affSColin Finck  *  - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing
142c2c66affSColin Finck  *    the user needs to know to use the interface. Of course the structure we will define to
143c2c66affSColin Finck  *    implement this interface will have more fields but the first one will match this pointer.
144c2c66affSColin Finck  *  - The code generated by DECLARE_INTERFACE defines both the structure representing the interface and
145c2c66affSColin Finck  *    the structure for the jump table.
146c2c66affSColin Finck  *  - Each method is declared as a pointer to function field in the jump table. The implementation
147c2c66affSColin Finck  *    will fill this jump table with appropriate values, probably using a static variable, and
148c2c66affSColin Finck  *    initialize the lpVtbl field to point to this variable.
149c2c66affSColin Finck  *  - The IDirect3D_Xxx macros then just derefence the lpVtbl pointer and use the function pointer
150c2c66affSColin Finck  *    corresponding to the macro name. This emulates the behavior of a virtual table and should be
151c2c66affSColin Finck  *    just as fast.
152c2c66affSColin Finck  *  - This C code should be quite compatible with the Windows headers both for code that uses COM
153c2c66affSColin Finck  *    interfaces and for code implementing a COM interface.
154c2c66affSColin Finck  *
155c2c66affSColin Finck  *
156c2c66affSColin Finck  * And in C++ (with gcc's g++):
157c2c66affSColin Finck  *
158c2c66affSColin Finck  *    typedef struct IDirect3D: public IUnknown {
159c2c66affSColin Finck  *        virtual HRESULT Initialize(REFIID a) = 0;
160c2c66affSColin Finck  *        virtual HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b) = 0;
161c2c66affSColin Finck  *        virtual HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b) = 0;
162c2c66affSColin Finck  *        virtual HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b) = 0;
163c2c66affSColin Finck  *        virtual HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b) = 0;
164c2c66affSColin Finck  *        virtual HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b) = 0;
165c2c66affSColin Finck  *    };
166c2c66affSColin Finck  *
167c2c66affSColin Finck  * Comments:
168c2c66affSColin Finck  *  - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions.
169c2c66affSColin Finck  *  - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE
170c2c66affSColin Finck  *    macro is defined in which case we would not be here.
171c2c66affSColin Finck  */
172c2c66affSColin Finck 
173c2c66affSColin Finck #if defined(__cplusplus) && !defined(CINTERFACE)
174c2c66affSColin Finck 
175c2c66affSColin Finck /* C++ interface */
176c2c66affSColin Finck 
177c2c66affSColin Finck #define STDMETHOD(method)        virtual HRESULT STDMETHODCALLTYPE method
178c2c66affSColin Finck #define STDMETHOD_(type,method)  virtual type STDMETHODCALLTYPE method
179c2c66affSColin Finck #define STDMETHODV(method)       virtual HRESULT STDMETHODVCALLTYPE method
180c2c66affSColin Finck #define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method
181c2c66affSColin Finck 
182c2c66affSColin Finck #define PURE   = 0
183c2c66affSColin Finck #define THIS_
184c2c66affSColin Finck #define THIS   void
185c2c66affSColin Finck 
186c2c66affSColin Finck #define interface struct
187c2c66affSColin Finck #define DECLARE_INTERFACE(iface)        interface DECLSPEC_NOVTABLE iface
188c2c66affSColin Finck #define DECLARE_INTERFACE_(iface,ibase) interface DECLSPEC_NOVTABLE iface : public ibase
189c2c66affSColin Finck #define DECLARE_INTERFACE_IID_(iface, ibase, iid) interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public ibase
190c2c66affSColin Finck 
191c2c66affSColin Finck #define BEGIN_INTERFACE
192c2c66affSColin Finck #define END_INTERFACE
193c2c66affSColin Finck 
194c2c66affSColin Finck #else  /* __cplusplus && !CINTERFACE */
195c2c66affSColin Finck 
196c2c66affSColin Finck /* C interface */
197c2c66affSColin Finck 
198c2c66affSColin Finck #define STDMETHOD(method)        HRESULT (STDMETHODCALLTYPE *method)
199c2c66affSColin Finck #define STDMETHOD_(type,method)  type (STDMETHODCALLTYPE *method)
200c2c66affSColin Finck #define STDMETHODV(method)       HRESULT (STDMETHODVCALLTYPE *method)
201c2c66affSColin Finck #define STDMETHODV_(type,method) type (STDMETHODVCALLTYPE *method)
202c2c66affSColin Finck 
203c2c66affSColin Finck #define PURE
204c2c66affSColin Finck #define THIS_ INTERFACE *This,
205c2c66affSColin Finck #define THIS  INTERFACE *This
206c2c66affSColin Finck 
207c2c66affSColin Finck #define interface struct
208c2c66affSColin Finck 
209c2c66affSColin Finck #ifdef __WINESRC__
210c2c66affSColin Finck #define CONST_VTABLE
211c2c66affSColin Finck #endif
212c2c66affSColin Finck 
213c2c66affSColin Finck #ifdef CONST_VTABLE
214c2c66affSColin Finck #undef CONST_VTBL
215c2c66affSColin Finck #define CONST_VTBL const
216c2c66affSColin Finck #define DECLARE_INTERFACE(iface) \
217c2c66affSColin Finck          typedef interface iface { const struct iface##Vtbl *lpVtbl; } iface; \
218c2c66affSColin Finck          typedef struct iface##Vtbl iface##Vtbl; \
219c2c66affSColin Finck          struct iface##Vtbl
220c2c66affSColin Finck #else
221c2c66affSColin Finck #undef CONST_VTBL
222c2c66affSColin Finck #define CONST_VTBL
223c2c66affSColin Finck #define DECLARE_INTERFACE(iface) \
224c2c66affSColin Finck          typedef interface iface { struct iface##Vtbl *lpVtbl; } iface; \
225c2c66affSColin Finck          typedef struct iface##Vtbl iface##Vtbl; \
226c2c66affSColin Finck          struct iface##Vtbl
227c2c66affSColin Finck #endif
228c2c66affSColin Finck #define DECLARE_INTERFACE_(iface,ibase) DECLARE_INTERFACE(iface)
229c2c66affSColin Finck #define DECLARE_INTERFACE_IID_(iface, ibase, iid) DECLARE_INTERFACE_(iface, ibase)
230c2c66affSColin Finck 
231c2c66affSColin Finck #define BEGIN_INTERFACE
232c2c66affSColin Finck #define END_INTERFACE
233c2c66affSColin Finck 
234c2c66affSColin Finck #endif  /* __cplusplus && !CINTERFACE */
235c2c66affSColin Finck 
236c2c66affSColin Finck #ifndef __IRpcStubBuffer_FWD_DEFINED__
237c2c66affSColin Finck #define __IRpcStubBuffer_FWD_DEFINED__
238c2c66affSColin Finck typedef interface IRpcStubBuffer IRpcStubBuffer;
239c2c66affSColin Finck #endif
240c2c66affSColin Finck #ifndef __IRpcChannelBuffer_FWD_DEFINED__
241c2c66affSColin Finck #define __IRpcChannelBuffer_FWD_DEFINED__
242c2c66affSColin Finck typedef interface IRpcChannelBuffer IRpcChannelBuffer;
243c2c66affSColin Finck #endif
244c2c66affSColin Finck 
245c2c66affSColin Finck #ifndef RC_INVOKED
246c2c66affSColin Finck /* For compatibility only, at least for now */
247c2c66affSColin Finck #include <stdlib.h>
248c2c66affSColin Finck #endif
249c2c66affSColin Finck 
250c2c66affSColin Finck #include <wtypes.h>
251c2c66affSColin Finck #include <unknwn.h>
252c2c66affSColin Finck #include <objidl.h>
253c2c66affSColin Finck 
254c2c66affSColin Finck #include <guiddef.h>
255c2c66affSColin Finck #ifndef INITGUID
256c2c66affSColin Finck #include <cguid.h>
257c2c66affSColin Finck #endif
258c2c66affSColin Finck 
259c2c66affSColin Finck #ifdef __cplusplus
260c2c66affSColin Finck extern "C" {
261c2c66affSColin Finck #endif
262c2c66affSColin Finck 
263c2c66affSColin Finck #ifndef NONAMELESSSTRUCT
264c2c66affSColin Finck #define LISet32(li, v)   ((li).HighPart = (v) < 0 ? -1 : 0, (li).LowPart = (v))
265c2c66affSColin Finck #define ULISet32(li, v)  ((li).HighPart = 0, (li).LowPart = (v))
266c2c66affSColin Finck #else
267c2c66affSColin Finck #define LISet32(li, v)   ((li).u.HighPart = (v) < 0 ? -1 : 0, (li).u.LowPart = (v))
268c2c66affSColin Finck #define ULISet32(li, v)  ((li).u.HighPart = 0, (li).u.LowPart = (v))
269c2c66affSColin Finck #endif
270c2c66affSColin Finck 
271c2c66affSColin Finck /*****************************************************************************
272c2c66affSColin Finck  *	Standard API
273c2c66affSColin Finck  */
274c2c66affSColin Finck DWORD WINAPI CoBuildVersion(void);
275c2c66affSColin Finck 
276c2c66affSColin Finck typedef enum tagCOINIT
277c2c66affSColin Finck {
278c2c66affSColin Finck     COINIT_APARTMENTTHREADED  = 0x2, /* Apartment model */
279c2c66affSColin Finck     COINIT_MULTITHREADED      = 0x0, /* OLE calls objects on any thread */
280c2c66affSColin Finck     COINIT_DISABLE_OLE1DDE    = 0x4, /* Don't use DDE for Ole1 support */
281c2c66affSColin Finck     COINIT_SPEED_OVER_MEMORY  = 0x8  /* Trade memory for speed */
282c2c66affSColin Finck } COINIT;
283c2c66affSColin Finck 
284c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoInitialize(_In_opt_ LPVOID lpReserved);
285c2c66affSColin Finck 
286c2c66affSColin Finck _Check_return_
287c2c66affSColin Finck HRESULT
288c2c66affSColin Finck WINAPI
289c2c66affSColin Finck CoInitializeEx(
290c2c66affSColin Finck   _In_opt_ LPVOID lpReserved,
291c2c66affSColin Finck   _In_ DWORD dwCoInit);
292c2c66affSColin Finck 
293c2c66affSColin Finck void WINAPI CoUninitialize(void);
294c2c66affSColin Finck DWORD WINAPI CoGetCurrentProcess(void);
295c2c66affSColin Finck HRESULT WINAPI CoGetCurrentLogicalThreadId(_Out_ GUID *id);
296c2c66affSColin Finck HRESULT WINAPI CoGetApartmentType(_Out_ APTTYPE *type, _Out_ APTTYPEQUALIFIER *qualifier);
297c2c66affSColin Finck 
298c2c66affSColin Finck HINSTANCE WINAPI CoLoadLibrary(_In_ LPOLESTR lpszLibName, _In_ BOOL bAutoFree);
299c2c66affSColin Finck void WINAPI CoFreeAllLibraries(void);
300c2c66affSColin Finck void WINAPI CoFreeLibrary(_In_ HINSTANCE hLibrary);
301c2c66affSColin Finck void WINAPI CoFreeUnusedLibraries(void);
302c2c66affSColin Finck 
303c2c66affSColin Finck void
304c2c66affSColin Finck WINAPI
305c2c66affSColin Finck CoFreeUnusedLibrariesEx(
306c2c66affSColin Finck   _In_ DWORD dwUnloadDelay,
307c2c66affSColin Finck   _In_ DWORD dwReserved);
308c2c66affSColin Finck 
309c2c66affSColin Finck _Check_return_
310c2c66affSColin Finck HRESULT
311c2c66affSColin Finck WINAPI
312c2c66affSColin Finck CoCreateInstance(
313c2c66affSColin Finck   _In_ REFCLSID rclsid,
314c2c66affSColin Finck   _In_opt_ LPUNKNOWN pUnkOuter,
315c2c66affSColin Finck   _In_ DWORD dwClsContext,
316c2c66affSColin Finck   _In_ REFIID iid,
317c2c66affSColin Finck   _Outptr_ _At_(*ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID *ppv);
318c2c66affSColin Finck 
319c2c66affSColin Finck _Check_return_
320c2c66affSColin Finck HRESULT
321c2c66affSColin Finck WINAPI
322c2c66affSColin Finck CoCreateInstanceEx(
323c2c66affSColin Finck   _In_ REFCLSID rclsid,
324c2c66affSColin Finck   _In_opt_ LPUNKNOWN pUnkOuter,
325c2c66affSColin Finck   _In_ DWORD dwClsContext,
326c2c66affSColin Finck   _In_opt_ COSERVERINFO *pServerInfo,
327c2c66affSColin Finck   _In_ ULONG cmq,
328c2c66affSColin Finck   _Inout_updates_(cmq) MULTI_QI *pResults);
329c2c66affSColin Finck 
330c2c66affSColin Finck _Check_return_
331c2c66affSColin Finck HRESULT
332c2c66affSColin Finck WINAPI
333c2c66affSColin Finck CoGetInstanceFromFile(
334c2c66affSColin Finck   _In_opt_ COSERVERINFO *pServerInfo,
335c2c66affSColin Finck   _In_opt_ CLSID *pClsid,
336c2c66affSColin Finck   _In_opt_ IUnknown *punkOuter,
337c2c66affSColin Finck   _In_ DWORD dwClsCtx,
338c2c66affSColin Finck   _In_ DWORD grfMode,
339c2c66affSColin Finck   _In_ _Null_terminated_ OLECHAR *pwszName,
340c2c66affSColin Finck   _In_ DWORD dwCount,
341c2c66affSColin Finck   _Inout_updates_(dwCount) MULTI_QI *pResults);
342c2c66affSColin Finck 
343c2c66affSColin Finck _Check_return_
344c2c66affSColin Finck HRESULT
345c2c66affSColin Finck WINAPI
346c2c66affSColin Finck CoGetInstanceFromIStorage(
347c2c66affSColin Finck   _In_opt_ COSERVERINFO *pServerInfo,
348c2c66affSColin Finck   _In_opt_ CLSID *pClsid,
349c2c66affSColin Finck   _In_opt_ IUnknown *punkOuter,
350c2c66affSColin Finck   _In_ DWORD dwClsCtx,
351c2c66affSColin Finck   _In_ IStorage *pstg,
352c2c66affSColin Finck   _In_ DWORD dwCount,
353c2c66affSColin Finck   _Inout_updates_(dwCount) MULTI_QI *pResults);
354c2c66affSColin Finck 
355c2c66affSColin Finck _Check_return_
356c2c66affSColin Finck HRESULT
357c2c66affSColin Finck WINAPI
358c2c66affSColin Finck CoGetMalloc(
359c2c66affSColin Finck   _In_ DWORD dwMemContext,
360c2c66affSColin Finck   _Outptr_ LPMALLOC *lpMalloc);
361c2c66affSColin Finck 
362c2c66affSColin Finck _Ret_opt_
363c2c66affSColin Finck _Post_writable_byte_size_(size)
364c2c66affSColin Finck __drv_allocatesMem(Mem)
365c2c66affSColin Finck _Check_return_
366c2c66affSColin Finck LPVOID
367c2c66affSColin Finck WINAPI
368c2c66affSColin Finck CoTaskMemAlloc(_In_ SIZE_T size) __WINE_ALLOC_SIZE(1);
369c2c66affSColin Finck 
370c2c66affSColin Finck void
371c2c66affSColin Finck WINAPI
372c2c66affSColin Finck CoTaskMemFree(
373c2c66affSColin Finck   _In_opt_ __drv_freesMem(Mem) _Post_invalid_ LPVOID ptr);
374c2c66affSColin Finck 
375c2c66affSColin Finck _Ret_opt_
376c2c66affSColin Finck _Post_writable_byte_size_(size)
377c2c66affSColin Finck _When_(size > 0, __drv_allocatesMem(Mem) _Check_return_)
378c2c66affSColin Finck LPVOID
379c2c66affSColin Finck WINAPI
380c2c66affSColin Finck CoTaskMemRealloc(
381c2c66affSColin Finck   _In_opt_ __drv_freesMem(Mem) _Post_invalid_ LPVOID ptr,
382c2c66affSColin Finck   _In_ SIZE_T size);
383c2c66affSColin Finck 
384c2c66affSColin Finck HRESULT WINAPI CoRegisterMallocSpy(_In_ LPMALLOCSPY pMallocSpy);
385c2c66affSColin Finck HRESULT WINAPI CoRevokeMallocSpy(void);
386c2c66affSColin Finck 
387c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoGetContextToken(_Out_ ULONG_PTR *token);
388c2c66affSColin Finck 
389c2c66affSColin Finck /* class registration flags; passed to CoRegisterClassObject */
390c2c66affSColin Finck typedef enum tagREGCLS
391c2c66affSColin Finck {
392c2c66affSColin Finck     REGCLS_SINGLEUSE = 0,
393c2c66affSColin Finck     REGCLS_MULTIPLEUSE = 1,
394c2c66affSColin Finck     REGCLS_MULTI_SEPARATE = 2,
395c2c66affSColin Finck     REGCLS_SUSPENDED = 4,
396c2c66affSColin Finck     REGCLS_SURROGATE = 8
397c2c66affSColin Finck } REGCLS;
398c2c66affSColin Finck 
399c2c66affSColin Finck _Check_return_
400c2c66affSColin Finck HRESULT
401c2c66affSColin Finck WINAPI
402c2c66affSColin Finck CoGetClassObject(
403c2c66affSColin Finck   _In_ REFCLSID rclsid,
404c2c66affSColin Finck   _In_ DWORD dwClsContext,
405c2c66affSColin Finck   _In_opt_ COSERVERINFO *pServerInfo,
406c2c66affSColin Finck   _In_ REFIID iid,
407c2c66affSColin Finck   _Outptr_ LPVOID *ppv);
408c2c66affSColin Finck 
409c2c66affSColin Finck _Check_return_
410c2c66affSColin Finck HRESULT
411c2c66affSColin Finck WINAPI
412c2c66affSColin Finck CoRegisterClassObject(
413c2c66affSColin Finck   _In_ REFCLSID rclsid,
414c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
415c2c66affSColin Finck   _In_ DWORD dwClsContext,
416c2c66affSColin Finck   _In_ DWORD flags,
417c2c66affSColin Finck   _Out_ LPDWORD lpdwRegister);
418c2c66affSColin Finck 
419c2c66affSColin Finck _Check_return_
420c2c66affSColin Finck HRESULT
421c2c66affSColin Finck WINAPI
422c2c66affSColin Finck CoRevokeClassObject(
423c2c66affSColin Finck   _In_ DWORD dwRegister);
424c2c66affSColin Finck 
425c2c66affSColin Finck _Check_return_
426c2c66affSColin Finck HRESULT
427c2c66affSColin Finck WINAPI
428c2c66affSColin Finck CoGetPSClsid(
429c2c66affSColin Finck   _In_ REFIID riid,
430c2c66affSColin Finck   _Out_ CLSID *pclsid);
431c2c66affSColin Finck 
432c2c66affSColin Finck _Check_return_
433c2c66affSColin Finck HRESULT
434c2c66affSColin Finck WINAPI
435c2c66affSColin Finck CoRegisterPSClsid(
436c2c66affSColin Finck   _In_ REFIID riid,
437c2c66affSColin Finck   _In_ REFCLSID rclsid);
438c2c66affSColin Finck 
439c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoRegisterSurrogate(_In_ LPSURROGATE pSurrogate);
440c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoSuspendClassObjects(void);
441c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoResumeClassObjects(void);
442c2c66affSColin Finck ULONG WINAPI CoAddRefServerProcess(void);
443c2c66affSColin Finck ULONG WINAPI CoReleaseServerProcess(void);
444c2c66affSColin Finck 
445c2c66affSColin Finck /* marshalling */
446c2c66affSColin Finck 
447c2c66affSColin Finck _Check_return_
448c2c66affSColin Finck HRESULT
449c2c66affSColin Finck WINAPI
450c2c66affSColin Finck CoCreateFreeThreadedMarshaler(
451c2c66affSColin Finck   _In_opt_ LPUNKNOWN punkOuter,
452c2c66affSColin Finck   _Outptr_ LPUNKNOWN *ppunkMarshal);
453c2c66affSColin Finck 
454c2c66affSColin Finck _Check_return_
455c2c66affSColin Finck HRESULT
456c2c66affSColin Finck WINAPI
457c2c66affSColin Finck CoGetInterfaceAndReleaseStream(
458c2c66affSColin Finck   _In_ LPSTREAM pStm,
459c2c66affSColin Finck   _In_ REFIID iid,
460c2c66affSColin Finck   _Outptr_ LPVOID *ppv);
461c2c66affSColin Finck 
462c2c66affSColin Finck _Check_return_
463c2c66affSColin Finck HRESULT
464c2c66affSColin Finck WINAPI
465c2c66affSColin Finck CoGetMarshalSizeMax(
466c2c66affSColin Finck   _Out_ ULONG *pulSize,
467c2c66affSColin Finck   _In_ REFIID riid,
468c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
469c2c66affSColin Finck   _In_ DWORD dwDestContext,
470c2c66affSColin Finck   _In_opt_ LPVOID pvDestContext,
471c2c66affSColin Finck   _In_ DWORD mshlflags);
472c2c66affSColin Finck 
473c2c66affSColin Finck _Check_return_
474c2c66affSColin Finck HRESULT
475c2c66affSColin Finck WINAPI
476c2c66affSColin Finck CoGetStandardMarshal(
477c2c66affSColin Finck   _In_ REFIID riid,
478c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
479c2c66affSColin Finck   _In_ DWORD dwDestContext,
480c2c66affSColin Finck   _In_opt_ LPVOID pvDestContext,
481c2c66affSColin Finck   _In_ DWORD mshlflags,
482c2c66affSColin Finck   _Outptr_ LPMARSHAL *ppMarshal);
483c2c66affSColin Finck 
484c2c66affSColin Finck HRESULT WINAPI CoMarshalHresult(_In_ LPSTREAM pstm, _In_ HRESULT hresult);
485c2c66affSColin Finck 
486c2c66affSColin Finck _Check_return_
487c2c66affSColin Finck HRESULT
488c2c66affSColin Finck WINAPI
489c2c66affSColin Finck CoMarshalInterface(
490c2c66affSColin Finck   _In_ LPSTREAM pStm,
491c2c66affSColin Finck   _In_ REFIID riid,
492c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
493c2c66affSColin Finck   _In_ DWORD dwDestContext,
494c2c66affSColin Finck   _In_opt_ LPVOID pvDestContext,
495c2c66affSColin Finck   _In_ DWORD mshlflags);
496c2c66affSColin Finck 
497c2c66affSColin Finck _Check_return_
498c2c66affSColin Finck HRESULT
499c2c66affSColin Finck WINAPI
500c2c66affSColin Finck CoMarshalInterThreadInterfaceInStream(
501c2c66affSColin Finck   _In_ REFIID riid,
502c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
503c2c66affSColin Finck   _Outptr_ LPSTREAM *ppStm);
504c2c66affSColin Finck 
505c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoReleaseMarshalData(_In_ LPSTREAM pStm);
506c2c66affSColin Finck 
507c2c66affSColin Finck _Check_return_
508c2c66affSColin Finck HRESULT
509c2c66affSColin Finck WINAPI
510c2c66affSColin Finck CoDisconnectObject(
511c2c66affSColin Finck   _In_ LPUNKNOWN lpUnk,
512c2c66affSColin Finck   _In_ DWORD reserved);
513c2c66affSColin Finck 
514c2c66affSColin Finck HRESULT WINAPI CoUnmarshalHresult(_In_ LPSTREAM pstm, _Out_ HRESULT *phresult);
515c2c66affSColin Finck 
516c2c66affSColin Finck _Check_return_
517c2c66affSColin Finck HRESULT
518c2c66affSColin Finck WINAPI
519c2c66affSColin Finck CoUnmarshalInterface(
520c2c66affSColin Finck   _In_ LPSTREAM pStm,
521c2c66affSColin Finck   _In_ REFIID riid,
522c2c66affSColin Finck   _Outptr_ LPVOID *ppv);
523c2c66affSColin Finck 
524c2c66affSColin Finck _Check_return_
525c2c66affSColin Finck HRESULT
526c2c66affSColin Finck WINAPI
527c2c66affSColin Finck CoLockObjectExternal(
528c2c66affSColin Finck   _In_ LPUNKNOWN pUnk,
529c2c66affSColin Finck   _In_ BOOL fLock,
530c2c66affSColin Finck   _In_ BOOL fLastUnlockReleases);
531c2c66affSColin Finck 
532c2c66affSColin Finck BOOL WINAPI CoIsHandlerConnected(_In_ LPUNKNOWN pUnk);
533c2c66affSColin Finck 
534c2c66affSColin Finck /* security */
535c2c66affSColin Finck 
536c2c66affSColin Finck _Check_return_
537c2c66affSColin Finck HRESULT
538c2c66affSColin Finck WINAPI
539c2c66affSColin Finck CoInitializeSecurity(
540c2c66affSColin Finck   _In_opt_ PSECURITY_DESCRIPTOR pSecDesc,
541c2c66affSColin Finck   _In_ LONG cAuthSvc,
542c2c66affSColin Finck   _In_reads_opt_(cAuthSvc) SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
543c2c66affSColin Finck   _In_opt_ void *pReserved1,
544c2c66affSColin Finck   _In_ DWORD dwAuthnLevel,
545c2c66affSColin Finck   _In_ DWORD dwImpLevel,
546c2c66affSColin Finck   _In_opt_ void *pReserved2,
547c2c66affSColin Finck   _In_ DWORD dwCapabilities,
548c2c66affSColin Finck   _In_opt_ void *pReserved3);
549c2c66affSColin Finck 
550c2c66affSColin Finck _Check_return_
551c2c66affSColin Finck HRESULT
552c2c66affSColin Finck WINAPI
553c2c66affSColin Finck CoGetCallContext(
554c2c66affSColin Finck   _In_ REFIID riid,
555c2c66affSColin Finck   _Outptr_ void **ppInterface);
556c2c66affSColin Finck 
557c2c66affSColin Finck _Check_return_
558c2c66affSColin Finck HRESULT
559c2c66affSColin Finck WINAPI
560c2c66affSColin Finck CoSwitchCallContext(
561c2c66affSColin Finck   _In_opt_ IUnknown *pContext,
562c2c66affSColin Finck   _Outptr_ IUnknown **ppOldContext);
563c2c66affSColin Finck 
564c2c66affSColin Finck _Check_return_
565c2c66affSColin Finck HRESULT
566c2c66affSColin Finck WINAPI
567c2c66affSColin Finck CoQueryAuthenticationServices(
568c2c66affSColin Finck   _Out_ DWORD *pcAuthSvc,
569c2c66affSColin Finck   _Outptr_result_buffer_(*pcAuthSvc) SOLE_AUTHENTICATION_SERVICE **asAuthSvc);
570c2c66affSColin Finck 
571c2c66affSColin Finck _Check_return_
572c2c66affSColin Finck HRESULT
573c2c66affSColin Finck WINAPI
574c2c66affSColin Finck CoQueryProxyBlanket(
575c2c66affSColin Finck   _In_ IUnknown *pProxy,
576c2c66affSColin Finck   _Out_opt_ DWORD *pwAuthnSvc,
577c2c66affSColin Finck   _Out_opt_ DWORD *pAuthzSvc,
578c2c66affSColin Finck   _Outptr_opt_ OLECHAR **pServerPrincName,
579c2c66affSColin Finck   _Out_opt_ DWORD *pAuthnLevel,
580c2c66affSColin Finck   _Out_opt_ DWORD *pImpLevel,
581c2c66affSColin Finck   _Out_opt_ RPC_AUTH_IDENTITY_HANDLE *pAuthInfo,
582c2c66affSColin Finck   _Out_opt_ DWORD *pCapabilities);
583c2c66affSColin Finck 
584c2c66affSColin Finck _Check_return_
585c2c66affSColin Finck HRESULT
586c2c66affSColin Finck WINAPI
587c2c66affSColin Finck CoSetProxyBlanket(
588c2c66affSColin Finck   _In_ IUnknown *pProxy,
589c2c66affSColin Finck   _In_ DWORD dwAuthnSvc,
590c2c66affSColin Finck   _In_ DWORD dwAuthzSvc,
591c2c66affSColin Finck   _In_opt_ OLECHAR *pServerPrincName,
592c2c66affSColin Finck   _In_ DWORD dwAuthnLevel,
593c2c66affSColin Finck   _In_ DWORD dwImpLevel,
594c2c66affSColin Finck   _In_opt_ RPC_AUTH_IDENTITY_HANDLE pAuthInfo,
595c2c66affSColin Finck   _In_ DWORD dwCapabilities);
596c2c66affSColin Finck 
597c2c66affSColin Finck _Check_return_
598c2c66affSColin Finck HRESULT
599c2c66affSColin Finck WINAPI CoCopyProxy(
600c2c66affSColin Finck   _In_ IUnknown *pProxy,
601c2c66affSColin Finck   _Outptr_ IUnknown **ppCopy);
602c2c66affSColin Finck 
603c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoImpersonateClient(void);
604c2c66affSColin Finck 
605c2c66affSColin Finck _Check_return_
606c2c66affSColin Finck HRESULT
607c2c66affSColin Finck WINAPI
608c2c66affSColin Finck CoQueryClientBlanket(
609c2c66affSColin Finck   _Out_opt_ DWORD *pAuthnSvc,
610c2c66affSColin Finck   _Out_opt_ DWORD *pAuthzSvc,
611c2c66affSColin Finck   _Outptr_opt_ OLECHAR **pServerPrincName,
612c2c66affSColin Finck   _Out_opt_ DWORD *pAuthnLevel,
613c2c66affSColin Finck   _Out_opt_ DWORD *pImpLevel,
614c2c66affSColin Finck   _Outptr_opt_ RPC_AUTHZ_HANDLE *pPrivs,
615c2c66affSColin Finck   _Inout_opt_ DWORD *pCapabilities);
616c2c66affSColin Finck 
617c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoRevertToSelf(void);
618c2c66affSColin Finck 
619c2c66affSColin Finck /* misc */
620c2c66affSColin Finck 
621c2c66affSColin Finck _Check_return_
622c2c66affSColin Finck HRESULT
623c2c66affSColin Finck WINAPI
624c2c66affSColin Finck CoGetTreatAsClass(
625c2c66affSColin Finck   _In_ REFCLSID clsidOld,
626c2c66affSColin Finck   _Out_ LPCLSID pClsidNew);
627c2c66affSColin Finck 
628c2c66affSColin Finck _Check_return_
629c2c66affSColin Finck HRESULT
630c2c66affSColin Finck WINAPI
631c2c66affSColin Finck CoTreatAsClass(
632c2c66affSColin Finck   _In_ REFCLSID clsidOld,
633c2c66affSColin Finck   _In_ REFCLSID clsidNew);
634c2c66affSColin Finck 
635c2c66affSColin Finck HRESULT
636c2c66affSColin Finck WINAPI
637c2c66affSColin Finck CoAllowSetForegroundWindow(
638c2c66affSColin Finck   _In_ IUnknown *pUnk,
639c2c66affSColin Finck   _In_opt_ LPVOID lpvReserved);
640c2c66affSColin Finck 
641c2c66affSColin Finck _Check_return_
642c2c66affSColin Finck HRESULT
643c2c66affSColin Finck WINAPI
644c2c66affSColin Finck CoGetObjectContext(
645c2c66affSColin Finck   _In_ REFIID riid,
646c2c66affSColin Finck   _Outptr_ LPVOID *ppv);
647c2c66affSColin Finck 
648c2c66affSColin Finck _Check_return_
649c2c66affSColin Finck HRESULT
650c2c66affSColin Finck WINAPI
651c2c66affSColin Finck CoRegisterInitializeSpy(
652c2c66affSColin Finck   _In_ IInitializeSpy *spy,
653c2c66affSColin Finck   _Out_ ULARGE_INTEGER *cookie);
654c2c66affSColin Finck 
655c2c66affSColin Finck _Check_return_
656c2c66affSColin Finck HRESULT
657c2c66affSColin Finck WINAPI
658c2c66affSColin Finck CoRevokeInitializeSpy(
659c2c66affSColin Finck   _In_ ULARGE_INTEGER cookie);
660c2c66affSColin Finck 
661c2c66affSColin Finck _Check_return_ HRESULT WINAPI CoCreateGuid(_Out_ GUID *pguid);
662c2c66affSColin Finck BOOL WINAPI CoIsOle1Class(_In_ REFCLSID rclsid);
663c2c66affSColin Finck 
664c2c66affSColin Finck BOOL
665c2c66affSColin Finck WINAPI
666c2c66affSColin Finck CoDosDateTimeToFileTime(
667c2c66affSColin Finck   _In_ WORD nDosDate,
668c2c66affSColin Finck   _In_ WORD nDosTime,
669c2c66affSColin Finck   _Out_ FILETIME *lpFileTime);
670c2c66affSColin Finck 
671c2c66affSColin Finck BOOL
672c2c66affSColin Finck WINAPI
673c2c66affSColin Finck CoFileTimeToDosDateTime(
674c2c66affSColin Finck   _In_ FILETIME *lpFileTime,
675c2c66affSColin Finck   _Out_ WORD *lpDosDate,
676c2c66affSColin Finck   _Out_ WORD *lpDosTime);
677c2c66affSColin Finck 
678c2c66affSColin Finck HRESULT WINAPI CoFileTimeNow(_Out_ FILETIME *lpFileTime);
679c2c66affSColin Finck 
680c2c66affSColin Finck _Check_return_
681c2c66affSColin Finck HRESULT
682c2c66affSColin Finck WINAPI
683c2c66affSColin Finck CoRegisterMessageFilter(
684c2c66affSColin Finck   _In_opt_ LPMESSAGEFILTER lpMessageFilter,
685c2c66affSColin Finck   _Outptr_opt_result_maybenull_ LPMESSAGEFILTER *lplpMessageFilter);
686c2c66affSColin Finck 
687c2c66affSColin Finck HRESULT
688c2c66affSColin Finck WINAPI
689c2c66affSColin Finck CoRegisterChannelHook(
690c2c66affSColin Finck   _In_ REFGUID ExtensionGuid,
691c2c66affSColin Finck   _In_ IChannelHook *pChannelHook);
692c2c66affSColin Finck 
693c2c66affSColin Finck typedef enum tagCOWAIT_FLAGS
694c2c66affSColin Finck {
695*87608521SMark Jansen     COWAIT_DEFAULT        = 0x00000000,
696c2c66affSColin Finck     COWAIT_WAITALL        = 0x00000001,
697c2c66affSColin Finck     COWAIT_ALERTABLE      = 0x00000002,
698c2c66affSColin Finck     COWAIT_INPUTAVAILABLE = 0x00000004
699c2c66affSColin Finck } COWAIT_FLAGS;
700c2c66affSColin Finck 
701c2c66affSColin Finck _Check_return_
702c2c66affSColin Finck HRESULT
703c2c66affSColin Finck WINAPI
704c2c66affSColin Finck CoWaitForMultipleHandles(
705c2c66affSColin Finck   _In_ DWORD dwFlags,
706c2c66affSColin Finck   _In_ DWORD dwTimeout,
707c2c66affSColin Finck   _In_ ULONG cHandles,
708c2c66affSColin Finck   _In_reads_(cHandles) LPHANDLE pHandles,
709c2c66affSColin Finck   _Out_ LPDWORD lpdwindex);
710c2c66affSColin Finck 
711c2c66affSColin Finck /*****************************************************************************
712c2c66affSColin Finck  *	GUID API
713c2c66affSColin Finck  */
714c2c66affSColin Finck 
715c2c66affSColin Finck _Check_return_
716c2c66affSColin Finck HRESULT
717c2c66affSColin Finck WINAPI
718c2c66affSColin Finck StringFromCLSID(
719c2c66affSColin Finck   _In_ REFCLSID id,
720c2c66affSColin Finck   _Outptr_ LPOLESTR*);
721c2c66affSColin Finck 
722c2c66affSColin Finck _Check_return_
723c2c66affSColin Finck HRESULT
724c2c66affSColin Finck WINAPI
725c2c66affSColin Finck CLSIDFromString(
726c2c66affSColin Finck   _In_ LPCOLESTR,
727c2c66affSColin Finck   _Out_ LPCLSID);
728c2c66affSColin Finck 
729c2c66affSColin Finck _Check_return_
730c2c66affSColin Finck HRESULT
731c2c66affSColin Finck WINAPI
732c2c66affSColin Finck CLSIDFromProgID(
733c2c66affSColin Finck   _In_ LPCOLESTR progid,
734c2c66affSColin Finck   _Out_ LPCLSID riid);
735c2c66affSColin Finck 
736c2c66affSColin Finck _Check_return_
737c2c66affSColin Finck HRESULT
738c2c66affSColin Finck WINAPI
739c2c66affSColin Finck ProgIDFromCLSID(
740c2c66affSColin Finck   _In_ REFCLSID clsid,
741c2c66affSColin Finck   _Outptr_ LPOLESTR *lplpszProgID);
742c2c66affSColin Finck 
743c2c66affSColin Finck _Check_return_
744c2c66affSColin Finck INT
745c2c66affSColin Finck WINAPI
746c2c66affSColin Finck StringFromGUID2(
747c2c66affSColin Finck   _In_ REFGUID id,
748c2c66affSColin Finck   _Out_writes_to_(cmax, return) LPOLESTR str,
749c2c66affSColin Finck   _In_ INT cmax);
750c2c66affSColin Finck 
751c2c66affSColin Finck _Check_return_
752c2c66affSColin Finck HRESULT
753c2c66affSColin Finck WINAPI
754c2c66affSColin Finck IIDFromString(
755c2c66affSColin Finck   _In_ LPCOLESTR lpsz,
756c2c66affSColin Finck   _Out_ LPIID lpiid);
757c2c66affSColin Finck 
758c2c66affSColin Finck /*****************************************************************************
759c2c66affSColin Finck  *	COM Server dll - exports
760c2c66affSColin Finck  */
761c2c66affSColin Finck 
762c2c66affSColin Finck _Check_return_
763c2c66affSColin Finck HRESULT
764c2c66affSColin Finck WINAPI
765c2c66affSColin Finck DllGetClassObject(
766c2c66affSColin Finck   _In_ REFCLSID rclsid,
767c2c66affSColin Finck   _In_ REFIID riid,
768c2c66affSColin Finck   _Outptr_ LPVOID *ppv) DECLSPEC_HIDDEN;
769c2c66affSColin Finck 
770c2c66affSColin Finck HRESULT WINAPI DllCanUnloadNow(void) DECLSPEC_HIDDEN;
771c2c66affSColin Finck 
772c2c66affSColin Finck /* shouldn't be here, but is nice for type checking */
773c2c66affSColin Finck #ifdef __WINESRC__
774c2c66affSColin Finck HRESULT WINAPI DllRegisterServer(void) DECLSPEC_HIDDEN;
775c2c66affSColin Finck HRESULT WINAPI DllUnregisterServer(void) DECLSPEC_HIDDEN;
776c2c66affSColin Finck #endif
777c2c66affSColin Finck 
778c2c66affSColin Finck 
779c2c66affSColin Finck /*****************************************************************************
780c2c66affSColin Finck  *	Data Object
781c2c66affSColin Finck  */
782c2c66affSColin Finck 
783c2c66affSColin Finck HRESULT
784c2c66affSColin Finck WINAPI
785c2c66affSColin Finck CreateDataAdviseHolder(
786c2c66affSColin Finck   _Outptr_ LPDATAADVISEHOLDER *ppDAHolder);
787c2c66affSColin Finck 
788c2c66affSColin Finck HRESULT
789c2c66affSColin Finck WINAPI
790c2c66affSColin Finck CreateDataCache(
791c2c66affSColin Finck   _In_opt_ LPUNKNOWN pUnkOuter,
792c2c66affSColin Finck   _In_ REFCLSID rclsid,
793c2c66affSColin Finck   _In_ REFIID iid,
794c2c66affSColin Finck   _Out_ LPVOID *ppv);
795c2c66affSColin Finck 
796c2c66affSColin Finck /*****************************************************************************
797c2c66affSColin Finck  *	Moniker API
798c2c66affSColin Finck  */
799c2c66affSColin Finck 
800c2c66affSColin Finck _Check_return_
801c2c66affSColin Finck HRESULT
802c2c66affSColin Finck WINAPI
803c2c66affSColin Finck BindMoniker(
804c2c66affSColin Finck   _In_ LPMONIKER pmk,
805c2c66affSColin Finck   _In_ DWORD grfOpt,
806c2c66affSColin Finck   _In_ REFIID iidResult,
807c2c66affSColin Finck   _Outptr_ LPVOID *ppvResult);
808c2c66affSColin Finck 
809c2c66affSColin Finck _Check_return_
810c2c66affSColin Finck HRESULT
811c2c66affSColin Finck WINAPI
812c2c66affSColin Finck CoGetObject(
813c2c66affSColin Finck   _In_ LPCWSTR pszName,
814c2c66affSColin Finck   _In_opt_ BIND_OPTS *pBindOptions,
815c2c66affSColin Finck   _In_ REFIID riid,
816c2c66affSColin Finck   _Outptr_ void **ppv);
817c2c66affSColin Finck 
818c2c66affSColin Finck _Check_return_ HRESULT WINAPI CreateAntiMoniker(_Outptr_ LPMONIKER *ppmk);
819c2c66affSColin Finck 
820c2c66affSColin Finck _Check_return_
821c2c66affSColin Finck HRESULT
822c2c66affSColin Finck WINAPI
823c2c66affSColin Finck CreateBindCtx(
824c2c66affSColin Finck   _In_ DWORD reserved,
825c2c66affSColin Finck   _Outptr_ LPBC *ppbc);
826c2c66affSColin Finck 
827c2c66affSColin Finck _Check_return_
828c2c66affSColin Finck HRESULT
829c2c66affSColin Finck WINAPI
830c2c66affSColin Finck CreateClassMoniker(
831c2c66affSColin Finck   _In_ REFCLSID rclsid,
832c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
833c2c66affSColin Finck 
834c2c66affSColin Finck _Check_return_
835c2c66affSColin Finck HRESULT
836c2c66affSColin Finck WINAPI
837c2c66affSColin Finck CreateFileMoniker(
838c2c66affSColin Finck   _In_ LPCOLESTR lpszPathName,
839c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
840c2c66affSColin Finck 
841c2c66affSColin Finck _Check_return_
842c2c66affSColin Finck HRESULT
843c2c66affSColin Finck WINAPI
844c2c66affSColin Finck CreateGenericComposite(
845c2c66affSColin Finck   _In_opt_ LPMONIKER pmkFirst,
846c2c66affSColin Finck   _In_opt_ LPMONIKER pmkRest,
847c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmkComposite);
848c2c66affSColin Finck 
849c2c66affSColin Finck _Check_return_
850c2c66affSColin Finck HRESULT
851c2c66affSColin Finck WINAPI
852c2c66affSColin Finck CreateItemMoniker(
853c2c66affSColin Finck   _In_ LPCOLESTR lpszDelim,
854c2c66affSColin Finck   _In_ LPCOLESTR lpszItem,
855c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
856c2c66affSColin Finck 
857c2c66affSColin Finck _Check_return_
858c2c66affSColin Finck HRESULT
859c2c66affSColin Finck WINAPI
860c2c66affSColin Finck CreateObjrefMoniker(
861c2c66affSColin Finck   _In_opt_ LPUNKNOWN punk,
862c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
863c2c66affSColin Finck 
864c2c66affSColin Finck _Check_return_
865c2c66affSColin Finck HRESULT
866c2c66affSColin Finck WINAPI
867c2c66affSColin Finck CreatePointerMoniker(
868c2c66affSColin Finck   _In_opt_ LPUNKNOWN punk,
869c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
870c2c66affSColin Finck 
871c2c66affSColin Finck _Check_return_
872c2c66affSColin Finck HRESULT
873c2c66affSColin Finck WINAPI
874c2c66affSColin Finck GetClassFile(
875c2c66affSColin Finck   _In_ LPCOLESTR filePathName,
876c2c66affSColin Finck   _Out_ CLSID *pclsid);
877c2c66affSColin Finck 
878c2c66affSColin Finck _Check_return_
879c2c66affSColin Finck HRESULT
880c2c66affSColin Finck WINAPI
881c2c66affSColin Finck GetRunningObjectTable(
882c2c66affSColin Finck   _In_ DWORD reserved,
883c2c66affSColin Finck   _Outptr_ LPRUNNINGOBJECTTABLE *pprot);
884c2c66affSColin Finck 
885c2c66affSColin Finck _Check_return_
886c2c66affSColin Finck HRESULT
887c2c66affSColin Finck WINAPI
888c2c66affSColin Finck MkParseDisplayName(
889c2c66affSColin Finck   _In_ LPBC pbc,
890c2c66affSColin Finck   _In_ LPCOLESTR szUserName,
891c2c66affSColin Finck   _Out_ ULONG *pchEaten,
892c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmk);
893c2c66affSColin Finck 
894c2c66affSColin Finck _Check_return_
895c2c66affSColin Finck HRESULT
896c2c66affSColin Finck WINAPI
897c2c66affSColin Finck MonikerCommonPrefixWith(
898c2c66affSColin Finck   _In_ IMoniker *pmkThis,
899c2c66affSColin Finck   _In_ IMoniker *pmkOther,
900c2c66affSColin Finck   _Outptr_ IMoniker **ppmkCommon);
901c2c66affSColin Finck 
902c2c66affSColin Finck _Check_return_
903c2c66affSColin Finck HRESULT
904c2c66affSColin Finck WINAPI
905c2c66affSColin Finck MonikerRelativePathTo(
906c2c66affSColin Finck   _In_ LPMONIKER pmkSrc,
907c2c66affSColin Finck   _In_ LPMONIKER pmkDest,
908c2c66affSColin Finck   _Outptr_ LPMONIKER *ppmkRelPath,
909c2c66affSColin Finck   _In_ BOOL dwReserved);
910c2c66affSColin Finck 
911c2c66affSColin Finck /*****************************************************************************
912c2c66affSColin Finck  *	Storage API
913c2c66affSColin Finck  */
914c2c66affSColin Finck #define STGM_DIRECT		0x00000000
915c2c66affSColin Finck #define STGM_TRANSACTED		0x00010000
916c2c66affSColin Finck #define STGM_SIMPLE		0x08000000
917c2c66affSColin Finck #define STGM_READ		0x00000000
918c2c66affSColin Finck #define STGM_WRITE		0x00000001
919c2c66affSColin Finck #define STGM_READWRITE		0x00000002
920c2c66affSColin Finck #define STGM_SHARE_DENY_NONE	0x00000040
921c2c66affSColin Finck #define STGM_SHARE_DENY_READ	0x00000030
922c2c66affSColin Finck #define STGM_SHARE_DENY_WRITE	0x00000020
923c2c66affSColin Finck #define STGM_SHARE_EXCLUSIVE	0x00000010
924c2c66affSColin Finck #define STGM_PRIORITY		0x00040000
925c2c66affSColin Finck #define STGM_DELETEONRELEASE	0x04000000
926c2c66affSColin Finck #define STGM_CREATE		0x00001000
927c2c66affSColin Finck #define STGM_CONVERT		0x00020000
928c2c66affSColin Finck #define STGM_FAILIFTHERE	0x00000000
929c2c66affSColin Finck #define STGM_NOSCRATCH		0x00100000
930c2c66affSColin Finck #define STGM_NOSNAPSHOT		0x00200000
931c2c66affSColin Finck #define STGM_DIRECT_SWMR	0x00400000
932c2c66affSColin Finck 
933c2c66affSColin Finck #define STGFMT_STORAGE		0
934c2c66affSColin Finck #define STGFMT_FILE 		3
935c2c66affSColin Finck #define STGFMT_ANY 		4
936c2c66affSColin Finck #define STGFMT_DOCFILE 	5
937c2c66affSColin Finck 
938c2c66affSColin Finck typedef struct tagSTGOPTIONS
939c2c66affSColin Finck {
940c2c66affSColin Finck     USHORT usVersion;
941c2c66affSColin Finck     USHORT reserved;
942c2c66affSColin Finck     ULONG ulSectorSize;
943c2c66affSColin Finck     const WCHAR* pwcsTemplateFile;
944c2c66affSColin Finck } STGOPTIONS;
945c2c66affSColin Finck 
946c2c66affSColin Finck _Check_return_
947c2c66affSColin Finck HRESULT
948c2c66affSColin Finck WINAPI
949c2c66affSColin Finck StringFromIID(
950c2c66affSColin Finck   _In_ REFIID rclsid,
951c2c66affSColin Finck   _Outptr_ LPOLESTR *lplpsz);
952c2c66affSColin Finck 
953c2c66affSColin Finck _Check_return_
954c2c66affSColin Finck HRESULT
955c2c66affSColin Finck WINAPI
956c2c66affSColin Finck StgCreateDocfile(
957c2c66affSColin Finck   _In_opt_ _Null_terminated_ LPCOLESTR pwcsName,
958c2c66affSColin Finck   _In_ DWORD grfMode,
959c2c66affSColin Finck   _Reserved_ DWORD reserved,
960c2c66affSColin Finck   _Outptr_ IStorage **ppstgOpen);
961c2c66affSColin Finck 
962c2c66affSColin Finck _Check_return_
963c2c66affSColin Finck HRESULT
964c2c66affSColin Finck WINAPI
965c2c66affSColin Finck StgCreateStorageEx(
966c2c66affSColin Finck   _In_opt_ _Null_terminated_ const WCHAR*,
967c2c66affSColin Finck   _In_ DWORD,
968c2c66affSColin Finck   _In_ DWORD,
969c2c66affSColin Finck   _In_ DWORD,
970c2c66affSColin Finck   _Inout_opt_ STGOPTIONS*,
971c2c66affSColin Finck   _In_opt_ void*,
972c2c66affSColin Finck   _In_ REFIID,
973c2c66affSColin Finck   _Outptr_ void**);
974c2c66affSColin Finck 
975c2c66affSColin Finck _Check_return_
976c2c66affSColin Finck HRESULT
977c2c66affSColin Finck WINAPI
978c2c66affSColin Finck StgIsStorageFile(
979c2c66affSColin Finck   _In_ _Null_terminated_ LPCOLESTR fn);
980c2c66affSColin Finck 
981c2c66affSColin Finck _Check_return_
982c2c66affSColin Finck HRESULT
983c2c66affSColin Finck WINAPI
984c2c66affSColin Finck StgIsStorageILockBytes(
985c2c66affSColin Finck   _In_ ILockBytes *plkbyt);
986c2c66affSColin Finck 
987c2c66affSColin Finck _Check_return_
988c2c66affSColin Finck HRESULT
989c2c66affSColin Finck WINAPI
990c2c66affSColin Finck StgOpenStorage(
991c2c66affSColin Finck   _In_opt_ _Null_terminated_ const OLECHAR *pwcsName,
992c2c66affSColin Finck   _In_opt_ IStorage *pstgPriority,
993c2c66affSColin Finck   _In_ DWORD grfMode,
994c2c66affSColin Finck   _In_opt_z_ SNB snbExclude,
995c2c66affSColin Finck   _In_ DWORD reserved,
996c2c66affSColin Finck   _Outptr_ IStorage **ppstgOpen);
997c2c66affSColin Finck 
998c2c66affSColin Finck _Check_return_
999c2c66affSColin Finck HRESULT
1000c2c66affSColin Finck WINAPI
1001c2c66affSColin Finck StgOpenStorageEx(
1002c2c66affSColin Finck   _In_ _Null_terminated_ const WCHAR *pwcwName,
1003c2c66affSColin Finck   _In_ DWORD grfMode,
1004c2c66affSColin Finck   _In_ DWORD stgfmt,
1005c2c66affSColin Finck   _In_ DWORD grfAttrs,
1006c2c66affSColin Finck   _Inout_opt_ STGOPTIONS *pStgOptions,
1007c2c66affSColin Finck   _In_opt_ void *reserved,
1008c2c66affSColin Finck   _In_ REFIID riid,
1009c2c66affSColin Finck   _Outptr_ void **ppObjectOpen);
1010c2c66affSColin Finck 
1011c2c66affSColin Finck _Check_return_
1012c2c66affSColin Finck HRESULT
1013c2c66affSColin Finck WINAPI
1014c2c66affSColin Finck StgCreateDocfileOnILockBytes(
1015c2c66affSColin Finck   _In_ ILockBytes *plkbyt,
1016c2c66affSColin Finck   _In_ DWORD grfMode,
1017c2c66affSColin Finck   _In_ DWORD reserved,
1018c2c66affSColin Finck   _Outptr_ IStorage **ppstgOpen);
1019c2c66affSColin Finck 
1020c2c66affSColin Finck _Check_return_
1021c2c66affSColin Finck HRESULT
1022c2c66affSColin Finck WINAPI
1023c2c66affSColin Finck StgOpenStorageOnILockBytes(
1024c2c66affSColin Finck   _In_ ILockBytes *plkbyt,
1025c2c66affSColin Finck   _In_opt_ IStorage *pstgPriority,
1026c2c66affSColin Finck   _In_ DWORD grfMode,
1027c2c66affSColin Finck   _In_opt_z_ SNB snbExclude,
1028c2c66affSColin Finck   _Reserved_ DWORD reserved,
1029c2c66affSColin Finck   _Outptr_ IStorage **ppstgOpen);
1030c2c66affSColin Finck 
1031c2c66affSColin Finck _Check_return_
1032c2c66affSColin Finck HRESULT
1033c2c66affSColin Finck WINAPI
1034c2c66affSColin Finck StgSetTimes(
1035c2c66affSColin Finck   _In_ _Null_terminated_ OLECHAR const *lpszName,
1036c2c66affSColin Finck   _In_opt_ FILETIME const *pctime,
1037c2c66affSColin Finck   _In_opt_ FILETIME const *patime,
1038c2c66affSColin Finck   _In_opt_ FILETIME const *pmtime);
1039c2c66affSColin Finck 
1040c2c66affSColin Finck #ifdef __cplusplus
1041c2c66affSColin Finck }
1042c2c66affSColin Finck #endif
1043c2c66affSColin Finck 
1044c2c66affSColin Finck #ifndef __WINESRC__
1045c2c66affSColin Finck # include <urlmon.h>
1046c2c66affSColin Finck #endif
1047c2c66affSColin Finck #include <propidl.h>
1048c2c66affSColin Finck 
1049c2c66affSColin Finck #ifndef __WINESRC__
1050c2c66affSColin Finck 
1051c2c66affSColin Finck #define FARSTRUCT
1052c2c66affSColin Finck #define HUGEP
1053c2c66affSColin Finck 
1054c2c66affSColin Finck #define WINOLEAPI        STDAPI
1055c2c66affSColin Finck #define WINOLEAPI_(type) STDAPI_(type)
1056c2c66affSColin Finck 
1057c2c66affSColin Finck #endif /* __WINESRC__ */
1058c2c66affSColin Finck 
1059c2c66affSColin Finck #endif /* _OBJBASE_H_ */
1060