Moved the ShellExecuteEx definitions to shellapi.h where they belong.
[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   object,
220   uuid(00000100-0000-0000-C000-000000000046),
221   pointer_default(unique)
222 ]
223 interface IEnumUnknown : IUnknown
224 {
225   typedef [unique] IEnumUnknown *LPENUMUNKNOWN;
226
227   [local]
228   HRESULT Next(
229     [in] ULONG celt,
230     [out] IUnknown **rgelt,
231     [out] ULONG *pceltFetched);
232
233   [call_as(Next)]
234   HRESULT RemoteNext(
235     [in] ULONG celt,
236     [out, size_is(celt), length_is(*pceltFetched)]
237     IUnknown **rgelt,
238     [out] ULONG *pceltFetched);
239
240   HRESULT Skip(
241     [in] ULONG celt);
242
243   HRESULT Reset();
244
245   HRESULT Clone(
246     [out] IEnumUnknown **ppenum);
247 }
248
249 [
250   object,
251   uuid(00000022-0000-0000-C000-000000000046),
252   version(1.0),
253   pointer_default(unique)
254 ]
255 interface ISurrogate : IUnknown
256 {
257   typedef [unique] ISurrogate *LPSURROGATE;
258
259   HRESULT LoadDllServer(
260     [in] REFCLSID Clsid);
261   HRESULT FreeSurrogate();
262 }
263
264 [
265   local,
266   object,
267   uuid(00000146-0000-0000-C000-000000000046)
268 ]
269 interface IGlobalInterfaceTable : IUnknown
270 {
271   typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
272
273   HRESULT RegisterInterfaceInGlobal(
274     [in] IUnknown *pUnk,
275     [in] REFIID riid,
276     [out] DWORD *pdwCookie);
277
278   HRESULT RevokeInterfaceFromGlobal(
279     [in] DWORD dwCookie);
280
281   HRESULT GetInterfaceFromGlobal(
282     [in] DWORD dwCookie,
283     [in] REFIID riid,
284     [out, iid_is(riid)] void **ppv);
285 }
286
287 /******************** Monikers ********************/
288
289 [
290   object,
291   uuid(0000000e-0000-0000-C000-000000000046),
292   pointer_default(unique)
293 ]
294 interface IBindCtx : IUnknown
295 {
296   typedef [unique] IBindCtx *LPBINDCTX;
297   typedef [unique] IBindCtx *LPBC;
298
299   typedef struct tagBIND_OPTS {
300     DWORD cbStruct;
301     DWORD grfFlags;
302     DWORD grfMode;
303     DWORD dwTickCountDeadline;
304   } BIND_OPTS, *LPBIND_OPTS;
305
306   /* FIXME: C++ crap */
307   typedef struct tagBIND_OPTS2 {
308     DWORD cbStruct;
309     DWORD grfFlags;
310     DWORD grfMode;
311     DWORD dwTickCountDeadline;
312     DWORD dwTrackFlags;
313     DWORD dwClassContext;
314     LCID  locale;
315     COSERVERINFO *pServerInfo;
316   } BIND_OPTS2, *LPBIND_OPTS2;
317
318   typedef enum tagBIND_FLAGS {
319     BIND_MAYBOTHERUSER   = 1,
320     BIND_JUSTTESTEXISTENCE = 2
321   } BIND_FLAGS;
322
323   HRESULT RegisterObjectBound(
324     [in, unique] IUnknown *punk);
325
326   HRESULT RevokeObjectBound(
327     [in, unique] IUnknown *punk);
328
329   HRESULT ReleaseBoundObjects();
330
331   [local]
332   HRESULT SetBindOptions(
333     [in] BIND_OPTS *pbindopts);
334
335   [call_as(SetBindOptions)]
336   HRESULT RemoteSetBindOptions(
337     [in] BIND_OPTS2 *pbindopts);
338
339   [local]
340   HRESULT GetBindOptions(
341     [in, out] BIND_OPTS *pbindopts);
342
343   [call_as(GetBindOptions)]
344   HRESULT RemoteGetBindOptions(
345     [in, out] BIND_OPTS2 *pbindopts);
346
347   HRESULT GetRunningObjectTable(
348     [out] IRunningObjectTable **pprot);
349
350   HRESULT RegisterObjectParam(
351     [in] LPOLESTR pszKey,
352     [in, unique] IUnknown *punk);
353
354   HRESULT GetObjectParam(
355     [in] LPOLESTR pszKey,
356     [out] IUnknown **ppunk);
357
358   HRESULT EnumObjectParam(
359     [out] IEnumString **ppenum);
360
361   HRESULT RevokeObjectParam(
362     [in] LPOLESTR pszKey);
363 }
364
365 [
366   object,
367   uuid(00000102-0000-0000-C000-000000000046),
368   pointer_default(unique)
369 ]
370 interface IEnumMoniker : IUnknown
371 {
372   typedef [unique] IEnumMoniker *LPENUMMONIKER;
373
374   [local]
375   HRESULT Next(
376     [in] ULONG celt,
377     [out, size_is(celt), length_is(*pceltFetched)]
378     IMoniker **rgelt,
379     [out] ULONG *pceltFetched);
380
381   [call_as(Next)]
382   HRESULT RemoteNext(
383     [in] ULONG celt,
384     [out, size_is(celt), length_is(*pceltFetched)]
385     IMoniker **rgelt,
386     [out] ULONG *pceltFetched);
387
388   HRESULT Skip(
389     [in] ULONG celt);
390
391   HRESULT Reset();
392
393   HRESULT Clone(
394     [out] IEnumMoniker **ppenum);
395 }
396
397 [
398   object,
399   uuid(00000126-0000-0000-C000-000000000046)
400 ]
401 interface IRunnableObject : IUnknown
402 {
403   typedef [unique] IRunnableObject *LPRUNNABLEOBJECT;
404
405   HRESULT GetRunningClass(
406     [out] LPCLSID lpClsid);
407
408   HRESULT Run(
409     [in] LPBINDCTX pbc);
410
411   [local]
412   BOOL IsRunning();
413
414   [call_as(IsRunning)]
415   HRESULT RemoteIsRunning();
416
417   HRESULT LockRunning(
418     [in] BOOL fLock,
419     [in] BOOL fLastUnlockCloses);
420
421   HRESULT SetContainedObject(
422     [in] BOOL fContained);
423 }
424
425 /* GetObject is defined in wingdi.h as WINELIB_NAME_AW(GetObject),
426  * which resolves to a compilation failure if __WINESRC__ is defined,
427  * but GetObject is used as a valid method name below, so we have
428  * to undefine it if __WINESRC__ is defined */
429 cpp_quote("#ifdef __WINESRC__")
430 cpp_quote("#undef GetObject")
431 cpp_quote("#endif")
432
433 [
434   object,
435   uuid(00000010-0000-0000-C000-000000000046)
436 ]
437 interface IRunningObjectTable : IUnknown
438 {
439   typedef [unique] IRunningObjectTable *LPRUNNINGOBJECTTABLE;
440
441   HRESULT Register(
442     [in] DWORD grfFlags,
443     [in, unique] IUnknown *punkObject,
444     [in, unique] IMoniker *pmkObjectName,
445     [out] DWORD *pdwRegister);
446
447   HRESULT Revoke(
448     [in] DWORD dwRegister);
449
450   HRESULT IsRunning(
451     [in, unique] IMoniker *pmkObjectName);
452
453   HRESULT GetObject(
454     [in, unique] IMoniker *pmkObjectName,
455     [out] IUnknown **ppunkObject);
456
457   HRESULT NoteChangeTime(
458     [in] DWORD dwRegister,
459     [in] FILETIME *pfiletime);
460
461   HRESULT GetTimeOfLastChange(
462     [in, unique] IMoniker *pmkObjectName,
463     [out] FILETIME *pfiletime);
464
465   HRESULT EnumRunning(
466     [out] IEnumMoniker **ppenumMoniker);
467 }
468
469 [
470   object,
471   uuid(0000010c-0000-0000-C000-000000000046)
472 ]
473 interface IPersist : IUnknown
474 {
475   typedef [unique] IPersist *LPPERSIST;
476
477   HRESULT GetClassID(
478     [out] CLSID *pClassID);
479 }
480
481 [
482   object,
483   uuid(00000109-0000-0000-C000-000000000046),
484   pointer_default(unique)
485 ]
486 interface IPersistStream : IPersist
487 {
488   typedef [unique] IPersistStream *LPPERSISTSTREAM;
489
490   HRESULT IsDirty();
491
492   HRESULT Load(
493     [in, unique] IStream *pStm);
494
495   HRESULT Save(
496     [in, unique] IStream *pStm,
497     [in] BOOL fClearDirty);
498
499   HRESULT GetSizeMax(
500     [out] ULARGE_INTEGER *pcbSize);
501 }
502
503 [
504   object,
505   uuid(0000000f-0000-0000-C000-000000000046),
506   pointer_default(unique)
507 ]
508 interface IMoniker : IPersistStream
509 {
510   typedef [unique] IMoniker *LPMONIKER;
511
512   typedef enum tagMKSYS {
513     MKSYS_NONE             = 0,
514     MKSYS_GENERICCOMPOSITE = 1,
515     MKSYS_FILEMONIKER      = 2,
516     MKSYS_ANTIMONIKER      = 3,
517     MKSYS_ITEMMONIKER      = 4,
518     MKSYS_POINTERMONIKER   = 5,
519     MKSYS_CLASSMONIKER     = 7
520   } MKSYS;
521
522   typedef [v1_enum] enum tagMKREDUCE {
523     MKRREDUCE_ONE         = 3 << 16,
524     MKRREDUCE_TOUSER      = 2 << 16,
525     MKRREDUCE_THROUGHUSER = 1 << 16,
526     MKRREDUCE_ALL         = 0
527   } MKRREDUCE;
528
529   [local]
530   HRESULT BindToObject(
531     [in, unique] IBindCtx *pbc,
532     [in, unique] IMoniker *pmkToLeft,
533     [in] REFIID riidResult,
534     [out, iid_is(riidResult)] void **ppvResult);
535
536   [call_as(BindToObject)]
537   HRESULT RemoteBindToObject(
538     [in, unique] IBindCtx *pbc,
539     [in, unique] IMoniker *pmkToLeft,
540     [in] REFIID riidResult,
541     [out, iid_is(riidResult)] IUnknown **ppvResult);
542
543   [local]
544   HRESULT BindToStorage(
545     [in, unique] IBindCtx *pbc,
546     [in, unique] IMoniker *pmkToLeft,
547     [in] REFIID riid,
548     [out, iid_is(riid)] void **ppvObj);
549
550   [call_as(BindToStorage)]
551   HRESULT RemoteBindToStorage(
552     [in, unique] IBindCtx *pbc,
553     [in, unique] IMoniker *pmkToLeft,
554     [in] REFIID riid,
555     [out, iid_is(riid)] IUnknown **ppvObj);
556
557   HRESULT Reduce(
558     [in, unique] IBindCtx *pbc,
559     [in] DWORD dwReduceHowFar,
560     [in, out, unique] IMoniker **ppmkToLeft,
561     [out] IMoniker **ppmkReduced);
562
563   HRESULT ComposeWith(
564     [in, unique] IMoniker *pmkRight,
565     [in] BOOL fOnlyIfNotGeneric,
566     [out] IMoniker **ppmkComposite);
567
568   HRESULT Enum(
569     [in] BOOL fForward,
570     [out] IEnumMoniker **ppenumMoniker);
571
572   HRESULT IsEqual(
573     [in, unique] IMoniker *pmkOtherMoniker);
574
575   HRESULT Hash(
576     [out] DWORD *pdwHash);
577
578   HRESULT IsRunning(
579     [in, unique] IBindCtx *pbc,
580     [in, unique] IMoniker *pmkToLeft,
581     [in, unique] IMoniker *pmkNewlyRunning);
582
583   HRESULT GetTimeOfLastChange(
584     [in, unique] IBindCtx *pbc,
585     [in, unique] IMoniker *pmkToLeft,
586     [out] FILETIME *pFileTime);
587
588   HRESULT Inverse(
589     [out] IMoniker **ppmk);
590
591   HRESULT CommonPrefixWith(
592     [in, unique] IMoniker *pmkOther,
593     [out] IMoniker **ppmkPrefix);
594
595   HRESULT RelativePathTo(
596     [in, unique] IMoniker *pmkOther,
597     [out] IMoniker **ppmkRelPath);
598
599   HRESULT GetDisplayName(
600     [in, unique] IBindCtx *pbc,
601     [in, unique] IMoniker *pmkToLeft,
602     [out] LPOLESTR *ppszDisplayName);
603
604   HRESULT ParseDisplayName(
605     [in, unique] IBindCtx *pbc,
606     [in, unique] IMoniker *pmkToLeft,
607     [in] LPOLESTR pszDisplayName,
608     [out] ULONG *pchEaten,
609     [out] IMoniker **ppmkOut);
610
611   HRESULT IsSystemMoniker(
612     [out] DWORD *pdwMksys);
613 }
614
615 [
616   object,
617   uuid(f29f6bc0-5021-11ce-aa15-00006901293f),
618   pointer_default(unique)
619 ]
620 interface IROTData : IUnknown
621 {
622   HRESULT GetComparisonData(
623     [out, size_is(cbMax)] byte *pbData,
624     [in] ULONG cbMax,
625     [out] ULONG *pcbData);
626 }
627
628 [
629   object,
630   uuid(00000101-0000-0000-C000-000000000046),
631   pointer_default(unique)
632 ]
633 interface IEnumString : IUnknown
634 {
635   typedef [unique] IEnumString *LPENUMSTRING;
636
637   [local]
638   HRESULT Next(
639     [in] ULONG celt,
640     [out, size_is(celt), length_is(*pceltFetched)]
641     LPOLESTR *rgelt,
642     [out] ULONG *pceltFetched);
643
644   [call_as(Next)]
645   HRESULT RemoteNext(
646     [in] ULONG celt,
647     [out, size_is(celt), length_is(*pceltFetched)]
648     LPOLESTR *rgelt,
649     [out] ULONG *pceltFetched);
650
651   HRESULT Skip(
652     [in] ULONG celt);
653
654   HRESULT Reset();
655
656   HRESULT Clone(
657     [out] IEnumString **ppenum);
658 }
659
660 [
661   object,
662   uuid(00000140-0000-0000-C000-000000000046)
663 ]
664 interface IClassActivator : IUnknown
665 {
666   HRESULT GetClassObject(
667     [in] REFCLSID rclsid,
668     [in] DWORD dwClassContext,
669     [in] LCID locale,
670     [in] REFIID riid,
671     [out, iid_is(riid)] void **ppv);
672 }
673
674 /******************** Storage ********************/
675
676 [
677   object,
678   uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
679   pointer_default(unique)
680 ]
681 interface ISequentialStream : IUnknown
682 {
683   [local]
684   HRESULT Read(
685     [out, size_is(cb), length_is(*pcbRead)]
686     void *pv,
687     [in] ULONG cb,
688     [out] ULONG *pcbRead);
689
690   [call_as(Read)]
691   HRESULT RemoteRead(
692     [out, size_is(cb), length_is(*pcbRead)]
693     byte *pv,
694     [in] ULONG cb,
695     [out] ULONG *pcbRead);
696
697   [local]
698   HRESULT Write(
699     [in, size_is(cb)] const void *pv,
700     [in] ULONG cb,
701     [out] ULONG *pcbWritten);
702
703   [call_as(Write)]
704   HRESULT RemoteWrite(
705     [in, size_is(cb)] const byte *pv,
706     [in] ULONG cb,
707     [out] ULONG *pcbWritten);
708 }
709
710 [
711   object,
712   uuid(0000000c-0000-0000-C000-000000000046),
713   pointer_default(unique)
714 ]
715 interface IStream : ISequentialStream
716 {
717   typedef [unique] IStream *LPSTREAM;
718
719   typedef struct tagSTATSTG {
720     LPOLESTR pwcsName;
721     DWORD type;
722     ULARGE_INTEGER cbSize;
723     FILETIME mtime;
724     FILETIME ctime;
725     FILETIME atime;
726     DWORD grfMode;
727     DWORD grfLocksSupported;
728     CLSID clsid;
729     DWORD grfStateBits;
730     DWORD reserved;
731   } STATSTG;
732
733   typedef enum tagSTGTY {
734     STGTY_STORAGE   = 1,
735     STGTY_STREAM    = 2,
736     STGTY_LOCKBYTES = 3,
737     STGTY_PROPERTY  = 4
738   } STGTY;
739
740   typedef enum tagSTREAM_SEEK {
741     STREAM_SEEK_SET = 0,
742     STREAM_SEEK_CUR = 1,
743     STREAM_SEEK_END = 2
744   } STREAM_SEEK;
745
746   /* these are defined in Linux's fcntl.h,
747    * undefine them to avoid conflicts */
748   cpp_quote("#undef LOCK_MAND")
749   cpp_quote("#undef LOCK_READ")
750   cpp_quote("#undef LOCK_WRITE")
751   cpp_quote("#undef LOCK_RW")
752
753   typedef enum tagLOCKTYPE {
754     LOCK_WRITE      = 1,
755     LOCK_EXCLUSIVE  = 2,
756     LOCK_ONLYONCE   = 4
757   } LOCKTYPE;
758
759   [local]
760   HRESULT Seek(
761     [in] LARGE_INTEGER dlibMove,
762     [in] DWORD dwOrigin,
763     [out] ULARGE_INTEGER *plibNewPosition);
764
765   [call_as(Seek)]
766   HRESULT RemoteSeek(
767     [in] LARGE_INTEGER dlibMove,
768     [in] DWORD dwOrigin,
769     [out] ULARGE_INTEGER *plibNewPosition);
770
771   HRESULT SetSize(
772     [in] ULARGE_INTEGER libNewSize);
773
774   [local]
775   HRESULT CopyTo(
776     [in, unique] IStream *pstm,
777     [in] ULARGE_INTEGER cb,
778     [out] ULARGE_INTEGER *pcbRead,
779     [out] ULARGE_INTEGER *pcbWritten);
780
781   [call_as(CopyTo)]
782   HRESULT RemoteCopyTo(
783     [in, unique] IStream *pstm,
784     [in] ULARGE_INTEGER cb,
785     [out] ULARGE_INTEGER *pcbRead,
786     [out] ULARGE_INTEGER *pcbWritten);
787
788   HRESULT Commit(
789     [in] DWORD grfCommitFlags);
790
791   HRESULT Revert();
792
793   HRESULT LockRegion(
794     [in] ULARGE_INTEGER libOffset,
795     [in] ULARGE_INTEGER cb,
796     [in] DWORD dwLockType);
797
798   HRESULT UnlockRegion(
799     [in] ULARGE_INTEGER libOffset,
800     [in] ULARGE_INTEGER cb,
801     [in] DWORD dwLockType);
802
803   HRESULT Stat(
804     [out] STATSTG *pstatstg,
805     [in] DWORD grfStatFlag);
806
807   HRESULT Clone(
808     [out] IStream **ppstm);
809 }
810
811 [
812   object,
813   uuid(0000000d-0000-0000-C000-000000000046),
814   pointer_default(unique)
815 ]
816 interface IEnumSTATSTG : IUnknown
817 {
818   typedef [unique] IEnumSTATSTG *LPENUMSTATSTG;
819
820   [local]
821   HRESULT Next(
822     [in] ULONG celt,
823     [out, size_is(celt), length_is(*pceltFetched)]
824     STATSTG *rgelt,
825     [out] ULONG *pceltFetched);
826
827   [call_as(Next)]
828   HRESULT RemoteNext(
829     [in] ULONG celt,
830     [out, size_is(celt), length_is(*pceltFetched)]
831     STATSTG *rgelt,
832     [out] ULONG *pceltFetched);
833
834   HRESULT Skip(
835     [in] ULONG celt);
836
837   HRESULT Reset();
838
839   HRESULT Clone(
840     [out] IEnumSTATSTG **ppenum);
841 }
842
843 [
844   object,
845   uuid(0000000b-0000-0000-C000-000000000046),
846   pointer_default(unique)
847 ]
848 interface IStorage : IUnknown
849 {
850   typedef [unique] IStorage *LPSTORAGE;
851
852   typedef struct tagRemSNB {
853     unsigned long ulCntStr;
854     unsigned long ulCntChar;
855     [size_is(ulCntChar)] OLECHAR rgString[];
856   } RemSNB;
857
858   typedef [unique] RemSNB *wireSNB;
859   typedef [wire_marshal(wireSNB)] OLECHAR **SNB;
860
861   HRESULT CreateStream(
862     [in] LPCOLESTR pwcsName,
863     [in] DWORD grfMode,
864     [in] DWORD reserved1,
865     [in] DWORD reserved2,
866     [out] IStream **ppstm);
867
868   [local]
869   HRESULT OpenStream(
870     [in] LPCOLESTR pwcsName,
871     [in, unique] void *reserved1,
872     [in] DWORD grfMode,
873     [in] DWORD reserved2,
874     [out] IStream **ppstm);
875
876   [call_as(OpenStream)]
877   HRESULT RemoteOpenStream(
878     [in] LPCOLESTR pwcsName,
879     [in] unsigned long cbReserved1,
880     [in, unique, size_is(cbReserved1)] byte *reserved1,
881     [in] DWORD grfMode,
882     [in] DWORD reserved2,
883     [out] IStream **ppstm);
884
885   HRESULT CreateStorage(
886     [in] LPCOLESTR pwcsName,
887     [in] DWORD grfMode,
888     [in] DWORD dwStgFmt,
889     [in] DWORD reserved2,
890     [out] IStorage **ppstg);
891
892   HRESULT OpenStorage(
893     [in, unique] LPCOLESTR pwcsName,
894     [in, unique] IStorage *pstgPriority,
895     [in] DWORD grfMode,
896     [in, unique] SNB snbExclude,
897     [in] DWORD reserved,
898     [out] IStorage **ppstg);
899
900   HRESULT CopyTo(
901     [in] DWORD ciidExclude,
902     [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
903     [in, unique] SNB snbExclude,
904     [in, unique] IStorage *pstgDest);
905
906   HRESULT MoveElementTo(
907     [in] LPCOLESTR pwcsName,
908     [in, unique] IStorage *pstgDest,
909     [in] LPCOLESTR pwcsNewName,
910     [in] DWORD grfFlags);
911
912   HRESULT Commit(
913     [in] DWORD grfCommitFlags);
914
915   HRESULT Revert();
916
917   [local]
918   HRESULT EnumElements(
919     [in] DWORD reserved1,
920     [in, unique, size_is(1)] void *reserved2,
921     [in] DWORD reserved3,
922     [out] IEnumSTATSTG **ppenum);
923
924   [call_as(EnumElements)]
925   HRESULT RemoteEnumElements(
926     [in] DWORD reserved1,
927     [in] unsigned long cbReserved2,
928     [in, unique, size_is(cbReserved2)] byte *reserved2,
929     [in] DWORD reserved3,
930     [out] IEnumSTATSTG **ppenum);
931
932   HRESULT DestroyElement(
933     [in] LPCOLESTR pwcsName);
934
935   HRESULT RenameElement(
936     [in] LPCOLESTR pwcsOldName,
937     [in] LPCOLESTR pwcsNewName);
938
939   HRESULT SetElementTimes(
940     [in, unique] LPCOLESTR pwcsName,
941     [in, unique] const FILETIME *pctime,
942     [in, unique] const FILETIME *patime,
943     [in, unique] const FILETIME *pmtime);
944
945   HRESULT SetClass(
946     [in] REFCLSID clsid);
947
948   HRESULT SetStateBits(
949     [in] DWORD grfStateBits,
950     [in] DWORD grfMask);
951
952   HRESULT Stat(
953     [out] STATSTG *pstatstg,
954     [in] DWORD grfStatFlag);
955 }
956
957 [
958   object,
959   uuid(0000010b-0000-0000-C000-000000000046),
960   pointer_default(unique)
961 ]
962 interface IPersistFile : IPersist
963 {
964   typedef [unique] IPersistFile *LPPERSISTFILE;
965
966   HRESULT IsDirty();
967
968   HRESULT Load(
969     [in] LPCOLESTR pszFileName,
970     [in] DWORD dwMode);
971
972   HRESULT Save(
973     [in, unique] LPCOLESTR pszFileName,
974     [in] BOOL fRemember);
975
976   HRESULT SaveCompleted(
977     [in, unique] LPCOLESTR pszFileName);
978
979   HRESULT GetCurFile(
980     [out] LPOLESTR *ppszFileName);
981 }
982
983 [
984   object,
985   uuid(0000010a-0000-0000-C000-000000000046),
986   pointer_default(unique)
987 ]
988 interface IPersistStorage : IPersist
989 {
990   typedef [unique] IPersistStorage *LPPERSISTSTORAGE;
991
992   HRESULT IsDirty();
993
994   HRESULT InitNew(
995     [in, unique] IStorage *pStg);
996
997   HRESULT Load(
998     [in, unique] IStorage *pStg);
999
1000   HRESULT Save(
1001     [in, unique] IStorage *pStgSave,
1002     [in] BOOL fSameAsLoad);
1003
1004   HRESULT SaveCompleted(
1005     [in, unique] IStorage *pStgNew);
1006
1007   HRESULT HandsOffStorage();
1008 }
1009
1010 [
1011   object,
1012   uuid(00000012-0000-0000-C000-000000000046),
1013   pointer_default(unique)
1014 ]
1015 interface IRootStorage : IUnknown
1016 {
1017   typedef [unique] IRootStorage *LPROOTSTORAGE;
1018
1019   HRESULT SwitchToFile(
1020     [in] LPOLESTR pszFile);
1021 }
1022
1023 [
1024   object,
1025   uuid(0000000a-0000-0000-C000-000000000046),
1026   pointer_default(unique)
1027 ]
1028 interface ILockBytes : IUnknown
1029 {
1030   typedef [unique] ILockBytes *LPLOCKBYTES;
1031
1032   [local]
1033   HRESULT ReadAt(
1034     [in] ULARGE_INTEGER ulOffset,
1035     [out, size_is(cb), length_is(*pcbRead)]
1036     void *pv,
1037     [in] ULONG cb,
1038     [out] ULONG *pcbRead);
1039
1040   [call_as(ReadAt)]
1041   HRESULT RemoteReadAt(
1042     [in] ULARGE_INTEGER ulOffset,
1043     [out, size_is(cb), length_is(*pcbRead)]
1044     byte *pv,
1045     [in] ULONG cb,
1046     [out] ULONG *pcbRead);
1047
1048   [local]
1049   HRESULT WriteAt(
1050     [in] ULARGE_INTEGER ulOffset,
1051     [in, size_is(cb)] const void *pv,
1052     [in] ULONG cb,
1053     [out] ULONG *pcbWritten);
1054
1055   [call_as(WriteAt)]
1056   HRESULT RemoteWriteAt(
1057     [in] ULARGE_INTEGER ulOffset,
1058     [in, size_is(cb)] const byte *pv,
1059     [in] ULONG cb,
1060     [out] ULONG *pcbWritten);
1061
1062   HRESULT Flush();
1063
1064   HRESULT SetSize(
1065     [in] ULARGE_INTEGER cb);
1066
1067   HRESULT LockRegion(
1068     [in] ULARGE_INTEGER libOffset,
1069     [in] ULARGE_INTEGER cb,
1070     [in] DWORD dwLockType);
1071
1072   HRESULT UnlockRegion(
1073     [in] ULARGE_INTEGER libOffset,
1074     [in] ULARGE_INTEGER cb,
1075     [in] DWORD dwLockType);
1076
1077   HRESULT Stat(
1078     [out] STATSTG *pstatstg,
1079     [in] DWORD grfStatFlag);
1080 }
1081
1082 [
1083   object,
1084   uuid(99caf010-415e-11cf-8814-00aa00b569f5),
1085   pointer_default(unique)
1086 ]
1087 interface IFillLockBytes : IUnknown
1088 {
1089   [local]
1090   HRESULT FillAppend(
1091     [in, size_is(cb)] const void *pv,
1092     [in] ULONG cb,
1093     [out] ULONG *pcbWritten);
1094
1095   [call_as(FillAppend)]
1096   HRESULT RemoteFillAppend(
1097     [in, size_is(cb)] const byte *pv,
1098     [in] ULONG cb,
1099     [out] ULONG *pcbWritten);
1100
1101   [local]
1102   HRESULT FillAt(
1103     [in] ULARGE_INTEGER ulOffset,
1104     [in, size_is(cb)] const void *pv,
1105     [in] ULONG cb,
1106     [out] ULONG *pcbWritten);
1107
1108   [call_as(FillAt)]
1109   HRESULT RemoteFillAt(
1110     [in] ULARGE_INTEGER ulOffset,
1111     [in, size_is(cb)] const byte *pv,
1112     [in] ULONG cb,
1113     [out] ULONG *pcbWritten);
1114
1115   HRESULT SetFillSize(
1116     [in] ULARGE_INTEGER ulSize);
1117
1118   HRESULT Terminate(
1119     [in] BOOL bCanceled);
1120 }
1121
1122 [
1123   object,
1124   uuid(a9d758a0-4617-11cf-95fc-00aa00680db4),
1125   pointer_default(unique)
1126 ]
1127 interface IProgressNotify : IUnknown
1128 {
1129   HRESULT OnProgress(
1130     [in] DWORD dwProgressCurrent,
1131     [in] DWORD dwProgressMaximum,
1132     [in] BOOL fAccurate,
1133     [in] BOOL fOwner);
1134 }
1135
1136 [
1137   local,
1138   object,
1139   uuid(0e6d4d90-6738-11cf-9608-00aa00680db4),
1140   pointer_default(unique)
1141 ]
1142 interface ILayoutStorage : IUnknown
1143 {
1144   typedef struct tagStorageLayout {
1145     DWORD LayoutType;
1146     OLECHAR *pwcsElementName;
1147     LARGE_INTEGER cOffset;
1148     LARGE_INTEGER cBytes;
1149   } StorageLayout;
1150
1151   HRESULT LayoutScript(
1152     [in] StorageLayout *pStorageLayout,
1153     [in] DWORD nEntries,
1154     [in] DWORD glfInterleavedFlag);
1155
1156   HRESULT BeginMonitor();
1157
1158   HRESULT EndMonitor();
1159
1160   HRESULT ReLayoutDocfile(
1161     [in] OLECHAR *pwcsNewDfName);
1162
1163   HRESULT ReLayoutDocfileOnILockBytes(
1164     [in] ILockBytes *pILockBytes);
1165 }
1166
1167 /******************** Data Object ********************/
1168
1169 [
1170   object,
1171   uuid(00000103-0000-0000-C000-000000000046),
1172   pointer_default(unique)
1173 ]
1174 interface IEnumFORMATETC : IUnknown
1175 {
1176   typedef [unique] IEnumFORMATETC *LPENUMFORMATETC;
1177
1178   typedef struct tagDVTARGETDEVICE {
1179     DWORD tdSize;
1180     WORD tdDriverNameOffset;
1181     WORD tdDeviceNameOffset;
1182     WORD tdPortNameOffset;
1183     WORD tdExtDevmodeOffset;
1184     [size_is(tdSize - sizeof(DWORD) - 4*sizeof(WORD))]
1185     BYTE tdData[];
1186   } DVTARGETDEVICE;
1187
1188   typedef CLIPFORMAT *LPCLIPFORMAT;
1189
1190   typedef struct tagFORMATETC {
1191     CLIPFORMAT cfFormat;
1192     [unique] DVTARGETDEVICE *ptd;
1193     DWORD dwAspect;
1194     LONG lindex;
1195     DWORD tymed;
1196   } FORMATETC, *LPFORMATETC;
1197
1198   [local]
1199   HRESULT Next(
1200     [in] ULONG celt,
1201     [out, size_is(celt), length_is(*pceltFetched)]
1202     FORMATETC *rgelt,
1203     [out] ULONG *pceltFetched);
1204
1205   [call_as(Next)]
1206   HRESULT RemoteNext(
1207     [in] ULONG celt,
1208     [out, size_is(celt), length_is(*pceltFetched)]
1209     FORMATETC *rgelt,
1210     [out] ULONG *pceltFetched);
1211
1212   HRESULT Skip(
1213     [in] ULONG celt);
1214
1215   HRESULT Reset();
1216
1217   HRESULT Clone(
1218     [out] IEnumFORMATETC **ppenum);
1219 }
1220
1221 [
1222   object,
1223   uuid(00000105-0000-0000-C000-000000000046),
1224   pointer_default(unique)
1225 ]
1226 interface IEnumSTATDATA : IUnknown
1227 {
1228   typedef [unique] IEnumSTATDATA *LPENUMSTATDATA;
1229
1230   typedef enum tagADVF {
1231     ADVF_NODATA            = 1,
1232     ADVF_PRIMEFIRST        = 2,
1233     ADVF_ONLYONCE          = 4,
1234     ADVF_DATAONSTOP        = 64,
1235     ADVFCACHE_NOHANDLER    = 8,
1236     ADVFCACHE_FORCEBUILTIN = 16,
1237     ADVFCACHE_ONSAVE       = 32
1238   } ADVF;
1239
1240   typedef struct tagSTATDATA
1241   {
1242     FORMATETC formatetc;
1243     DWORD advf;
1244     [unique] IAdviseSink *pAdvSink;
1245     DWORD dwConnection;
1246   } STATDATA, *LPSTATDATA;
1247
1248   [local]
1249   HRESULT Next(
1250     [in] ULONG celt,
1251     [out, size_is(celt), length_is(*pceltFetched)]
1252     STATDATA *rgelt,
1253     [out] ULONG *pceltFetched);
1254
1255   [call_as(Next)]
1256   HRESULT RemoteNext(
1257     [in] ULONG celt,
1258     [out, size_is(celt), length_is(*pceltFetched)]
1259     STATDATA *rgelt,
1260     [out] ULONG *pceltFetched);
1261
1262   HRESULT Skip(
1263     [in] ULONG celt);
1264
1265   HRESULT Reset();
1266
1267   HRESULT Clone(
1268     [out] IEnumSTATDATA **ppenum);
1269 }
1270
1271 [
1272   object,
1273   uuid(0000010f-0000-0000-C000-000000000046),
1274   pointer_default(unique)
1275 ]
1276 interface IAdviseSink : IUnknown
1277 {
1278   typedef IAdviseSink *LPADVISESINK;
1279
1280   typedef [v1_enum] enum tagTYMED {
1281     TYMED_HGLOBAL  = 1,
1282     TYMED_FILE     = 2,
1283     TYMED_ISTREAM  = 4,
1284     TYMED_ISTORAGE = 8,
1285     TYMED_GDI      = 16,
1286     TYMED_MFPICT   = 32,
1287     TYMED_ENHMF    = 64,
1288     TYMED_NULL     = 0
1289   } TYMED;
1290
1291   typedef struct tagRemSTGMEDIUM {
1292     DWORD tymed;
1293     DWORD dwHandleType;
1294     unsigned long pData;
1295     unsigned long pUnkForRelease;
1296     unsigned long cbData;
1297     [size_is(cbData)] byte data[];
1298   } RemSTGMEDIUM;
1299
1300   /* FIXME: C/C++ nameless union version */
1301   typedef struct tagSTGMEDIUM {
1302     DWORD tymed;
1303     [switch_is(tymed)] union {
1304     [case(TYMED_GDI)]      HBITMAP hBitmap;
1305     [case(TYMED_MFPICT)]   HMETAFILEPICT hMetaFilePict;
1306     [case(TYMED_ENHMF)]    HENHMETAFILE hEnhMetaFile;
1307     [case(TYMED_HGLOBAL)]  HGLOBAL hGlobal;
1308     [case(TYMED_FILE)]     LPOLESTR lpszFileName;
1309     [case(TYMED_ISTREAM)]  IStream *pstm;
1310     [case(TYMED_ISTORAGE)] IStorage *pstg;
1311     [default]              ;
1312     };
1313     [unique] IUnknown *pUnkForRelease;
1314   } uSTGMEDIUM;
1315
1316 /* copied from wingdi.h */
1317 #define OBJ_PEN             1
1318 #define OBJ_BRUSH           2
1319 #define OBJ_DC              3
1320 #define OBJ_METADC          4
1321 #define OBJ_PAL             5
1322 #define OBJ_FONT            6
1323 #define OBJ_BITMAP          7
1324 #define OBJ_REGION          8
1325 #define OBJ_METAFILE        9
1326 #define OBJ_MEMDC           10
1327 #define OBJ_EXTPEN          11
1328 #define OBJ_ENHMETADC       12
1329 #define OBJ_ENHMETAFILE     13
1330
1331   typedef union _GDI_OBJECT switch(DWORD ObjectType) u {
1332     case OBJ_BITMAP: wireHBITMAP hBitmap;
1333     case OBJ_PAL:    wireHPALETTE hPalette;
1334     default:         wireHGLOBAL hGeneric;
1335   } GDI_OBJECT;
1336
1337   typedef struct _userSTGMEDIUM {
1338     union switch(DWORD tymed) u {
1339     case TYMED_NULL:     ;
1340     case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
1341     case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
1342     case TYMED_GDI:      GDI_OBJECT *hGdiHandle;
1343     case TYMED_HGLOBAL:  wireHGLOBAL hGlobal;
1344     case TYMED_FILE:     LPOLESTR lpszFileName;
1345     case TYMED_ISTREAM:  BYTE_BLOB *pstm;
1346     case TYMED_ISTORAGE: BYTE_BLOB *pstg;
1347     };
1348     IUnknown *pUnkForRelease;
1349   } userSTGMEDIUM;
1350
1351   typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
1352   typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
1353
1354   typedef [unique] userSTGMEDIUM *wireASYNC_STGMEDIUM;
1355   typedef [wire_marshal(wireASYNC_STGMEDIUM)] STGMEDIUM ASYNC_STGMEDIUM;
1356
1357   typedef STGMEDIUM *LPSTGMEDIUM;
1358
1359   typedef struct _userFLAG_STGMEDIUM {
1360     long ContextFlags;
1361     long fPassOwnership;
1362     userSTGMEDIUM Stgmed;
1363   } userFLAG_STGMEDIUM;
1364
1365   typedef [unique] userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
1366
1367   typedef [wire_marshal(wireFLAG_STGMEDIUM)] struct _FLAG_STGMEDIUM {
1368     long ContextFlags;
1369     long fPassOwnership;
1370     STGMEDIUM Stgmed;
1371   } FLAG_STGMEDIUM;
1372
1373   [local]
1374   void OnDataChange(
1375     [in, unique] FORMATETC *pFormatetc,
1376     [in, unique] STGMEDIUM *pStgmed);
1377
1378   [call_as(OnDataChange), async]
1379   HRESULT  RemoteOnDataChange(
1380     [in] IAsyncManager **ppIAM,
1381     [in, unique] FORMATETC *pFormatetc,
1382     [in, unique] ASYNC_STGMEDIUM *pStgmed);
1383
1384   [local]
1385   void OnViewChange(
1386     [in] DWORD dwAspect,
1387     [in] LONG lindex);
1388
1389   [call_as(OnViewChange), async]
1390   HRESULT RemoteOnViewChange(
1391     [in] IAsyncManager **ppIAM,
1392     [in] DWORD dwAspect,
1393     [in] LONG lindex);
1394
1395   [local]
1396   void OnRename(
1397     [in] IMoniker *pmk);
1398
1399   [call_as(OnRename), async]
1400   HRESULT RemoteOnRename(
1401     [in] IAsyncManager **ppIAM,
1402     [in] IMoniker *pmk);
1403
1404   [local]
1405   void OnSave();
1406
1407   [call_as(OnSave), async]
1408   HRESULT RemoteOnSave(
1409     [in] IAsyncManager **ppIAM);
1410
1411   [local]
1412   void OnClose();
1413
1414   [call_as(OnClose)]
1415   HRESULT RemoteOnClose();
1416 }
1417
1418 [
1419   object,
1420   uuid(00000125-0000-0000-C000-000000000046),
1421   pointer_default(unique)
1422 ]
1423 interface IAdviseSink2 : IAdviseSink
1424 {
1425   typedef [unique] IAdviseSink2 *LPADVISESINK2;
1426
1427   [local]
1428   void OnLinkSrcChange(
1429     [in, unique] IMoniker *pmk);
1430
1431   [call_as(OnLinkSrcChange), async]
1432   HRESULT RemoteOnLinkSrcChange(
1433     [in] IAsyncManager **ppIAM,
1434     [in, unique] IMoniker *pmk);
1435 }
1436
1437 [
1438   object,
1439   uuid(0000010e-0000-0000-C000-000000000046),
1440   pointer_default(unique)
1441 ]
1442 interface IDataObject : IUnknown
1443 {
1444   typedef [unique] IDataObject *LPDATAOBJECT;
1445
1446   typedef enum tagDATADIR {
1447     DATADIR_GET = 1,
1448     DATADIR_SET = 2
1449   } DATADIR;
1450
1451   [local]
1452   HRESULT GetData(
1453     [in, unique] FORMATETC *pformatetcIn,
1454     [out] STGMEDIUM *pmedium);
1455
1456   [call_as(GetData)]
1457   HRESULT RemoteGetData(
1458     [in, unique] FORMATETC *pformatetcIn,
1459     [out] STGMEDIUM *pRemoteMedium);
1460
1461   [local]
1462   HRESULT GetDataHere(
1463     [in, unique] FORMATETC *pformatetc,
1464     [in, out] STGMEDIUM *pmedium);
1465
1466   [call_as(GetDataHere)]
1467   HRESULT RemoteGetDataHere(
1468     [in, unique] FORMATETC *pformatetc,
1469     [in, out] STGMEDIUM *pRemoteMedium);
1470
1471   HRESULT QueryGetData(
1472     [in, unique] FORMATETC *pformatetc);
1473
1474   HRESULT GetCanonicalFormatEtc(
1475     [in, unique] FORMATETC *pformatectIn,
1476     [out] FORMATETC *pformatetcOut);
1477
1478   [local]
1479   HRESULT SetData(
1480     [in, unique] FORMATETC *pformatetc,
1481     [in, unique] STGMEDIUM *pmedium,
1482     [in] BOOL fRelease);
1483
1484   [call_as(SetData)]
1485   HRESULT RemoteSetData(
1486     [in, unique] FORMATETC *pformatetc,
1487     [in, unique] FLAG_STGMEDIUM *pmedium,
1488     [in] BOOL fRelease);
1489
1490   HRESULT EnumFormatEtc(
1491     [in] DWORD dwDirection,
1492     [out] IEnumFORMATETC **ppenumFormatEtc);
1493
1494   HRESULT DAdvise(
1495     [in] FORMATETC *pformatetc,
1496     [in] DWORD advf,
1497     [in, unique] IAdviseSink *pAdvSink,
1498     [out] DWORD *pdwConnection);
1499
1500   HRESULT DUnadvise(
1501     [in] DWORD dwConnection);
1502
1503   HRESULT EnumDAdvise(
1504     [out] IEnumSTATDATA **ppenumAdvise);
1505 }
1506
1507 [
1508   local,
1509   object,
1510   uuid(00000110-0000-0000-C000-000000000046)
1511 ]
1512 interface IDataAdviseHolder : IUnknown
1513 {
1514   typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
1515
1516   HRESULT Advise(
1517     [in, unique] IDataObject *pDataObject,
1518     [in, unique] FORMATETC *pFetc,
1519     [in] DWORD advf,
1520     [in, unique] IAdviseSink *pAdvise,
1521     [out] DWORD *pdwConnection);
1522
1523   HRESULT Unadvise(
1524     [in] DWORD dwConnection);
1525
1526   HRESULT EnumAdvise(
1527     [out] IEnumSTATDATA **ppenumAdvise);
1528
1529   HRESULT SendOnDataChange(
1530     [in, unique] IDataObject *pDataObject,
1531     [in] DWORD dwReserved,
1532     [in] DWORD advf);
1533 }
1534
1535 /******************** Remoting ********************/
1536
1537 [
1538   local,
1539   object,
1540   uuid(00000016-0000-0000-C000-000000000046)
1541 ]
1542 interface IMessageFilter : IUnknown
1543 {
1544   typedef [unique] IMessageFilter *LPMESSAGEFILTER;
1545
1546   typedef enum tagCALLTYPE {
1547     CALLTYPE_TOPLEVEL = 1,
1548     CALLTYPE_NESTED   = 2,
1549     CALLTYPE_ASYNC    = 3,
1550     CALLTYPE_TOPLEVEL_CALLPENDING = 4,
1551     CALLTYPE_ASYNC_CALLPENDING    = 5
1552   } CALLTYPE;
1553
1554   typedef enum tagSERVERCALL {
1555     SERVERCALL_ISHANDLED  = 0,
1556     SERVERCALL_REJECTED   = 1,
1557     SERVERCALL_RETRYLATER = 2
1558   } SERVERCALL;
1559
1560   typedef enum tagPENDINGTYPE {
1561     PENDINGTYPE_TOPLEVEL = 1,
1562     PENDINGTYPE_NESTED   = 2
1563   } PENDINGTYPE;
1564
1565   typedef enum tagPENDINGMSG {
1566     PENDINGMSG_CANCELCALL     = 0,
1567     PENDINGMSG_WAITNOPROCESS  = 1,
1568     PENDINGMSG_WAITDEFPROCESS = 2
1569   } PENDINGMSG;
1570
1571   typedef struct tagINTERFACEINFO {
1572     IUnknown *pUnk;
1573     IID iid;
1574     WORD wMethod;
1575   } INTERFACEINFO, *LPINTERFACEINFO;
1576
1577   DWORD HandleInComingCall(
1578     [in] DWORD dwCallType,
1579     [in] HTASK htaskCaller,
1580     [in] DWORD dwTickCount,
1581     [in] LPINTERFACEINFO lpInterfaceInfo);
1582
1583   DWORD RetryRejectedCall(
1584     [in] HTASK htaskCallee,
1585     [in] DWORD dwTickCount,
1586     [in] DWORD dwRejectType);
1587
1588   DWORD MessagePending(
1589     [in] HTASK htaskCallee,
1590     [in] DWORD dwTickCount,
1591     [in] DWORD dwPendingType);
1592 }
1593
1594 [
1595   local,
1596   object,
1597   uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
1598 ]
1599 interface IRpcChannelBuffer : IUnknown
1600 {
1601   typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
1602
1603   typedef unsigned long RPCOLEDATAREP;
1604
1605   typedef struct tagRPCOLEMESSAGE {
1606     void *reserved1;
1607     RPCOLEDATAREP dataRepresentation;
1608     void *Buffer;
1609     ULONG cbBuffer;
1610     ULONG iMethod;
1611     void *reserved2[5];
1612     ULONG rpcFlags;
1613   } RPCOLEMESSAGE;
1614
1615   typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
1616
1617   HRESULT GetBuffer(
1618     [in] RPCOLEMESSAGE *pMessage,
1619     [in] REFIID riid);
1620
1621   HRESULT SendReceive(
1622     [in,out] RPCOLEMESSAGE *pMessage,
1623     [out] ULONG *pStatus);
1624
1625   HRESULT FreeBuffer(
1626     [in] RPCOLEMESSAGE *pMessage);
1627
1628   HRESULT GetDestCtx(
1629     [out] DWORD *pdwDestContext,
1630     [out] void **ppvDestContext);
1631
1632   HRESULT IsConnected();
1633 }
1634
1635 [
1636   local,
1637   object,
1638   uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
1639 ]
1640 interface IRpcChannelBuffer2 : IRpcChannelBuffer
1641 {
1642   typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
1643
1644   HRESULT GetProtocolVersion(
1645     [in,out] DWORD *pdwVersion);
1646 }
1647
1648 [
1649   local,
1650   object,
1651   uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
1652 ]
1653 interface IRpcChannelBuffer3 : IRpcChannelBuffer2
1654 {
1655   typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
1656
1657   HRESULT Send(
1658     [in,out] RPCOLEMESSAGE *pMsg,
1659     [out] ULONG *pulStatus);
1660
1661   HRESULT Receive(
1662     [in,out] RPCOLEMESSAGE *pMsg,
1663     [in] ULONG ulSize,
1664     [out] ULONG *pulStatus);
1665
1666   HRESULT Cancel(
1667     [in] RPCOLEMESSAGE *pMsg);
1668
1669   HRESULT GetCallContext(
1670     [in] RPCOLEMESSAGE *pMsg,
1671     [in] REFIID riid,
1672     [out] void **pInterface);
1673
1674   HRESULT GetDestCtxEx(
1675     [in] RPCOLEMESSAGE *pMsg,
1676     [out] DWORD *pdwDestContext,
1677     [out] void **ppvDestContext);
1678
1679   HRESULT GetState(
1680     [in] RPCOLEMESSAGE *pMsg,
1681     [out] DWORD *pState);
1682
1683   HRESULT RegisterAsync(
1684     [in] RPCOLEMESSAGE *pMsg,
1685     [in] IAsyncManager *pAsyncMgr);
1686 }
1687
1688 [
1689   local,
1690   object,
1691   uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
1692 ]
1693 interface IRpcProxyBuffer : IUnknown
1694 {
1695   typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
1696
1697   HRESULT Connect(
1698     [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
1699
1700   void Disconnect();
1701 }
1702
1703 [
1704   local,
1705   object,
1706   uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
1707 ]
1708 interface IRpcStubBuffer : IUnknown
1709 {
1710   typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
1711
1712   HRESULT Connect(
1713     [in] IUnknown *pUnkServer);
1714
1715   void Disconnect();
1716
1717   HRESULT Invoke(
1718     [in] RPCOLEMESSAGE *_prpcmsg,
1719     [in] IRpcChannelBuffer *_pRpcChannelBuffer);
1720
1721   IRpcStubBuffer *IsIIDSupported(
1722     [in] REFIID riid);
1723
1724   ULONG CountRefs();
1725
1726   HRESULT DebugServerQueryInterface(
1727     void **ppv);
1728
1729   void DebugServerRelease(
1730     void *pv);
1731 }
1732
1733 [
1734   local,
1735   object,
1736   uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
1737 ]
1738 interface IPSFactoryBuffer : IUnknown
1739 {
1740   typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
1741
1742   HRESULT CreateProxy(
1743     [in] IUnknown *pUnkOuter,
1744     [in] REFIID riid,
1745     [out] IRpcProxyBuffer **ppProxy,
1746     [out] void **ppv);
1747
1748   HRESULT CreateStub(
1749     [in] REFIID riid,
1750     [in, unique] IUnknown *pUnkServer,
1751     [out] IRpcStubBuffer **ppStub);
1752 }
1753
1754 [
1755   local,
1756   object,
1757   uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
1758 ]
1759 interface IChannelHook : IUnknown
1760 {
1761   typedef [unique] IChannelHook *LPCHANNELHOOK;
1762
1763   typedef struct SChannelHookCallInfo {
1764     IID iid;
1765     DWORD cbSize;
1766     GUID uCausality;
1767     DWORD dwServerPid;
1768     DWORD iMethod;
1769     void *pObject;
1770   } SChannelHookCallInfo;
1771
1772   void ClientGetSize(
1773     [in] REFGUID uExtent,
1774     [in] REFIID riid,
1775     [out] ULONG *pDataSize);
1776
1777   void ClientFillBuffer(
1778     [in] REFGUID uExtent,
1779     [in] REFIID riid,
1780     [in, out] ULONG *pDataSize,
1781     [in] void *pDataBuffer);
1782
1783   void ClientNotify(
1784     [in] REFGUID uExtent,
1785     [in] REFIID riid,
1786     [in] ULONG cbDataSize,
1787     [in] void *pDataBuffer,
1788     [in] DWORD lDataRep,
1789     [in] HRESULT hrFault);
1790
1791   void ServerNotify(
1792     [in] REFGUID uExtent,
1793     [in] REFIID riid,
1794     [in] ULONG cbDataSize,
1795     [in] void *pDataBuffer,
1796     [in] DWORD lDataRep);
1797
1798   void ServerGetSize(
1799     [in] REFGUID uExtent,
1800     [in] REFIID riid,
1801     [in] HRESULT hrFault,
1802     [out] ULONG *pDataSize);
1803
1804   void ServerFillBuffer(
1805     [in] REFGUID uExtent,
1806     [in] REFIID riid,
1807     [in, out] ULONG *pDataSize,
1808     [in] void *pDataBuffer,
1809     [in] HRESULT hrFault );
1810 }
1811
1812 /******************** Property Storage ********************/
1813
1814 interface IEnumSTATPROPSTG;
1815 interface IEnumSTATPROPSETSTG;
1816
1817 [
1818   object,
1819   uuid(00000138-0000-0000-C000-000000000046),
1820   pointer_default(unique)
1821 ]
1822 interface IPropertyStorage : IUnknown
1823 {
1824   typedef [unique] IPropertyStorage *LPPROPERTYSTORAGE;
1825
1826   extern const FMTID FMTID_SummaryInformation;
1827   extern const FMTID FMTID_DocSummaryInformation;
1828   extern const FMTID FMTID_UserDefinedProperties;
1829
1830   const DWORD PROPSETFLAG_DEFAULT = 0;
1831   const DWORD PROPSETFLAG_NONSIMPLE = 1;
1832   const DWORD PROPSETFLAG_ANSI = 2;
1833   const DWORD PROPSETFLAG_UNBUFFERED = 4;
1834
1835   typedef struct tagPROPVARIANT PROPVARIANT;
1836
1837   #define TYPEDEF_CA(type, name) \
1838     typedef struct tag##name { \
1839       ULONG cElems; \
1840       [size_is(cElems)] \
1841       type *pElems; \
1842     } name
1843
1844   TYPEDEF_CA(unsigned char, CAUB);
1845   TYPEDEF_CA(short, CAI);
1846   TYPEDEF_CA(USHORT, CAUI);
1847   TYPEDEF_CA(long, CAL);
1848   TYPEDEF_CA(ULONG, CAUL);
1849   TYPEDEF_CA(float, CAFLT);
1850   TYPEDEF_CA(double, CADBL);
1851   TYPEDEF_CA(CY, CACY);
1852   TYPEDEF_CA(DATE, CADATE);
1853   TYPEDEF_CA(BSTR, CABSTR);
1854   TYPEDEF_CA(BSTRBLOB, CABSTRBLOB);
1855   TYPEDEF_CA(VARIANT_BOOL, CABOOL);
1856   TYPEDEF_CA(SCODE,  CASCODE);
1857   TYPEDEF_CA(PROPVARIANT, CAPROPVARIANT);
1858   TYPEDEF_CA(LARGE_INTEGER, CAH);
1859   TYPEDEF_CA(ULARGE_INTEGER, CAUH);
1860   TYPEDEF_CA(LPSTR, CALPSTR);
1861   TYPEDEF_CA(LPWSTR, CALPWSTR);
1862   TYPEDEF_CA(FILETIME, CAFILETIME);
1863   TYPEDEF_CA(CLIPDATA, CACLIPDATA);
1864   TYPEDEF_CA(CLSID, CACLSID);
1865
1866   struct tagPROPVARIANT {
1867     VARTYPE vt;
1868     WORD wReserved1;
1869     WORD wReserved2;
1870     WORD wReserved3;
1871     [switch_is(vt & 0x1fff)] union {
1872     [case(VT_EMPTY, VT_NULL)]             ;
1873     [case(VT_I1)]                         char cVal;
1874     [case(VT_UI1)]                        UCHAR bVal;
1875     [case(VT_I2)]                         short iVal;
1876     [case(VT_UI2)]                        USHORT uiVal;
1877     [case(VT_BOOL)]                       VARIANT_BOOL boolVal;
1878 #if 0 /* illegal in C++ */
1879     [case(VT_ILLEGAL)]                    _VARIANT_BOOL bool;
1880 #endif
1881     [case(VT_I4)]                         long lVal;
1882     [case(VT_UI4)]                        ULONG ulVal;
1883     [case(VT_R4)]                         float fltVal;
1884     [case(VT_ERROR)]                      SCODE scode;
1885     [case(VT_I8)]                         LARGE_INTEGER hVal;
1886     [case(VT_UI8)]                        ULARGE_INTEGER uhVal;
1887     [case(VT_R8)]                         double dblVal;
1888     [case(VT_CY)]                         CY cyVal;
1889     [case(VT_DATE)]                       DATE date;
1890     [case(VT_FILETIME)]                   FILETIME filetime;
1891     [case(VT_CLSID)]                      CLSID *puuid;
1892     [case(VT_BLOB, VT_BLOB_OBJECT)]       BLOB blob;
1893     [case(VT_CF)]                         CLIPDATA *pclipdata;
1894     [case(VT_STREAM, VT_STREAMED_OBJECT)] IStream *pStream;
1895     [case(VT_STORAGE, VT_STORED_OBJECT)]  IStorage *pStorage;
1896     [case(VT_BSTR)]                       BSTR bstrVal;
1897     [case(VT_BSTR_BLOB)]                  BSTRBLOB bstrblobVal;
1898     [case(VT_LPSTR)]                      LPSTR pszVal;
1899     [case(VT_LPWSTR)]                     LPWSTR pwszVal;
1900     [case(VT_UI1|VT_VECTOR)]              CAUB caub;
1901     [case(VT_I2|VT_VECTOR)]               CAI cai;
1902     [case(VT_UI2|VT_VECTOR)]              CAUI caui;
1903     [case(VT_BOOL|VT_VECTOR)]             CABOOL cabool;
1904     [case(VT_I4|VT_VECTOR)]               CAL cal;
1905     [case(VT_UI4|VT_VECTOR)]              CAUL caul;
1906     [case(VT_R4|VT_VECTOR)]               CAFLT caflt;
1907     [case(VT_ERROR|VT_VECTOR)]            CASCODE cascode;
1908     [case(VT_I8|VT_VECTOR)]               CAH cah;
1909     [case(VT_UI8|VT_VECTOR)]              CAUH cauh;
1910     [case(VT_R8|VT_VECTOR)]               CADBL cadbl;
1911     [case(VT_CY|VT_VECTOR)]               CACY cacy;
1912     [case(VT_DATE|VT_VECTOR)]             CADATE cadate;
1913     [case(VT_FILETIME|VT_VECTOR)]         CAFILETIME cafiletime;
1914     [case(VT_CLSID|VT_VECTOR)]            CACLSID cauuid;
1915     [case(VT_CF|VT_VECTOR)]               CACLIPDATA caclipdata;
1916     [case(VT_BSTR|VT_VECTOR)]             CABSTR cabstr;
1917     [case(VT_BSTR_BLOB|VT_VECTOR)]        CABSTRBLOB cabstrblob;
1918     [case(VT_LPSTR|VT_VECTOR)]            CALPSTR calpstr;
1919     [case(VT_LPWSTR|VT_VECTOR)]           CALPWSTR calpwstr;
1920     [case(VT_VARIANT|VT_VECTOR)]          CAPROPVARIANT capropvar;
1921     };
1922   };
1923
1924   typedef struct tagPROPVARIANT *LPPROPVARIANT;
1925
1926   /* FIXME: bunches of property IDs */
1927
1928   const ULONG PRSPEC_INVALID = 0xffffffff;
1929   const ULONG PRSPEC_LPWSTR = 0;
1930   const ULONG PRSPEC_PROPID = 1;
1931
1932   typedef struct tagPROPSPEC {
1933     ULONG ulKind;
1934     [switch_is(ulKind)] union {
1935     [case(PRSPEC_PROPID)] PROPID propid;
1936     [case(PRSPEC_LPWSTR)] LPOLESTR lpwstr;
1937     [default]             ;
1938     };
1939   } PROPSPEC;
1940
1941   typedef struct tagSTATPROPSTG {
1942     LPOLESTR lpwstrName;
1943     PROPID propid;
1944     VARTYPE vt;
1945   } STATPROPSTG;
1946
1947   /* FIXME: macros */
1948
1949   typedef struct tagSTATPROPSETSTG {
1950     FMTID fmtid;
1951     CLSID clsid;
1952     DWORD grfFlags;
1953     FILETIME mtime;
1954     FILETIME ctime;
1955     FILETIME atime;
1956     DWORD dwOSVersion;
1957   } STATPROPSETSTG;
1958
1959   HRESULT ReadMultiple(
1960     [in] ULONG cpspec,
1961     [in, size_is(cpspec)] const PROPSPEC rgpspec[],
1962     [out, size_is(cpspec)] PROPVARIANT rgpropvar[]);
1963
1964   HRESULT WriteMultiple(
1965     [in] ULONG cpspec,
1966     [in, size_is(cpspec)] const PROPSPEC rgpspec[],
1967     [in, size_is(cpspec)] const PROPVARIANT rgpropvar[],
1968     [in] PROPID propidNameFirst);
1969
1970   HRESULT DeleteMultiple(
1971     [in] ULONG cpspec,
1972     [in, size_is(cpspec)] const PROPSPEC rgpspec[]);
1973
1974   HRESULT ReadPropertyNames(
1975     [in] ULONG cpropid,
1976     [in, size_is(cpropid)] const PROPID rgpropid[],
1977     [out, size_is(cpropid)] LPOLESTR rglpwstrName[]);
1978
1979   HRESULT WritePropertyNames(
1980     [in] ULONG cpropid,
1981     [in, size_is(cpropid)] const PROPID rgpropid[],
1982     [in, size_is(cpropid)] const LPOLESTR rglpwstrName[]);
1983
1984   HRESULT DeletePropertyNames(
1985     [in] ULONG cpropid,
1986     [in, size_is(cpropid)] const PROPID rgpropid[]);
1987
1988   HRESULT Commit(
1989     [in] DWORD grfCommitFlags);
1990
1991   HRESULT Revert();
1992
1993   HRESULT Enum(
1994     [out] IEnumSTATPROPSTG **ppenum);
1995
1996   HRESULT SetTimes(
1997     [in] const FILETIME *pctime,
1998     [in] const FILETIME *patime,
1999     [in] const FILETIME *pmtime);
2000
2001   HRESULT SetClass(
2002     [in] REFCLSID clsid);
2003
2004   HRESULT Stat(
2005     [out] STATPROPSETSTG *statpsstg);
2006 }
2007
2008 [
2009   object,
2010   uuid(0000013A-0000-0000-C000-000000000046),
2011   pointer_default(unique)
2012 ]
2013 interface IPropertySetStorage : IUnknown
2014 {
2015   typedef [unique] IPropertySetStorage *LPPROPERTYSETSTORAGE;
2016
2017   HRESULT Create(
2018     [in] REFFMTID rfmtid,
2019     [in, unique] const CLSID *pclsid,
2020     [in] DWORD grfFlags,
2021     [in] DWORD grfMode,
2022     [out] IPropertyStorage **ppprstg);
2023
2024   HRESULT Open(
2025     [in] REFFMTID rfmtid,
2026     [in] DWORD grfMode,
2027     [out] IPropertyStorage **ppprstg);
2028
2029   HRESULT Delete(
2030     [in] REFFMTID rfmtid);
2031
2032   HRESULT Enum(
2033     [out] IEnumSTATPROPSETSTG **ppenum);
2034 }
2035
2036 [
2037   object,
2038   uuid(00000139-0000-0000-C000-000000000046),
2039   pointer_default(unique)
2040 ]
2041 interface IEnumSTATPROPSTG : IUnknown
2042 {
2043   typedef [unique] IEnumSTATPROPSTG *LPENUMSTATPROPSTG;
2044
2045   [local]
2046   HRESULT Next(
2047     [in] ULONG celt,
2048     [out, size_is(celt), length_is(*pceltFetched)]
2049     STATPROPSTG *rgelt,
2050     [out] ULONG *pceltFetched);
2051
2052   [call_as(Next)]
2053   HRESULT RemoteNext(
2054     [in] ULONG celt,
2055     [out, size_is(celt), length_is(*pceltFetched)]
2056     STATPROPSTG *rgelt,
2057     [out] ULONG *pceltFetched);
2058
2059   HRESULT Skip(
2060     [in] ULONG celt);
2061
2062   HRESULT Reset();
2063
2064   HRESULT Clone(
2065     [out] IEnumSTATPROPSTG **ppenum);
2066 }
2067
2068 [
2069   object,
2070   uuid(0000013B-0000-0000-C000-000000000046),
2071   pointer_default(unique)
2072 ]
2073 interface IEnumSTATPROPSETSTG : IUnknown
2074 {
2075   typedef [unique] IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;
2076
2077   [local]
2078   HRESULT Next(
2079     [in] ULONG celt,
2080     [out, size_is(celt), length_is(*pceltFetched)]
2081     STATPROPSETSTG *rgelt,
2082     [out] ULONG *pceltFetched);
2083
2084   [call_as(Next)]
2085   HRESULT RemoteNext(
2086     [in] ULONG celt,
2087     [out, size_is(celt), length_is(*pceltFetched)]
2088     STATPROPSETSTG *rgelt,
2089     [out] ULONG *pceltFetched);
2090
2091   HRESULT Skip(
2092     [in] ULONG celt);
2093
2094   HRESULT Reset();
2095
2096   HRESULT Clone(
2097     [out] IEnumSTATPROPSETSTG **ppenum);
2098 }
2099
2100 /******************** Connection Points ********************/
2101 /* FIXME */
2102
2103 /******************** DCOM ********************/
2104
2105 [
2106   local,
2107   object,
2108   uuid(0000013D-0000-0000-C000-000000000046)
2109 ]
2110 interface IClientSecurity : IUnknown
2111 {
2112   typedef struct tagSOLE_AUTHENTICATION_SERVICE {
2113     DWORD dwAuthnSvc;
2114     DWORD dwAuthzSvc;
2115     OLECHAR *pPrincipalName;
2116     HRESULT hr;
2117   } SOLE_AUTHENTICATION_SERVICE;
2118
2119   typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
2120
2121   typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
2122     EOAC_NONE           = 0x0,
2123     EOAC_MUTUAL_AUTH    = 0x1,
2124     EOAC_CLOAKING       = 0x10,
2125     EOAC_SECURE_REFS    = 0x2,
2126     EOAC_ACCESS_CONTROL = 0x4,
2127     EOAC_APPID          = 0x8
2128   } EOLE_AUTHENTICATION_CAPABILITIES;
2129
2130   HRESULT QueryBlanket(
2131     [in] IUnknown *pProxy,
2132     [out] DWORD *pAuthnSvc,
2133     [out] DWORD *pAuthzSvc,
2134     [out] OLECHAR **pServerPrincName,
2135     [out] DWORD *pAuthnLevel,
2136     [out] DWORD *pImpLevel,
2137     [out] void **pAuthInfo,
2138     [out] DWORD *pCapabilites);
2139
2140   HRESULT SetBlanket(
2141     [in] IUnknown *pProxy,
2142     [in] DWORD AuthnSvc,
2143     [in] DWORD AuthzSvc,
2144     [in] OLECHAR *pServerPrincName,
2145     [in] DWORD AuthnLevel,
2146     [in] DWORD ImpLevel,
2147     [in] void *pAuthInfo,
2148     [in] DWORD Capabilities);
2149
2150   HRESULT CopyProxy(
2151     [in] IUnknown *pProxy,
2152     [out] IUnknown **ppCopy);
2153 }
2154
2155 [
2156   local,
2157   object,
2158   uuid(0000013E-0000-0000-C000-000000000046)
2159 ]
2160 interface IServerSecurity : IUnknown
2161 {
2162   HRESULT QueryBlanket(
2163     [out] DWORD *pAuthnSvc,
2164     [out] DWORD *pAuthzSvc,
2165     [out] OLECHAR **pServerPrincName,
2166     [out] DWORD *pAuthnLevel,
2167     [out] DWORD *pImpLevel,
2168     [out] void **pPrivs,
2169     [out] DWORD *pCapabilities);
2170
2171   HRESULT ImpersonateClient();
2172
2173   HRESULT RevertToSelf();
2174
2175   BOOL IsImpersonating();
2176 }
2177
2178 [
2179   local,
2180   object,
2181   uuid(00000024-0000-0000-C000-000000000046)
2182 ]
2183 interface IAsyncSetup : IUnknown
2184 {
2185   HRESULT GetAsyncManager(
2186     [in] REFIID riid,
2187     [in] IUnknown *pOuter,
2188     [in] DWORD dwFlags,
2189     [out] IUnknown **ppInner,
2190     [out] IAsyncManager **ppAsyncMgr);
2191 }
2192
2193 [
2194   local,
2195   object,
2196   uuid(0000002A-0000-0000-C000-000000000046)
2197 ]
2198 interface IAsyncManager : IUnknown
2199 {
2200   typedef enum tagDCOM_CALL_STATE {
2201     DCOM_NONE          = 0,
2202     DCOM_CALL_COMPLETE = 1,
2203     DCOM_CALL_CANCELED = 2
2204   } DCOM_CALL_STATE;
2205
2206   HRESULT CompleteCall(
2207     [in] HRESULT Result);
2208   HRESULT GetCallContext(
2209     [in] REFIID riid,
2210     [out] void **pInterface);
2211   HRESULT GetState(
2212     [out] ULONG *pulStateFlags);
2213 }