Revert SC_CLOSE change, this is causing deadlocks.
[wine] / include / objidl.idl
1 /*
2  * Copyright 2002 Ove Kaaven
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 import "unknwn.idl";
20
21 interface IStream;
22 interface IEnumString;
23 interface IRunningObjectTable;
24 interface IMoniker;
25 interface IAdviseSink;
26 interface IAsyncManager;
27
28 /* FIXME: COSERVERINFO should be moved here from wtypes.idl */
29
30 /******************** Fundamentals ********************/
31
32 [
33   local,
34   object,
35   uuid(00000003-0000-0000-C000-000000000046)
36 ]
37 interface IMarshal : IUnknown
38 {
39   typedef [unique] IMarshal *LPMARSHAL;
40
41   HRESULT GetUnmarshalClass(
42     [in] REFIID riid,
43     [in, unique] void *pv,
44     [in] DWORD dwDestContext,
45     [in, unique] void *pvDestContext,
46     [in] DWORD mshlflags,
47     [out] CLSID *pCid);
48
49   HRESULT GetMarshalSizeMax(
50     [in] REFIID riid,
51     [in, unique] void *pv,
52     [in] DWORD dwDestContext,
53     [in, unique] void *pvDestContext,
54     [in] DWORD mshlflags,
55     [out] DWORD *pSize);
56
57   HRESULT MarshalInterface(
58     [in, unique] IStream *pStm,
59     [in] REFIID riid,
60     [in, unique] void *pv,
61     [in] DWORD dwDestContext,
62     [in, unique] void *pvDestContext,
63     [in] DWORD mshlflags);
64
65   HRESULT UnmarshalInterface(
66     [in, unique] IStream *pStm,
67     [in] REFIID riid,
68     [out] void **ppv);
69
70   HRESULT ReleaseMarshalData(
71     [in, unique] IStream *pStm);
72
73   HRESULT DisconnectObject(
74     [in] DWORD dwReserved);
75 }
76
77 [
78   local,
79   object,
80   uuid(00000018-0000-0000-C000-000000000046)
81 ]
82 interface IStdMarshalInfo : IUnknown
83 {
84   typedef [unique] IStdMarshalInfo *LPSTDMARSHALINFO;
85
86   HRESULT GetClassForHandler(
87     [in] DWORD dwDestContext,
88     [in, unique] void *pvDestContext,
89     [out] CLSID *pClsid);
90 }
91
92 [
93   local,
94   object,
95   uuid(00000019-0000-0000-C000-000000000046)
96 ]
97 interface IExternalConnection : IUnknown
98 {
99   typedef [unique] IExternalConnection *LPEXTERNALCONNECTION;
100
101   typedef enum tagEXTCONN {
102     EXTCONN_STRONG   = 0x0001,
103     EXTCONN_WEAK     = 0x0002,
104     EXTCONN_CALLABLE = 0x0004
105   } EXTCONN;
106
107   DWORD AddConnection(
108     [in] DWORD extconn,
109     [in] DWORD reserved);
110
111   DWORD ReleaseConnection(
112     [in] DWORD extconn,
113     [in] DWORD reserved,
114     [in] BOOL fLastReleaseCloses);
115 }
116
117 [
118   local,
119   object,
120   uuid(00000020-0000-0000-C000-000000000046)
121 ]
122 interface IMultiQI : IUnknown
123 {
124   typedef [unique] IMultiQI *LPMULTIQI;
125
126   typedef struct tagMULTI_QI {
127     const IID *pIID;
128     IUnknown *pItf;
129     HRESULT hr;
130   } MULTI_QI;
131
132   HRESULT QueryMultipleInterfaces(
133     [in] ULONG cMQIs,
134     [in, out] MULTI_QI *pMQIs);
135 }
136
137 [
138   local,
139   object,
140   uuid(00000002-0000-0000-C000-000000000046)
141 ]
142 interface IMalloc : IUnknown
143 {
144   typedef [unique] IMalloc *LPMALLOC;
145
146   LPVOID Alloc(
147     [in] ULONG cb);
148
149   LPVOID Realloc(
150     [in] LPVOID pv,
151     [in] ULONG cb);
152
153   void Free(
154     [in] LPVOID pv);
155
156   ULONG GetSize(
157     [in] LPVOID pv);
158
159   int DidAlloc(LPVOID pv);
160
161   void HeapMinimize();
162 }
163
164 [
165   local,
166   object,
167   uuid(0000001d-0000-0000-C000-000000000046)
168 ]
169 interface IMallocSpy : IUnknown
170 {
171   typedef [unique] IMallocSpy *LPMALLOCSPY;
172
173   ULONG PreAlloc(
174     [in] ULONG cbRequest);
175
176   LPVOID PostAlloc(
177     [in] LPVOID pActual);
178
179   LPVOID PreFree(
180     [in] LPVOID pRequest,
181     [in] BOOL fSpyed);
182
183   void PostFree(
184     [in] BOOL fSpyed);
185
186   ULONG PreRealloc(
187     [in] LPVOID pRequest,
188     [in] ULONG cbRequest,
189     [out] LPVOID *ppNewRequest,
190     [in] BOOL fSpyed);
191
192   LPVOID PostRealloc(
193     [in] LPVOID pActual,
194     [in] BOOL fSpyed);
195
196   LPVOID PreGetSize(
197     [in] LPVOID pRequest,
198     [in] BOOL fSpyed);
199
200   ULONG PostGetSize(
201     [in] ULONG cbActual,
202     [in] BOOL fSpyed);
203
204   LPVOID PreDidAlloc(
205     [in] LPVOID pRequest,
206     [in] BOOL fSpyed);
207
208   int PostDidAlloc(
209     [in] LPVOID pRequest,
210     [in] BOOL fSpyed,
211     [in] int fActual);
212
213   void PreHeapMinimize();
214
215   void PostHeapMinimize();
216 }
217
218 [
219   local,
220   object,
221   uuid(00000021-0000-0000-C000-000000000046)
222 ]
223 interface IInternalUnknown : IUnknown
224 {
225   HRESULT QueryInternalInterface(
226     [in] REFIID riid,
227     [out] void **ppv);
228 }
229
230 [
231   object,
232   uuid(00000100-0000-0000-C000-000000000046),
233   pointer_default(unique)
234 ]
235 interface IEnumUnknown : IUnknown
236 {
237   typedef [unique] IEnumUnknown *LPENUMUNKNOWN;
238
239   [local]
240   HRESULT Next(
241     [in] ULONG celt,
242     [out] IUnknown **rgelt,
243     [out] ULONG *pceltFetched);
244
245   [call_as(Next)]
246   HRESULT RemoteNext(
247     [in] ULONG celt,
248     [out, size_is(celt), length_is(*pceltFetched)]
249     IUnknown **rgelt,
250     [out] ULONG *pceltFetched);
251
252   HRESULT Skip(
253     [in] ULONG celt);
254
255   HRESULT Reset();
256
257   HRESULT Clone(
258     [out] IEnumUnknown **ppenum);
259 }
260
261 [
262   object,
263   uuid(00000022-0000-0000-C000-000000000046),
264   version(1.0),
265   pointer_default(unique)
266 ]
267 interface ISurrogate : IUnknown
268 {
269   typedef [unique] ISurrogate *LPSURROGATE;
270
271   HRESULT LoadDllServer(
272     [in] REFCLSID Clsid);
273   HRESULT FreeSurrogate();
274 }
275
276 [
277   local,
278   object,
279   uuid(00000146-0000-0000-C000-000000000046)
280 ]
281 interface IGlobalInterfaceTable : IUnknown
282 {
283   typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
284
285   HRESULT RegisterInterfaceInGlobal(
286     [in] IUnknown *pUnk,
287     [in] REFIID riid,
288     [out] DWORD *pdwCookie);
289
290   HRESULT RevokeInterfaceFromGlobal(
291     [in] DWORD dwCookie);
292
293   HRESULT GetInterfaceFromGlobal(
294     [in] DWORD dwCookie,
295     [in] REFIID riid,
296     [out, iid_is(riid)] void **ppv);
297 }
298
299 /******************** Monikers ********************/
300
301 [
302   object,
303   uuid(0000000e-0000-0000-C000-000000000046),
304   pointer_default(unique)
305 ]
306 interface IBindCtx : IUnknown
307 {
308   typedef [unique] IBindCtx *LPBINDCTX;
309   typedef [unique] IBindCtx *LPBC;
310
311   typedef struct tagBIND_OPTS {
312     DWORD cbStruct;
313     DWORD grfFlags;
314     DWORD grfMode;
315     DWORD dwTickCountDeadline;
316   } BIND_OPTS, *LPBIND_OPTS;
317
318   /* FIXME: C++ crap */
319   typedef struct tagBIND_OPTS2 {
320     DWORD cbStruct;
321     DWORD grfFlags;
322     DWORD grfMode;
323     DWORD dwTickCountDeadline;
324     DWORD dwTrackFlags;
325     DWORD dwClassContext;
326     LCID  locale;
327     COSERVERINFO *pServerInfo;
328   } BIND_OPTS2, *LPBIND_OPTS2;
329
330   typedef enum tagBIND_FLAGS {
331     BIND_MAYBOTHERUSER   = 1,
332     BIND_JUSTTESTEXISTENCE = 2
333   } BIND_FLAGS;
334
335   HRESULT RegisterObjectBound(
336     [in, unique] IUnknown *punk);
337
338   HRESULT RevokeObjectBound(
339     [in, unique] IUnknown *punk);
340
341   HRESULT ReleaseBoundObjects();
342
343   [local]
344   HRESULT SetBindOptions(
345     [in] BIND_OPTS *pbindopts);
346
347   [call_as(SetBindOptions)]
348   HRESULT RemoteSetBindOptions(
349     [in] BIND_OPTS2 *pbindopts);
350
351   [local]
352   HRESULT GetBindOptions(
353     [in, out] BIND_OPTS *pbindopts);
354
355   [call_as(GetBindOptions)]
356   HRESULT RemoteGetBindOptions(
357     [in, out] BIND_OPTS2 *pbindopts);
358
359   HRESULT GetRunningObjectTable(
360     [out] IRunningObjectTable **pprot);
361
362   HRESULT RegisterObjectParam(
363     [in] LPOLESTR pszKey,
364     [in, unique] IUnknown *punk);
365
366   HRESULT GetObjectParam(
367     [in] LPOLESTR pszKey,
368     [out] IUnknown **ppunk);
369
370   HRESULT EnumObjectParam(
371     [out] IEnumString **ppenum);
372
373   HRESULT RevokeObjectParam(
374     [in] LPOLESTR pszKey);
375 }
376
377 [
378   object,
379   uuid(00000102-0000-0000-C000-000000000046),
380   pointer_default(unique)
381 ]
382 interface IEnumMoniker : IUnknown
383 {
384   typedef [unique] IEnumMoniker *LPENUMMONIKER;
385
386   [local]
387   HRESULT Next(
388     [in] ULONG celt,
389     [out, size_is(celt), length_is(*pceltFetched)]
390     IMoniker **rgelt,
391     [out] ULONG *pceltFetched);
392
393   [call_as(Next)]
394   HRESULT RemoteNext(
395     [in] ULONG celt,
396     [out, size_is(celt), length_is(*pceltFetched)]
397     IMoniker **rgelt,
398     [out] ULONG *pceltFetched);
399
400   HRESULT Skip(
401     [in] ULONG celt);
402
403   HRESULT Reset();
404
405   HRESULT Clone(
406     [out] IEnumMoniker **ppenum);
407 }
408
409 [
410   object,
411   uuid(00000126-0000-0000-C000-000000000046)
412 ]
413 interface IRunnableObject : IUnknown
414 {
415   typedef [unique] IRunnableObject *LPRUNNABLEOBJECT;
416
417   HRESULT GetRunningClass(
418     [out] LPCLSID lpClsid);
419
420   HRESULT Run(
421     [in] LPBINDCTX pbc);
422
423   [local]
424   BOOL IsRunning();
425
426   [call_as(IsRunning)]
427   HRESULT RemoteIsRunning();
428
429   HRESULT LockRunning(
430     [in] BOOL fLock,
431     [in] BOOL fLastUnlockCloses);
432
433   HRESULT SetContainedObject(
434     [in] BOOL fContained);
435 }
436
437 /* GetObject is defined in wingdi.h as WINELIB_NAME_AW(GetObject),
438  * which resolves to a compilation failure if __WINESRC__ is defined,
439  * but GetObject is used as a valid method name below, so we have
440  * to undefine it if __WINESRC__ is defined */
441 cpp_quote("#ifdef __WINESRC__")
442 cpp_quote("#undef GetObject")
443 cpp_quote("#endif")
444
445 [
446   object,
447   uuid(00000010-0000-0000-C000-000000000046)
448 ]
449 interface IRunningObjectTable : IUnknown
450 {
451   typedef [unique] IRunningObjectTable *LPRUNNINGOBJECTTABLE;
452
453   HRESULT Register(
454     [in] DWORD grfFlags,
455     [in, unique] IUnknown *punkObject,
456     [in, unique] IMoniker *pmkObjectName,
457     [out] DWORD *pdwRegister);
458
459   HRESULT Revoke(
460     [in] DWORD dwRegister);
461
462   HRESULT IsRunning(
463     [in, unique] IMoniker *pmkObjectName);
464
465   HRESULT GetObject(
466     [in, unique] IMoniker *pmkObjectName,
467     [out] IUnknown **ppunkObject);
468
469   HRESULT NoteChangeTime(
470     [in] DWORD dwRegister,
471     [in] FILETIME *pfiletime);
472
473   HRESULT GetTimeOfLastChange(
474     [in, unique] IMoniker *pmkObjectName,
475     [out] FILETIME *pfiletime);
476
477   HRESULT EnumRunning(
478     [out] IEnumMoniker **ppenumMoniker);
479 }
480
481 [
482   object,
483   uuid(0000010c-0000-0000-C000-000000000046)
484 ]
485 interface IPersist : IUnknown
486 {
487   typedef [unique] IPersist *LPPERSIST;
488
489   HRESULT GetClassID(
490     [out] CLSID *pClassID);
491 }
492
493 [
494   object,
495   uuid(00000109-0000-0000-C000-000000000046),
496   pointer_default(unique)
497 ]
498 interface IPersistStream : IPersist
499 {
500   typedef [unique] IPersistStream *LPPERSISTSTREAM;
501
502   HRESULT IsDirty();
503
504   HRESULT Load(
505     [in, unique] IStream *pStm);
506
507   HRESULT Save(
508     [in, unique] IStream *pStm,
509     [in] BOOL fClearDirty);
510
511   HRESULT GetSizeMax(
512     [out] ULARGE_INTEGER *pcbSize);
513 }
514
515 [
516   object,
517   uuid(0000000f-0000-0000-C000-000000000046),
518   pointer_default(unique)
519 ]
520 interface IMoniker : IPersistStream
521 {
522   typedef [unique] IMoniker *LPMONIKER;
523
524   typedef enum tagMKSYS {
525     MKSYS_NONE             = 0,
526     MKSYS_GENERICCOMPOSITE = 1,
527     MKSYS_FILEMONIKER      = 2,
528     MKSYS_ANTIMONIKER      = 3,
529     MKSYS_ITEMMONIKER      = 4,
530     MKSYS_POINTERMONIKER   = 5,
531     /* MKSYS_URLMONIKER       = 6, */ /* defined in urlmon.idl */
532     MKSYS_CLASSMONIKER     = 7
533   } MKSYS;
534
535   typedef [v1_enum] enum tagMKREDUCE {
536     MKRREDUCE_ONE         = 3 << 16,
537     MKRREDUCE_TOUSER      = 2 << 16,
538     MKRREDUCE_THROUGHUSER = 1 << 16,
539     MKRREDUCE_ALL         = 0
540   } MKRREDUCE;
541
542   [local]
543   HRESULT BindToObject(
544     [in, unique] IBindCtx *pbc,
545     [in, unique] IMoniker *pmkToLeft,
546     [in] REFIID riidResult,
547     [out, iid_is(riidResult)] void **ppvResult);
548
549   [call_as(BindToObject)]
550   HRESULT RemoteBindToObject(
551     [in, unique] IBindCtx *pbc,
552     [in, unique] IMoniker *pmkToLeft,
553     [in] REFIID riidResult,
554     [out, iid_is(riidResult)] IUnknown **ppvResult);
555
556   [local]
557   HRESULT BindToStorage(
558     [in, unique] IBindCtx *pbc,
559     [in, unique] IMoniker *pmkToLeft,
560     [in] REFIID riid,
561     [out, iid_is(riid)] void **ppvObj);
562
563   [call_as(BindToStorage)]
564   HRESULT RemoteBindToStorage(
565     [in, unique] IBindCtx *pbc,
566     [in, unique] IMoniker *pmkToLeft,
567     [in] REFIID riid,
568     [out, iid_is(riid)] IUnknown **ppvObj);
569
570   HRESULT Reduce(
571     [in, unique] IBindCtx *pbc,
572     [in] DWORD dwReduceHowFar,
573     [in, out, unique] IMoniker **ppmkToLeft,
574     [out] IMoniker **ppmkReduced);
575
576   HRESULT ComposeWith(
577     [in, unique] IMoniker *pmkRight,
578     [in] BOOL fOnlyIfNotGeneric,
579     [out] IMoniker **ppmkComposite);
580
581   HRESULT Enum(
582     [in] BOOL fForward,
583     [out] IEnumMoniker **ppenumMoniker);
584
585   HRESULT IsEqual(
586     [in, unique] IMoniker *pmkOtherMoniker);
587
588   HRESULT Hash(
589     [out] DWORD *pdwHash);
590
591   HRESULT IsRunning(
592     [in, unique] IBindCtx *pbc,
593     [in, unique] IMoniker *pmkToLeft,
594     [in, unique] IMoniker *pmkNewlyRunning);
595
596   HRESULT GetTimeOfLastChange(
597     [in, unique] IBindCtx *pbc,
598     [in, unique] IMoniker *pmkToLeft,
599     [out] FILETIME *pFileTime);
600
601   HRESULT Inverse(
602     [out] IMoniker **ppmk);
603
604   HRESULT CommonPrefixWith(
605     [in, unique] IMoniker *pmkOther,
606     [out] IMoniker **ppmkPrefix);
607
608   HRESULT RelativePathTo(
609     [in, unique] IMoniker *pmkOther,
610     [out] IMoniker **ppmkRelPath);
611
612   HRESULT GetDisplayName(
613     [in, unique] IBindCtx *pbc,
614     [in, unique] IMoniker *pmkToLeft,
615     [out] LPOLESTR *ppszDisplayName);
616
617   HRESULT ParseDisplayName(
618     [in, unique] IBindCtx *pbc,
619     [in, unique] IMoniker *pmkToLeft,
620     [in] LPOLESTR pszDisplayName,
621     [out] ULONG *pchEaten,
622     [out] IMoniker **ppmkOut);
623
624   HRESULT IsSystemMoniker(
625     [out] DWORD *pdwMksys);
626 }
627
628 [
629   object,
630   uuid(f29f6bc0-5021-11ce-aa15-00006901293f),
631   pointer_default(unique)
632 ]
633 interface IROTData : IUnknown
634 {
635   HRESULT GetComparisonData(
636     [out, size_is(cbMax)] byte *pbData,
637     [in] ULONG cbMax,
638     [out] ULONG *pcbData);
639 }
640
641 [
642   object,
643   uuid(00000101-0000-0000-C000-000000000046),
644   pointer_default(unique)
645 ]
646 interface IEnumString : IUnknown
647 {
648   typedef [unique] IEnumString *LPENUMSTRING;
649
650   [local]
651   HRESULT Next(
652     [in] ULONG celt,
653     [out, size_is(celt), length_is(*pceltFetched)]
654     LPOLESTR *rgelt,
655     [out] ULONG *pceltFetched);
656
657   [call_as(Next)]
658   HRESULT RemoteNext(
659     [in] ULONG celt,
660     [out, size_is(celt), length_is(*pceltFetched)]
661     LPOLESTR *rgelt,
662     [out] ULONG *pceltFetched);
663
664   HRESULT Skip(
665     [in] ULONG celt);
666
667   HRESULT Reset();
668
669   HRESULT Clone(
670     [out] IEnumString **ppenum);
671 }
672
673 [
674   object,
675   uuid(00000140-0000-0000-C000-000000000046)
676 ]
677 interface IClassActivator : IUnknown
678 {
679   HRESULT GetClassObject(
680     [in] REFCLSID rclsid,
681     [in] DWORD dwClassContext,
682     [in] LCID locale,
683     [in] REFIID riid,
684     [out, iid_is(riid)] void **ppv);
685 }
686
687 /******************** Storage ********************/
688
689 [
690   object,
691   uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
692   pointer_default(unique)
693 ]
694 interface ISequentialStream : IUnknown
695 {
696   [local]
697   HRESULT Read(
698     [out, size_is(cb), length_is(*pcbRead)]
699     void *pv,
700     [in] ULONG cb,
701     [out] ULONG *pcbRead);
702
703   [call_as(Read)]
704   HRESULT RemoteRead(
705     [out, size_is(cb), length_is(*pcbRead)]
706     byte *pv,
707     [in] ULONG cb,
708     [out] ULONG *pcbRead);
709
710   [local]
711   HRESULT Write(
712     [in, size_is(cb)] const void *pv,
713     [in] ULONG cb,
714     [out] ULONG *pcbWritten);
715
716   [call_as(Write)]
717   HRESULT RemoteWrite(
718     [in, size_is(cb)] const byte *pv,
719     [in] ULONG cb,
720     [out] ULONG *pcbWritten);
721 }
722
723 [
724   object,
725   uuid(0000000c-0000-0000-C000-000000000046),
726   pointer_default(unique)
727 ]
728 interface IStream : ISequentialStream
729 {
730   typedef [unique] IStream *LPSTREAM;
731
732   typedef struct tagSTATSTG {
733     LPOLESTR pwcsName;
734     DWORD type;
735     ULARGE_INTEGER cbSize;
736     FILETIME mtime;
737     FILETIME ctime;
738     FILETIME atime;
739     DWORD grfMode;
740     DWORD grfLocksSupported;
741     CLSID clsid;
742     DWORD grfStateBits;
743     DWORD reserved;
744   } STATSTG;
745
746   typedef enum tagSTGTY {
747     STGTY_STORAGE   = 1,
748     STGTY_STREAM    = 2,
749     STGTY_LOCKBYTES = 3,
750     STGTY_PROPERTY  = 4
751   } STGTY;
752
753   typedef enum tagSTREAM_SEEK {
754     STREAM_SEEK_SET = 0,
755     STREAM_SEEK_CUR = 1,
756     STREAM_SEEK_END = 2
757   } STREAM_SEEK;
758
759   /* these are defined in Linux's fcntl.h,
760    * undefine them to avoid conflicts */
761   cpp_quote("#undef LOCK_MAND")
762   cpp_quote("#undef LOCK_READ")
763   cpp_quote("#undef LOCK_WRITE")
764   cpp_quote("#undef LOCK_RW")
765
766   typedef enum tagLOCKTYPE {
767     LOCK_WRITE      = 1,
768     LOCK_EXCLUSIVE  = 2,
769     LOCK_ONLYONCE   = 4
770   } LOCKTYPE;
771
772   [local]
773   HRESULT Seek(
774     [in] LARGE_INTEGER dlibMove,
775     [in] DWORD dwOrigin,
776     [out] ULARGE_INTEGER *plibNewPosition);
777
778   [call_as(Seek)]
779   HRESULT RemoteSeek(
780     [in] LARGE_INTEGER dlibMove,
781     [in] DWORD dwOrigin,
782     [out] ULARGE_INTEGER *plibNewPosition);
783
784   HRESULT SetSize(
785     [in] ULARGE_INTEGER libNewSize);
786
787   [local]
788   HRESULT CopyTo(
789     [in, unique] IStream *pstm,
790     [in] ULARGE_INTEGER cb,
791     [out] ULARGE_INTEGER *pcbRead,
792     [out] ULARGE_INTEGER *pcbWritten);
793
794   [call_as(CopyTo)]
795   HRESULT RemoteCopyTo(
796     [in, unique] IStream *pstm,
797     [in] ULARGE_INTEGER cb,
798     [out] ULARGE_INTEGER *pcbRead,
799     [out] ULARGE_INTEGER *pcbWritten);
800
801   HRESULT Commit(
802     [in] DWORD grfCommitFlags);
803
804   HRESULT Revert();
805
806   HRESULT LockRegion(
807     [in] ULARGE_INTEGER libOffset,
808     [in] ULARGE_INTEGER cb,
809     [in] DWORD dwLockType);
810
811   HRESULT UnlockRegion(
812     [in] ULARGE_INTEGER libOffset,
813     [in] ULARGE_INTEGER cb,
814     [in] DWORD dwLockType);
815
816   HRESULT Stat(
817     [out] STATSTG *pstatstg,
818     [in] DWORD grfStatFlag);
819
820   HRESULT Clone(
821     [out] IStream **ppstm);
822 }
823
824 [
825   object,
826   uuid(0000000d-0000-0000-C000-000000000046),
827   pointer_default(unique)
828 ]
829 interface IEnumSTATSTG : IUnknown
830 {
831   typedef [unique] IEnumSTATSTG *LPENUMSTATSTG;
832
833   [local]
834   HRESULT Next(
835     [in] ULONG celt,
836     [out, size_is(celt), length_is(*pceltFetched)]
837     STATSTG *rgelt,
838     [out] ULONG *pceltFetched);
839
840   [call_as(Next)]
841   HRESULT RemoteNext(
842     [in] ULONG celt,
843     [out, size_is(celt), length_is(*pceltFetched)]
844     STATSTG *rgelt,
845     [out] ULONG *pceltFetched);
846
847   HRESULT Skip(
848     [in] ULONG celt);
849
850   HRESULT Reset();
851
852   HRESULT Clone(
853     [out] IEnumSTATSTG **ppenum);
854 }
855
856 [
857   object,
858   uuid(0000000b-0000-0000-C000-000000000046),
859   pointer_default(unique)
860 ]
861 interface IStorage : IUnknown
862 {
863   typedef [unique] IStorage *LPSTORAGE;
864
865   typedef struct tagRemSNB {
866     unsigned long ulCntStr;
867     unsigned long ulCntChar;
868     [size_is(ulCntChar)] OLECHAR rgString[];
869   } RemSNB;
870
871   typedef [unique] RemSNB *wireSNB;
872   typedef [wire_marshal(wireSNB)] OLECHAR **SNB;
873
874   HRESULT CreateStream(
875     [in] LPCOLESTR pwcsName,
876     [in] DWORD grfMode,
877     [in] DWORD reserved1,
878     [in] DWORD reserved2,
879     [out] IStream **ppstm);
880
881   [local]
882   HRESULT OpenStream(
883     [in] LPCOLESTR pwcsName,
884     [in, unique] void *reserved1,
885     [in] DWORD grfMode,
886     [in] DWORD reserved2,
887     [out] IStream **ppstm);
888
889   [call_as(OpenStream)]
890   HRESULT RemoteOpenStream(
891     [in] LPCOLESTR pwcsName,
892     [in] unsigned long cbReserved1,
893     [in, unique, size_is(cbReserved1)] byte *reserved1,
894     [in] DWORD grfMode,
895     [in] DWORD reserved2,
896     [out] IStream **ppstm);
897
898   HRESULT CreateStorage(
899     [in] LPCOLESTR pwcsName,
900     [in] DWORD grfMode,
901     [in] DWORD dwStgFmt,
902     [in] DWORD reserved2,
903     [out] IStorage **ppstg);
904
905   HRESULT OpenStorage(
906     [in, unique] LPCOLESTR pwcsName,
907     [in, unique] IStorage *pstgPriority,
908     [in] DWORD grfMode,
909     [in, unique] SNB snbExclude,
910     [in] DWORD reserved,
911     [out] IStorage **ppstg);
912
913   HRESULT CopyTo(
914     [in] DWORD ciidExclude,
915     [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
916     [in, unique] SNB snbExclude,
917     [in, unique] IStorage *pstgDest);
918
919   HRESULT MoveElementTo(
920     [in] LPCOLESTR pwcsName,
921     [in, unique] IStorage *pstgDest,
922     [in] LPCOLESTR pwcsNewName,
923     [in] DWORD grfFlags);
924
925   HRESULT Commit(
926     [in] DWORD grfCommitFlags);
927
928   HRESULT Revert();
929
930   [local]
931   HRESULT EnumElements(
932     [in] DWORD reserved1,
933     [in, unique, size_is(1)] void *reserved2,
934     [in] DWORD reserved3,
935     [out] IEnumSTATSTG **ppenum);
936
937   [call_as(EnumElements)]
938   HRESULT RemoteEnumElements(
939     [in] DWORD reserved1,
940     [in] unsigned long cbReserved2,
941     [in, unique, size_is(cbReserved2)] byte *reserved2,
942     [in] DWORD reserved3,
943     [out] IEnumSTATSTG **ppenum);
944
945   HRESULT DestroyElement(
946     [in] LPCOLESTR pwcsName);
947
948   HRESULT RenameElement(
949     [in] LPCOLESTR pwcsOldName,
950     [in] LPCOLESTR pwcsNewName);
951
952   HRESULT SetElementTimes(
953     [in, unique] LPCOLESTR pwcsName,
954     [in, unique] const FILETIME *pctime,
955     [in, unique] const FILETIME *patime,
956     [in, unique] const FILETIME *pmtime);
957
958   HRESULT SetClass(
959     [in] REFCLSID clsid);
960
961   HRESULT SetStateBits(
962     [in] DWORD grfStateBits,
963     [in] DWORD grfMask);
964
965   HRESULT Stat(
966     [out] STATSTG *pstatstg,
967     [in] DWORD grfStatFlag);
968 }
969
970 [
971   object,
972   uuid(0000010b-0000-0000-C000-000000000046),
973   pointer_default(unique)
974 ]
975 interface IPersistFile : IPersist
976 {
977   typedef [unique] IPersistFile *LPPERSISTFILE;
978
979   HRESULT IsDirty();
980
981   HRESULT Load(
982     [in] LPCOLESTR pszFileName,
983     [in] DWORD dwMode);
984
985   HRESULT Save(
986     [in, unique] LPCOLESTR pszFileName,
987     [in] BOOL fRemember);
988
989   HRESULT SaveCompleted(
990     [in, unique] LPCOLESTR pszFileName);
991
992   HRESULT GetCurFile(
993     [out] LPOLESTR *ppszFileName);
994 }
995
996 [
997   object,
998   uuid(0000010a-0000-0000-C000-000000000046),
999   pointer_default(unique)
1000 ]
1001 interface IPersistStorage : IPersist
1002 {
1003   typedef [unique] IPersistStorage *LPPERSISTSTORAGE;
1004
1005   HRESULT IsDirty();
1006
1007   HRESULT InitNew(
1008     [in, unique] IStorage *pStg);
1009
1010   HRESULT Load(
1011     [in, unique] IStorage *pStg);
1012
1013   HRESULT Save(
1014     [in, unique] IStorage *pStgSave,
1015     [in] BOOL fSameAsLoad);
1016
1017   HRESULT SaveCompleted(
1018     [in, unique] IStorage *pStgNew);
1019
1020   HRESULT HandsOffStorage();
1021 }
1022
1023 [
1024   object,
1025   uuid(00000012-0000-0000-C000-000000000046),
1026   pointer_default(unique)
1027 ]
1028 interface IRootStorage : IUnknown
1029 {
1030   typedef [unique] IRootStorage *LPROOTSTORAGE;
1031
1032   HRESULT SwitchToFile(
1033     [in] LPOLESTR pszFile);
1034 }
1035
1036 [
1037   object,
1038   uuid(0000000a-0000-0000-C000-000000000046),
1039   pointer_default(unique)
1040 ]
1041 interface ILockBytes : IUnknown
1042 {
1043   typedef [unique] ILockBytes *LPLOCKBYTES;
1044
1045   [local]
1046   HRESULT ReadAt(
1047     [in] ULARGE_INTEGER ulOffset,
1048     [out, size_is(cb), length_is(*pcbRead)]
1049     void *pv,
1050     [in] ULONG cb,
1051     [out] ULONG *pcbRead);
1052
1053   [call_as(ReadAt)]
1054   HRESULT RemoteReadAt(
1055     [in] ULARGE_INTEGER ulOffset,
1056     [out, size_is(cb), length_is(*pcbRead)]
1057     byte *pv,
1058     [in] ULONG cb,
1059     [out] ULONG *pcbRead);
1060
1061   [local]
1062   HRESULT WriteAt(
1063     [in] ULARGE_INTEGER ulOffset,
1064     [in, size_is(cb)] const void *pv,
1065     [in] ULONG cb,
1066     [out] ULONG *pcbWritten);
1067
1068   [call_as(WriteAt)]
1069   HRESULT RemoteWriteAt(
1070     [in] ULARGE_INTEGER ulOffset,
1071     [in, size_is(cb)] const byte *pv,
1072     [in] ULONG cb,
1073     [out] ULONG *pcbWritten);
1074
1075   HRESULT Flush();
1076
1077   HRESULT SetSize(
1078     [in] ULARGE_INTEGER cb);
1079
1080   HRESULT LockRegion(
1081     [in] ULARGE_INTEGER libOffset,
1082     [in] ULARGE_INTEGER cb,
1083     [in] DWORD dwLockType);
1084
1085   HRESULT UnlockRegion(
1086     [in] ULARGE_INTEGER libOffset,
1087     [in] ULARGE_INTEGER cb,
1088     [in] DWORD dwLockType);
1089
1090   HRESULT Stat(
1091     [out] STATSTG *pstatstg,
1092     [in] DWORD grfStatFlag);
1093 }
1094
1095 [
1096   object,
1097   uuid(99caf010-415e-11cf-8814-00aa00b569f5),
1098   pointer_default(unique)
1099 ]
1100 interface IFillLockBytes : IUnknown
1101 {
1102   [local]
1103   HRESULT FillAppend(
1104     [in, size_is(cb)] const void *pv,
1105     [in] ULONG cb,
1106     [out] ULONG *pcbWritten);
1107
1108   [call_as(FillAppend)]
1109   HRESULT RemoteFillAppend(
1110     [in, size_is(cb)] const byte *pv,
1111     [in] ULONG cb,
1112     [out] ULONG *pcbWritten);
1113
1114   [local]
1115   HRESULT FillAt(
1116     [in] ULARGE_INTEGER ulOffset,
1117     [in, size_is(cb)] const void *pv,
1118     [in] ULONG cb,
1119     [out] ULONG *pcbWritten);
1120
1121   [call_as(FillAt)]
1122   HRESULT RemoteFillAt(
1123     [in] ULARGE_INTEGER ulOffset,
1124     [in, size_is(cb)] const byte *pv,
1125     [in] ULONG cb,
1126     [out] ULONG *pcbWritten);
1127
1128   HRESULT SetFillSize(
1129     [in] ULARGE_INTEGER ulSize);
1130
1131   HRESULT Terminate(
1132     [in] BOOL bCanceled);
1133 }
1134
1135 [
1136   object,
1137   uuid(a9d758a0-4617-11cf-95fc-00aa00680db4),
1138   pointer_default(unique)
1139 ]
1140 interface IProgressNotify : IUnknown
1141 {
1142   HRESULT OnProgress(
1143     [in] DWORD dwProgressCurrent,
1144     [in] DWORD dwProgressMaximum,
1145     [in] BOOL fAccurate,
1146     [in] BOOL fOwner);
1147 }
1148
1149 [
1150   local,
1151   object,
1152   uuid(0e6d4d90-6738-11cf-9608-00aa00680db4),
1153   pointer_default(unique)
1154 ]
1155 interface ILayoutStorage : IUnknown
1156 {
1157   typedef struct tagStorageLayout {
1158     DWORD LayoutType;
1159     OLECHAR *pwcsElementName;
1160     LARGE_INTEGER cOffset;
1161     LARGE_INTEGER cBytes;
1162   } StorageLayout;
1163
1164   HRESULT LayoutScript(
1165     [in] StorageLayout *pStorageLayout,
1166     [in] DWORD nEntries,
1167     [in] DWORD glfInterleavedFlag);
1168
1169   HRESULT BeginMonitor();
1170
1171   HRESULT EndMonitor();
1172
1173   HRESULT ReLayoutDocfile(
1174     [in] OLECHAR *pwcsNewDfName);
1175
1176   HRESULT ReLayoutDocfileOnILockBytes(
1177     [in] ILockBytes *pILockBytes);
1178 }
1179
1180 /******************** Data Object ********************/
1181
1182 [
1183   object,
1184   uuid(00000103-0000-0000-C000-000000000046),
1185   pointer_default(unique)
1186 ]
1187 interface IEnumFORMATETC : IUnknown
1188 {
1189   typedef [unique] IEnumFORMATETC *LPENUMFORMATETC;
1190
1191   typedef struct tagDVTARGETDEVICE {
1192     DWORD tdSize;
1193     WORD tdDriverNameOffset;
1194     WORD tdDeviceNameOffset;
1195     WORD tdPortNameOffset;
1196     WORD tdExtDevmodeOffset;
1197     [size_is(tdSize - sizeof(DWORD) - 4*sizeof(WORD))]
1198     BYTE tdData[];
1199   } DVTARGETDEVICE;
1200
1201   typedef CLIPFORMAT *LPCLIPFORMAT;
1202
1203   typedef struct tagFORMATETC {
1204     CLIPFORMAT cfFormat;
1205     [unique] DVTARGETDEVICE *ptd;
1206     DWORD dwAspect;
1207     LONG lindex;
1208     DWORD tymed;
1209   } FORMATETC, *LPFORMATETC;
1210
1211   [local]
1212   HRESULT Next(
1213     [in] ULONG celt,
1214     [out, size_is(celt), length_is(*pceltFetched)]
1215     FORMATETC *rgelt,
1216     [out] ULONG *pceltFetched);
1217
1218   [call_as(Next)]
1219   HRESULT RemoteNext(
1220     [in] ULONG celt,
1221     [out, size_is(celt), length_is(*pceltFetched)]
1222     FORMATETC *rgelt,
1223     [out] ULONG *pceltFetched);
1224
1225   HRESULT Skip(
1226     [in] ULONG celt);
1227
1228   HRESULT Reset();
1229
1230   HRESULT Clone(
1231     [out] IEnumFORMATETC **ppenum);
1232 }
1233
1234 [
1235   object,
1236   uuid(00000105-0000-0000-C000-000000000046),
1237   pointer_default(unique)
1238 ]
1239 interface IEnumSTATDATA : IUnknown
1240 {
1241   typedef [unique] IEnumSTATDATA *LPENUMSTATDATA;
1242
1243   typedef enum tagADVF {
1244     ADVF_NODATA            = 1,
1245     ADVF_PRIMEFIRST        = 2,
1246     ADVF_ONLYONCE          = 4,
1247     ADVF_DATAONSTOP        = 64,
1248     ADVFCACHE_NOHANDLER    = 8,
1249     ADVFCACHE_FORCEBUILTIN = 16,
1250     ADVFCACHE_ONSAVE       = 32
1251   } ADVF;
1252
1253   typedef struct tagSTATDATA
1254   {
1255     FORMATETC formatetc;
1256     DWORD advf;
1257     [unique] IAdviseSink *pAdvSink;
1258     DWORD dwConnection;
1259   } STATDATA, *LPSTATDATA;
1260
1261   [local]
1262   HRESULT Next(
1263     [in] ULONG celt,
1264     [out, size_is(celt), length_is(*pceltFetched)]
1265     STATDATA *rgelt,
1266     [out] ULONG *pceltFetched);
1267
1268   [call_as(Next)]
1269   HRESULT RemoteNext(
1270     [in] ULONG celt,
1271     [out, size_is(celt), length_is(*pceltFetched)]
1272     STATDATA *rgelt,
1273     [out] ULONG *pceltFetched);
1274
1275   HRESULT Skip(
1276     [in] ULONG celt);
1277
1278   HRESULT Reset();
1279
1280   HRESULT Clone(
1281     [out] IEnumSTATDATA **ppenum);
1282 }
1283
1284 [
1285   object,
1286   uuid(0000010f-0000-0000-C000-000000000046),
1287   pointer_default(unique)
1288 ]
1289 interface IAdviseSink : IUnknown
1290 {
1291   typedef IAdviseSink *LPADVISESINK;
1292
1293   typedef [v1_enum] enum tagTYMED {
1294     TYMED_HGLOBAL  = 1,
1295     TYMED_FILE     = 2,
1296     TYMED_ISTREAM  = 4,
1297     TYMED_ISTORAGE = 8,
1298     TYMED_GDI      = 16,
1299     TYMED_MFPICT   = 32,
1300     TYMED_ENHMF    = 64,
1301     TYMED_NULL     = 0
1302   } TYMED;
1303
1304   typedef struct tagRemSTGMEDIUM {
1305     DWORD tymed;
1306     DWORD dwHandleType;
1307     unsigned long pData;
1308     unsigned long pUnkForRelease;
1309     unsigned long cbData;
1310     [size_is(cbData)] byte data[];
1311   } RemSTGMEDIUM;
1312
1313   /* FIXME: C/C++ nameless union version */
1314   typedef struct tagSTGMEDIUM {
1315     DWORD tymed;
1316     [switch_is(tymed)] union {
1317     [case(TYMED_GDI)]      HBITMAP hBitmap;
1318     [case(TYMED_MFPICT)]   HMETAFILEPICT hMetaFilePict;
1319     [case(TYMED_ENHMF)]    HENHMETAFILE hEnhMetaFile;
1320     [case(TYMED_HGLOBAL)]  HGLOBAL hGlobal;
1321     [case(TYMED_FILE)]     LPOLESTR lpszFileName;
1322     [case(TYMED_ISTREAM)]  IStream *pstm;
1323     [case(TYMED_ISTORAGE)] IStorage *pstg;
1324     [default]              ;
1325     };
1326     [unique] IUnknown *pUnkForRelease;
1327   } uSTGMEDIUM;
1328
1329 /* copied from wingdi.h */
1330 #define OBJ_PEN             1
1331 #define OBJ_BRUSH           2
1332 #define OBJ_DC              3
1333 #define OBJ_METADC          4
1334 #define OBJ_PAL             5
1335 #define OBJ_FONT            6
1336 #define OBJ_BITMAP          7
1337 #define OBJ_REGION          8
1338 #define OBJ_METAFILE        9
1339 #define OBJ_MEMDC           10
1340 #define OBJ_EXTPEN          11
1341 #define OBJ_ENHMETADC       12
1342 #define OBJ_ENHMETAFILE     13
1343
1344   typedef union _GDI_OBJECT switch(DWORD ObjectType) u {
1345     case OBJ_BITMAP: wireHBITMAP hBitmap;
1346     case OBJ_PAL:    wireHPALETTE hPalette;
1347     default:         wireHGLOBAL hGeneric;
1348   } GDI_OBJECT;
1349
1350   typedef struct _userSTGMEDIUM {
1351     union switch(DWORD tymed) u {
1352     case TYMED_NULL:     ;
1353     case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
1354     case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
1355     case TYMED_GDI:      GDI_OBJECT *hGdiHandle;
1356     case TYMED_HGLOBAL:  wireHGLOBAL hGlobal;
1357     case TYMED_FILE:     LPOLESTR lpszFileName;
1358     case TYMED_ISTREAM:  BYTE_BLOB *pstm;
1359     case TYMED_ISTORAGE: BYTE_BLOB *pstg;
1360     };
1361     IUnknown *pUnkForRelease;
1362   } userSTGMEDIUM;
1363
1364   typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
1365   typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
1366
1367   typedef [unique] userSTGMEDIUM *wireASYNC_STGMEDIUM;
1368   typedef [wire_marshal(wireASYNC_STGMEDIUM)] STGMEDIUM ASYNC_STGMEDIUM;
1369
1370   typedef STGMEDIUM *LPSTGMEDIUM;
1371
1372   typedef struct _userFLAG_STGMEDIUM {
1373     long ContextFlags;
1374     long fPassOwnership;
1375     userSTGMEDIUM Stgmed;
1376   } userFLAG_STGMEDIUM;
1377
1378   typedef [unique] userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
1379
1380   typedef [wire_marshal(wireFLAG_STGMEDIUM)] struct _FLAG_STGMEDIUM {
1381     long ContextFlags;
1382     long fPassOwnership;
1383     STGMEDIUM Stgmed;
1384   } FLAG_STGMEDIUM;
1385
1386   [local]
1387   void OnDataChange(
1388     [in, unique] FORMATETC *pFormatetc,
1389     [in, unique] STGMEDIUM *pStgmed);
1390
1391   [call_as(OnDataChange), async]
1392   HRESULT  RemoteOnDataChange(
1393     [in] IAsyncManager **ppIAM,
1394     [in, unique] FORMATETC *pFormatetc,
1395     [in, unique] ASYNC_STGMEDIUM *pStgmed);
1396
1397   [local]
1398   void OnViewChange(
1399     [in] DWORD dwAspect,
1400     [in] LONG lindex);
1401
1402   [call_as(OnViewChange), async]
1403   HRESULT RemoteOnViewChange(
1404     [in] IAsyncManager **ppIAM,
1405     [in] DWORD dwAspect,
1406     [in] LONG lindex);
1407
1408   [local]
1409   void OnRename(
1410     [in] IMoniker *pmk);
1411
1412   [call_as(OnRename), async]
1413   HRESULT RemoteOnRename(
1414     [in] IAsyncManager **ppIAM,
1415     [in] IMoniker *pmk);
1416
1417   [local]
1418   void OnSave();
1419
1420   [call_as(OnSave), async]
1421   HRESULT RemoteOnSave(
1422     [in] IAsyncManager **ppIAM);
1423
1424   [local]
1425   void OnClose();
1426
1427   [call_as(OnClose)]
1428   HRESULT RemoteOnClose();
1429 }
1430
1431 [
1432   object,
1433   uuid(00000125-0000-0000-C000-000000000046),
1434   pointer_default(unique)
1435 ]
1436 interface IAdviseSink2 : IAdviseSink
1437 {
1438   typedef [unique] IAdviseSink2 *LPADVISESINK2;
1439
1440   [local]
1441   void OnLinkSrcChange(
1442     [in, unique] IMoniker *pmk);
1443
1444   [call_as(OnLinkSrcChange), async]
1445   HRESULT RemoteOnLinkSrcChange(
1446     [in] IAsyncManager **ppIAM,
1447     [in, unique] IMoniker *pmk);
1448 }
1449
1450 [
1451   object,
1452   uuid(0000010e-0000-0000-C000-000000000046),
1453   pointer_default(unique)
1454 ]
1455 interface IDataObject : IUnknown
1456 {
1457   typedef [unique] IDataObject *LPDATAOBJECT;
1458
1459   typedef enum tagDATADIR {
1460     DATADIR_GET = 1,
1461     DATADIR_SET = 2
1462   } DATADIR;
1463
1464   [local]
1465   HRESULT GetData(
1466     [in, unique] FORMATETC *pformatetcIn,
1467     [out] STGMEDIUM *pmedium);
1468
1469   [call_as(GetData)]
1470   HRESULT RemoteGetData(
1471     [in, unique] FORMATETC *pformatetcIn,
1472     [out] STGMEDIUM *pRemoteMedium);
1473
1474   [local]
1475   HRESULT GetDataHere(
1476     [in, unique] FORMATETC *pformatetc,
1477     [in, out] STGMEDIUM *pmedium);
1478
1479   [call_as(GetDataHere)]
1480   HRESULT RemoteGetDataHere(
1481     [in, unique] FORMATETC *pformatetc,
1482     [in, out] STGMEDIUM *pRemoteMedium);
1483
1484   HRESULT QueryGetData(
1485     [in, unique] FORMATETC *pformatetc);
1486
1487   HRESULT GetCanonicalFormatEtc(
1488     [in, unique] FORMATETC *pformatectIn,
1489     [out] FORMATETC *pformatetcOut);
1490
1491   [local]
1492   HRESULT SetData(
1493     [in, unique] FORMATETC *pformatetc,
1494     [in, unique] STGMEDIUM *pmedium,
1495     [in] BOOL fRelease);
1496
1497   [call_as(SetData)]
1498   HRESULT RemoteSetData(
1499     [in, unique] FORMATETC *pformatetc,
1500     [in, unique] FLAG_STGMEDIUM *pmedium,
1501     [in] BOOL fRelease);
1502
1503   HRESULT EnumFormatEtc(
1504     [in] DWORD dwDirection,
1505     [out] IEnumFORMATETC **ppenumFormatEtc);
1506
1507   HRESULT DAdvise(
1508     [in] FORMATETC *pformatetc,
1509     [in] DWORD advf,
1510     [in, unique] IAdviseSink *pAdvSink,
1511     [out] DWORD *pdwConnection);
1512
1513   HRESULT DUnadvise(
1514     [in] DWORD dwConnection);
1515
1516   HRESULT EnumDAdvise(
1517     [out] IEnumSTATDATA **ppenumAdvise);
1518 }
1519
1520 [
1521   local,
1522   object,
1523   uuid(00000110-0000-0000-C000-000000000046)
1524 ]
1525 interface IDataAdviseHolder : IUnknown
1526 {
1527   typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
1528
1529   HRESULT Advise(
1530     [in, unique] IDataObject *pDataObject,
1531     [in, unique] FORMATETC *pFetc,
1532     [in] DWORD advf,
1533     [in, unique] IAdviseSink *pAdvise,
1534     [out] DWORD *pdwConnection);
1535
1536   HRESULT Unadvise(
1537     [in] DWORD dwConnection);
1538
1539   HRESULT EnumAdvise(
1540     [out] IEnumSTATDATA **ppenumAdvise);
1541
1542   HRESULT SendOnDataChange(
1543     [in, unique] IDataObject *pDataObject,
1544     [in] DWORD dwReserved,
1545     [in] DWORD advf);
1546 }
1547
1548 /******************** Remoting ********************/
1549
1550 [
1551   local,
1552   object,
1553   uuid(00000016-0000-0000-C000-000000000046)
1554 ]
1555 interface IMessageFilter : IUnknown
1556 {
1557   typedef [unique] IMessageFilter *LPMESSAGEFILTER;
1558
1559   typedef enum tagCALLTYPE {
1560     CALLTYPE_TOPLEVEL = 1,
1561     CALLTYPE_NESTED   = 2,
1562     CALLTYPE_ASYNC    = 3,
1563     CALLTYPE_TOPLEVEL_CALLPENDING = 4,
1564     CALLTYPE_ASYNC_CALLPENDING    = 5
1565   } CALLTYPE;
1566
1567   typedef enum tagSERVERCALL {
1568     SERVERCALL_ISHANDLED  = 0,
1569     SERVERCALL_REJECTED   = 1,
1570     SERVERCALL_RETRYLATER = 2
1571   } SERVERCALL;
1572
1573   typedef enum tagPENDINGTYPE {
1574     PENDINGTYPE_TOPLEVEL = 1,
1575     PENDINGTYPE_NESTED   = 2
1576   } PENDINGTYPE;
1577
1578   typedef enum tagPENDINGMSG {
1579     PENDINGMSG_CANCELCALL     = 0,
1580     PENDINGMSG_WAITNOPROCESS  = 1,
1581     PENDINGMSG_WAITDEFPROCESS = 2
1582   } PENDINGMSG;
1583
1584   typedef struct tagINTERFACEINFO {
1585     IUnknown *pUnk;
1586     IID iid;
1587     WORD wMethod;
1588   } INTERFACEINFO, *LPINTERFACEINFO;
1589
1590   DWORD HandleInComingCall(
1591     [in] DWORD dwCallType,
1592     [in] HTASK htaskCaller,
1593     [in] DWORD dwTickCount,
1594     [in] LPINTERFACEINFO lpInterfaceInfo);
1595
1596   DWORD RetryRejectedCall(
1597     [in] HTASK htaskCallee,
1598     [in] DWORD dwTickCount,
1599     [in] DWORD dwRejectType);
1600
1601   DWORD MessagePending(
1602     [in] HTASK htaskCallee,
1603     [in] DWORD dwTickCount,
1604     [in] DWORD dwPendingType);
1605 }
1606
1607 [
1608   local,
1609   object,
1610   uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
1611 ]
1612 interface IRpcChannelBuffer : IUnknown
1613 {
1614   typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
1615
1616   typedef unsigned long RPCOLEDATAREP;
1617
1618   typedef struct tagRPCOLEMESSAGE {
1619     void *reserved1;
1620     RPCOLEDATAREP dataRepresentation;
1621     void *Buffer;
1622     ULONG cbBuffer;
1623     ULONG iMethod;
1624     void *reserved2[5];
1625     ULONG rpcFlags;
1626   } RPCOLEMESSAGE;
1627
1628   typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
1629
1630   HRESULT GetBuffer(
1631     [in] RPCOLEMESSAGE *pMessage,
1632     [in] REFIID riid);
1633
1634   HRESULT SendReceive(
1635     [in,out] RPCOLEMESSAGE *pMessage,
1636     [out] ULONG *pStatus);
1637
1638   HRESULT FreeBuffer(
1639     [in] RPCOLEMESSAGE *pMessage);
1640
1641   HRESULT GetDestCtx(
1642     [out] DWORD *pdwDestContext,
1643     [out] void **ppvDestContext);
1644
1645   HRESULT IsConnected();
1646 }
1647
1648 [
1649   local,
1650   object,
1651   uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
1652 ]
1653 interface IRpcChannelBuffer2 : IRpcChannelBuffer
1654 {
1655   typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
1656
1657   HRESULT GetProtocolVersion(
1658     [in,out] DWORD *pdwVersion);
1659 }
1660
1661 [
1662   local,
1663   object,
1664   uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
1665 ]
1666 interface IRpcChannelBuffer3 : IRpcChannelBuffer2
1667 {
1668   typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
1669
1670   HRESULT Send(
1671     [in,out] RPCOLEMESSAGE *pMsg,
1672     [out] ULONG *pulStatus);
1673
1674   HRESULT Receive(
1675     [in,out] RPCOLEMESSAGE *pMsg,
1676     [in] ULONG ulSize,
1677     [out] ULONG *pulStatus);
1678
1679   HRESULT Cancel(
1680     [in] RPCOLEMESSAGE *pMsg);
1681
1682   HRESULT GetCallContext(
1683     [in] RPCOLEMESSAGE *pMsg,
1684     [in] REFIID riid,
1685     [out] void **pInterface);
1686
1687   HRESULT GetDestCtxEx(
1688     [in] RPCOLEMESSAGE *pMsg,
1689     [out] DWORD *pdwDestContext,
1690     [out] void **ppvDestContext);
1691
1692   HRESULT GetState(
1693     [in] RPCOLEMESSAGE *pMsg,
1694     [out] DWORD *pState);
1695
1696   HRESULT RegisterAsync(
1697     [in] RPCOLEMESSAGE *pMsg,
1698     [in] IAsyncManager *pAsyncMgr);
1699 }
1700
1701 [
1702   local,
1703   object,
1704   uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
1705 ]
1706 interface IRpcProxyBuffer : IUnknown
1707 {
1708   typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
1709
1710   HRESULT Connect(
1711     [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
1712
1713   void Disconnect();
1714 }
1715
1716 [
1717   local,
1718   object,
1719   uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
1720 ]
1721 interface IRpcStubBuffer : IUnknown
1722 {
1723   typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
1724
1725   HRESULT Connect(
1726     [in] IUnknown *pUnkServer);
1727
1728   void Disconnect();
1729
1730   HRESULT Invoke(
1731     [in] RPCOLEMESSAGE *_prpcmsg,
1732     [in] IRpcChannelBuffer *_pRpcChannelBuffer);
1733
1734   IRpcStubBuffer *IsIIDSupported(
1735     [in] REFIID riid);
1736
1737   ULONG CountRefs();
1738
1739   HRESULT DebugServerQueryInterface(
1740     void **ppv);
1741
1742   void DebugServerRelease(
1743     void *pv);
1744 }
1745
1746 [
1747   local,
1748   object,
1749   uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
1750 ]
1751 interface IPSFactoryBuffer : IUnknown
1752 {
1753   typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
1754
1755   HRESULT CreateProxy(
1756     [in] IUnknown *pUnkOuter,
1757     [in] REFIID riid,
1758     [out] IRpcProxyBuffer **ppProxy,
1759     [out] void **ppv);
1760
1761   HRESULT CreateStub(
1762     [in] REFIID riid,
1763     [in, unique] IUnknown *pUnkServer,
1764     [out] IRpcStubBuffer **ppStub);
1765 }
1766
1767 [
1768   local,
1769   object,
1770   uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
1771 ]
1772 interface IChannelHook : IUnknown
1773 {
1774   typedef [unique] IChannelHook *LPCHANNELHOOK;
1775
1776   typedef struct SChannelHookCallInfo {
1777     IID iid;
1778     DWORD cbSize;
1779     GUID uCausality;
1780     DWORD dwServerPid;
1781     DWORD iMethod;
1782     void *pObject;
1783   } SChannelHookCallInfo;
1784
1785   void ClientGetSize(
1786     [in] REFGUID uExtent,
1787     [in] REFIID riid,
1788     [out] ULONG *pDataSize);
1789
1790   void ClientFillBuffer(
1791     [in] REFGUID uExtent,
1792     [in] REFIID riid,
1793     [in, out] ULONG *pDataSize,
1794     [in] void *pDataBuffer);
1795
1796   void ClientNotify(
1797     [in] REFGUID uExtent,
1798     [in] REFIID riid,
1799     [in] ULONG cbDataSize,
1800     [in] void *pDataBuffer,
1801     [in] DWORD lDataRep,
1802     [in] HRESULT hrFault);
1803
1804   void ServerNotify(
1805     [in] REFGUID uExtent,
1806     [in] REFIID riid,
1807     [in] ULONG cbDataSize,
1808     [in] void *pDataBuffer,
1809     [in] DWORD lDataRep);
1810
1811   void ServerGetSize(
1812     [in] REFGUID uExtent,
1813     [in] REFIID riid,
1814     [in] HRESULT hrFault,
1815     [out] ULONG *pDataSize);
1816
1817   void ServerFillBuffer(
1818     [in] REFGUID uExtent,
1819     [in] REFIID riid,
1820     [in, out] ULONG *pDataSize,
1821     [in] void *pDataBuffer,
1822     [in] HRESULT hrFault );
1823 }
1824
1825 extern const FMTID FMTID_SummaryInformation;
1826 extern const FMTID FMTID_DocSummaryInformation;
1827 extern const FMTID FMTID_UserDefinedProperties;
1828
1829
1830 /******************** Connection Points ********************/
1831 /* FIXME */
1832
1833 /******************** DCOM ********************/
1834
1835 [
1836   local,
1837   object,
1838   uuid(0000013D-0000-0000-C000-000000000046)
1839 ]
1840 interface IClientSecurity : IUnknown
1841 {
1842   typedef struct tagSOLE_AUTHENTICATION_SERVICE {
1843     DWORD dwAuthnSvc;
1844     DWORD dwAuthzSvc;
1845     OLECHAR *pPrincipalName;
1846     HRESULT hr;
1847   } SOLE_AUTHENTICATION_SERVICE;
1848
1849   typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
1850
1851   typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
1852     EOAC_NONE           = 0x0,
1853     EOAC_MUTUAL_AUTH    = 0x1,
1854     EOAC_CLOAKING       = 0x10,
1855     EOAC_SECURE_REFS    = 0x2,
1856     EOAC_ACCESS_CONTROL = 0x4,
1857     EOAC_APPID          = 0x8
1858   } EOLE_AUTHENTICATION_CAPABILITIES;
1859
1860   HRESULT QueryBlanket(
1861     [in] IUnknown *pProxy,
1862     [out] DWORD *pAuthnSvc,
1863     [out] DWORD *pAuthzSvc,
1864     [out] OLECHAR **pServerPrincName,
1865     [out] DWORD *pAuthnLevel,
1866     [out] DWORD *pImpLevel,
1867     [out] void **pAuthInfo,
1868     [out] DWORD *pCapabilites);
1869
1870   HRESULT SetBlanket(
1871     [in] IUnknown *pProxy,
1872     [in] DWORD AuthnSvc,
1873     [in] DWORD AuthzSvc,
1874     [in] OLECHAR *pServerPrincName,
1875     [in] DWORD AuthnLevel,
1876     [in] DWORD ImpLevel,
1877     [in] void *pAuthInfo,
1878     [in] DWORD Capabilities);
1879
1880   HRESULT CopyProxy(
1881     [in] IUnknown *pProxy,
1882     [out] IUnknown **ppCopy);
1883 }
1884
1885 [
1886   local,
1887   object,
1888   uuid(0000013E-0000-0000-C000-000000000046)
1889 ]
1890 interface IServerSecurity : IUnknown
1891 {
1892   HRESULT QueryBlanket(
1893     [out] DWORD *pAuthnSvc,
1894     [out] DWORD *pAuthzSvc,
1895     [out] OLECHAR **pServerPrincName,
1896     [out] DWORD *pAuthnLevel,
1897     [out] DWORD *pImpLevel,
1898     [out] void **pPrivs,
1899     [out] DWORD *pCapabilities);
1900
1901   HRESULT ImpersonateClient();
1902
1903   HRESULT RevertToSelf();
1904
1905   BOOL IsImpersonating();
1906 }
1907
1908 [
1909   local,
1910   object,
1911   uuid(00000024-0000-0000-C000-000000000046)
1912 ]
1913 interface IAsyncSetup : IUnknown
1914 {
1915   HRESULT GetAsyncManager(
1916     [in] REFIID riid,
1917     [in] IUnknown *pOuter,
1918     [in] DWORD dwFlags,
1919     [out] IUnknown **ppInner,
1920     [out] IAsyncManager **ppAsyncMgr);
1921 }
1922
1923 [
1924   local,
1925   object,
1926   uuid(0000002A-0000-0000-C000-000000000046)
1927 ]
1928 interface IAsyncManager : IUnknown
1929 {
1930   typedef enum tagDCOM_CALL_STATE {
1931     DCOM_NONE          = 0,
1932     DCOM_CALL_COMPLETE = 1,
1933     DCOM_CALL_CANCELED = 2
1934   } DCOM_CALL_STATE;
1935
1936   HRESULT CompleteCall(
1937     [in] HRESULT Result);
1938   HRESULT GetCallContext(
1939     [in] REFIID riid,
1940     [out] void **pInterface);
1941   HRESULT GetState(
1942     [out] ULONG *pulStateFlags);
1943 }