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