Wrote a new objidl.idl to replace a number of include/wine/obj_*.h
files.

diff --git a/include/objidl.idl b/include/objidl.idl
new file mode 100644
index 0000000..b3d3917
--- /dev/null
+++ b/include/objidl.idl
@@ -0,0 +1,2400 @@
+/*
+ * Copyright 2002 Ove Kaaven
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+import "unknwn.idl";
+
+interface IStream;
+interface IStream16;
+interface IEnumString;
+interface IRunningObjectTable;
+interface IMoniker;
+interface IAdviseSink;
+interface IAsyncManager;
+
+/* FIXME: COSERVERINFO should be moved here from wtypes.idl */
+
+/******************** Fundamentals ********************/
+
+[
+  local,
+  object,
+  uuid(00000003-0000-0000-C000-000000000046)
+]
+interface IMarshal : IUnknown
+{
+  typedef [unique] IMarshal *LPMARSHAL;
+
+  HRESULT GetUnmarshalClass(
+    [in] REFIID riid,
+    [in, unique] void *pv,
+    [in] DWORD dwDestContext,
+    [in, unique] void *pvDestContext,
+    [in] DWORD mshlflags,
+    [out] CLSID *pCid);
+
+  HRESULT GetMarshalSizeMax(
+    [in] REFIID riid,
+    [in, unique] void *pv,
+    [in] DWORD dwDestContext,
+    [in, unique] void *pvDestContext,
+    [in] DWORD mshlflags,
+    [out] DWORD *pSize);
+
+  HRESULT MarshalInterface(
+    [in, unique] IStream *pStm,
+    [in] REFIID riid,
+    [in, unique] void *pv,
+    [in] DWORD dwDestContext,
+    [in, unique] void *pvDestContext,
+    [in] DWORD mshlflags);
+
+  HRESULT UnmarshalInterface(
+    [in, unique] IStream *pStm,
+    [in] REFIID riid,
+    [out] void **ppv);
+
+  HRESULT ReleaseMarshalData(
+    [in, unique] IStream *pStm);
+
+  HRESULT DisconnectObject(
+    [in] DWORD dwReserved);
+}
+
+[
+  local,
+  object,
+  uuid(00000018-0000-0000-C000-000000000046)
+]
+interface IStdMarshalInfo : IUnknown
+{
+  typedef [unique] IStdMarshalInfo *LPSTDMARSHALINFO;
+
+  HRESULT GetClassForHandler(
+    [in] DWORD dwDestContext,
+    [in, unique] void *pvDestContext,
+    [out] CLSID *pClsid);
+}
+
+[
+  local,
+  object,
+  uuid(00000019-0000-0000-C000-000000000046)
+]
+interface IExternalConnection : IUnknown
+{
+  typedef [unique] IExternalConnection *LPEXTERNALCONNECTION;
+
+  typedef enum tagEXTCONN {
+    EXTCONN_STRONG   = 0x0001,
+    EXTCONN_WEAK     = 0x0002,
+    EXTCONN_CALLABLE = 0x0004
+  } EXTCONN;
+
+  DWORD AddConnection(
+    [in] DWORD extconn,
+    [in] DWORD reserved);
+
+  DWORD ReleaseConnection(
+    [in] DWORD extconn,
+    [in] DWORD reserved,
+    [in] BOOL fLastReleaseCloses);
+}
+
+[
+  local,
+  object,
+  uuid(00000020-0000-0000-C000-000000000046)
+]
+interface IMultiQI : IUnknown
+{
+  typedef [unique] IMultiQI *LPMULTIQI;
+
+  typedef struct tagMULTI_QI {
+    const IID *pIID;
+    IUnknown *pItf;
+    HRESULT hr;
+  } MULTI_QI;
+
+  HRESULT QueryMultipleInterfaces(
+    [in] ULONG cMQIs,
+    [in, out] MULTI_QI *pMQIs);
+}
+
+[
+  local,
+  object,
+  uuid(00000002-0000-0000-C000-000000000046)
+]
+interface IMalloc : IUnknown
+{
+  typedef [unique] IMalloc *LPMALLOC;
+
+  LPVOID Alloc(
+    [in] ULONG cb);
+
+  LPVOID Realloc(
+    [in] LPVOID pv,
+    [in] ULONG cb);
+
+  void Free(
+    [in] LPVOID pv);
+
+  ULONG GetSize(
+    [in] LPVOID pv);
+
+  int DidAlloc(LPVOID pv);
+
+  void HeapMinimize();
+}
+
+[
+  local,
+  object,
+  uuid(0000001d-0000-0000-C000-000000000046)
+]
+interface IMallocSpy : IUnknown
+{
+  typedef [unique] IMallocSpy *LPMALLOCSPY;
+
+  ULONG PreAlloc(
+    [in] ULONG cbRequest);
+
+  LPVOID PostAlloc(
+    [in] LPVOID pActual);
+
+  LPVOID PreFree(
+    [in] LPVOID pRequest,
+    [in] BOOL fSpyed);
+
+  void PostFree(
+    [in] BOOL fSpyed);
+
+  ULONG PreRealloc(
+    [in] LPVOID pRequest,
+    [in] ULONG cbRequest,
+    [out] LPVOID *ppNewRequest,
+    [in] BOOL fSpyed);
+
+  LPVOID PostRealloc(
+    [in] LPVOID pActual,
+    [in] BOOL fSpyed);
+
+  LPVOID PreGetSize(
+    [in] LPVOID pRequest,
+    [in] BOOL fSpyed);
+
+  ULONG PostGetSize(
+    [in] ULONG cbActual,
+    [in] BOOL fSpyed);
+
+  LPVOID PreDidAlloc(
+    [in] LPVOID pRequest,
+    [in] BOOL fSpyed);
+
+  int PostDidAlloc(
+    [in] LPVOID pRequest,
+    [in] BOOL fSpyed,
+    [in] int fActual);
+
+  void PreHeapMinimize();
+
+  void PostHeapMinimize();
+}
+
+[
+  object,
+  uuid(00000100-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumUnknown : IUnknown
+{
+  typedef [unique] IEnumUnknown *LPENUMUNKNOWN;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out] IUnknown **rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    IUnknown **rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumUnknown **ppenum);
+}
+
+[
+  object,
+  uuid(00000022-0000-0000-C000-000000000046),
+  version(1.0),
+  pointer_default(unique)
+]
+interface ISurrogate : IUnknown
+{
+  typedef [unique] ISurrogate *LPSURROGATE;
+
+  HRESULT LoadDllServer(
+    [in] REFCLSID Clsid);
+  HRESULT FreeSurrogate();
+}
+
+[
+  local,
+  object,
+  uuid(00000146-0000-0000-C000-000000000046)
+]
+interface IGlobalInterfaceTable : IUnknown
+{
+  typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
+
+  HRESULT RegisterInterfaceInGlobal(
+    [in] IUnknown *pUnk,
+    [in] REFIID riid,
+    [out] DWORD *pdwCookie);
+
+  HRESULT RevokeInterfaceFromGlobal(
+    [in] DWORD dwCookie);
+
+  HRESULT GetInterfaceFromGlobal(
+    [in] DWORD dwCookie,
+    [in] REFIID riid,
+    [out, iid_is(riid)] void **ppv);
+}
+
+/******************** Monikers ********************/
+
+[
+  object,
+  uuid(0000000e-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IBindCtx : IUnknown
+{
+  typedef [unique] IBindCtx *LPBINDCTX;
+  typedef [unique] IBindCtx *LPBC;
+
+  typedef struct tagBIND_OPTS {
+    DWORD cbStruct;
+    DWORD grfFlags;
+    DWORD grfMode;
+    DWORD dwTickCountDeadline;
+  } BIND_OPTS, *LPBIND_OPTS;
+
+  /* FIXME: C++ crap */
+  typedef struct tagBIND_OPTS2 {
+    DWORD cbStruct;
+    DWORD grfFlags;
+    DWORD grfMode;
+    DWORD dwTickCountDeadline;
+    DWORD dwTrackFlags;
+    DWORD dwClassContext;
+    LCID  locale;
+    COSERVERINFO *pServerInfo;
+  } BIND_OPTS2, *LPBIND_OPTS2;
+
+  typedef enum tagBIND_FLAGS {
+    BIND_MAYBOTHERUSER   = 1,
+    BIND_JUSTTESTEXISTENCE = 2
+  } BIND_FLAGS;
+
+  HRESULT RegisterObjectBound(
+    [in, unique] IUnknown *punk);
+
+  HRESULT RevokeObjectBound(
+    [in, unique] IUnknown *punk);
+
+  HRESULT ReleaseBoundObjects();
+
+  [local]
+  HRESULT SetBindOptions(
+    [in] BIND_OPTS *pbindopts);
+
+  [call_as(SetBindOptions)]
+  HRESULT RemoteSetBindOptions(
+    [in] BIND_OPTS2 *pbindopts);
+
+  [local]
+  HRESULT GetBindOptions(
+    [in, out] BIND_OPTS *pbindopts);
+
+  [call_as(GetBindOptions)]
+  HRESULT RemoteGetBindOptions(
+    [in, out] BIND_OPTS2 *pbindopts);
+
+  HRESULT GetRunningObjectTable(
+    [out] IRunningObjectTable **pprot);
+
+  HRESULT RegisterObjectParam(
+    [in] LPOLESTR pszKey,
+    [in, unique] IUnknown *punk);
+
+  HRESULT GetObjectParam(
+    [in] LPOLESTR pszKey,
+    [out] IUnknown **ppunk);
+
+  HRESULT EnumObjectParam(
+    [out] IEnumString **ppenum);
+
+  HRESULT RevokeObjectParam(
+    [in] LPOLESTR pszKey);
+}
+
+[
+  object,
+  uuid(00000102-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumMoniker : IUnknown
+{
+  typedef [unique] IEnumMoniker *LPENUMMONIKER;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    IMoniker **rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    IMoniker **rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumMoniker **ppenum);
+}
+
+[
+  object,
+  uuid(00000126-0000-0000-C000-000000000046)
+]
+interface IRunnableObject : IUnknown
+{
+  typedef [unique] IRunnableObject *LPRUNNABLEOBJECT;
+
+  HRESULT GetRunningClass(
+    [out] LPCLSID lpClsid);
+
+  HRESULT Run(
+    [in] LPBINDCTX pbc);
+
+  [local]
+  BOOL IsRunning();
+
+  [call_as(IsRunning)]
+  HRESULT RemoteIsRunning();
+
+  HRESULT LockRunning(
+    [in] BOOL fLock,
+    [in] BOOL fLastUnlockCloses);
+
+  HRESULT SetContainedObject(
+    [in] BOOL fContained);
+}
+
+/* GetObject is defined in wingdi.h as WINELIB_NAME_AW(GetObject),
+ * which resolves to a compilation failure if __WINE__ is defined,
+ * but GetObject is used as a valid method name below, so we have
+ * to undefine it if __WINE__ is defined */
+cpp_quote("#ifdef __WINE__")
+cpp_quote("#undef GetObject")
+cpp_quote("#endif")
+
+[
+  object,
+  uuid(00000010-0000-0000-C000-000000000046)
+]
+interface IRunningObjectTable : IUnknown
+{
+  typedef [unique] IRunningObjectTable *LPRUNNINGOBJECTTABLE;
+
+  HRESULT Register(
+    [in] DWORD grfFlags,
+    [in, unique] IUnknown *punkObject,
+    [in, unique] IMoniker *pmkObjectName,
+    [out] DWORD *pdwRegister);
+
+  HRESULT Revoke(
+    [in] DWORD dwRegister);
+
+  HRESULT IsRunning(
+    [in, unique] IMoniker *pmkObjectName);
+
+  HRESULT GetObject(
+    [in, unique] IMoniker *pmkObjectName,
+    [out] IUnknown **ppunkObject);
+
+  HRESULT NoteChangeTime(
+    [in] DWORD dwRegister,
+    [in] FILETIME *pfiletime);
+
+  HRESULT GetTimeOfLastChange(
+    [in, unique] IMoniker *pmkObjectName,
+    [out] FILETIME *pfiletime);
+
+  HRESULT EnumRunning(
+    [out] IEnumMoniker **ppenumMoniker);
+}
+
+[
+  object,
+  uuid(0000010c-0000-0000-C000-000000000046)
+]
+interface IPersist : IUnknown
+{
+  typedef [unique] IPersist *LPPERSIST;
+
+  HRESULT GetClassID(
+    [out] CLSID *pClassID);
+}
+
+[
+  object,
+  uuid(00000109-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IPersistStream : IPersist
+{
+  typedef [unique] IPersistStream *LPPERSISTSTREAM;
+
+  HRESULT IsDirty();
+
+  HRESULT Load(
+    [in, unique] IStream *pStm);
+
+  HRESULT Save(
+    [in, unique] IStream *pStm,
+    [in] BOOL fClearDirty);
+
+  HRESULT GetSizeMax(
+    [out] ULARGE_INTEGER *pcbSize);
+}
+
+[
+  object,
+  uuid(0000000f-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IMoniker : IPersistStream
+{
+  typedef [unique] IMoniker *LPMONIKER;
+
+  typedef enum tagMKSYS {
+    MKSYS_NONE             = 0,
+    MKSYS_GENERICCOMPOSITE = 1,
+    MKSYS_FILEMONIKER      = 2,
+    MKSYS_ANTIMONIKER      = 3,
+    MKSYS_ITEMMONIKER      = 4,
+    MKSYS_POINTERMONIKER   = 5,
+    MKSYS_CLASSMONIKER     = 7
+  } MKSYS;
+
+  typedef [v1_enum] enum tagMKREDUCE {
+    MKRREDUCE_ONE         = 3 << 16,
+    MKRREDUCE_TOUSER      = 2 << 16,
+    MKRREDUCE_THROUGHUSER = 1 << 16,
+    MKRREDUCE_ALL         = 0
+  } MKRREDUCE;
+
+  [local]
+  HRESULT BindToObject(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in] REFIID riidResult,
+    [out, iid_is(riidResult)] void **ppvResult);
+
+  [call_as(BindToObject)]
+  HRESULT RemoteBindToObject(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in] REFIID riidResult,
+    [out, iid_is(riidResult)] IUnknown **ppvResult);
+
+  [local]
+  HRESULT BindToStorage(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in] REFIID riid,
+    [out, iid_is(riid)] void **ppvObj);
+
+  [call_as(BindToStorage)]
+  HRESULT RemoteBindToStorage(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in] REFIID riid,
+    [out, iid_is(riid)] IUnknown **ppvObj);
+
+  HRESULT Reduce(
+    [in, unique] IBindCtx *pbc,
+    [in] DWORD dwReduceHowFar,
+    [in, out, unique] IMoniker **ppmkToLeft,
+    [out] IMoniker **ppmkReduced);
+
+  HRESULT ComposeWith(
+    [in, unique] IMoniker *pmkRight,
+    [in] BOOL fOnlyIfNotGeneric,
+    [out] IMoniker **ppmkComposite);
+
+  HRESULT Enum(
+    [in] BOOL fForward,
+    [out] IEnumMoniker **ppenumMoniker);
+
+  HRESULT IsEqual(
+    [in, unique] IMoniker *pmkOtherMoniker);
+
+  HRESULT Hash(
+    [out] DWORD *pdwHash);
+
+  HRESULT IsRunning(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in, unique] IMoniker *pmkNewlyRunning);
+
+  HRESULT GetTimeOfLastChange(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [out] FILETIME *pFileTime);
+
+  HRESULT Inverse(
+    [out] IMoniker **ppmk);
+
+  HRESULT CommonPrefixWith(
+    [in, unique] IMoniker *pmkOther,
+    [out] IMoniker **ppmkPrefix);
+
+  HRESULT RelativePathTo(
+    [in, unique] IMoniker *pmkOther,
+    [out] IMoniker **ppmkRelPath);
+
+  HRESULT GetDisplayName(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [out] LPOLESTR *ppszDisplayName);
+
+  HRESULT ParseDisplayName(
+    [in, unique] IBindCtx *pbc,
+    [in, unique] IMoniker *pmkToLeft,
+    [in] LPOLESTR pszDisplayName,
+    [out] ULONG *pchEaten,
+    [out] IMoniker **ppmkOut);
+
+  HRESULT IsSystemMoniker(
+    [out] DWORD *pdwMksys);
+}
+
+[
+  object,
+  uuid(f29f6bc0-5021-11ce-aa15-00006901293f),
+  pointer_default(unique)
+]
+interface IROTData : IUnknown
+{
+  HRESULT GetComparisonData(
+    [out, size_is(cbMax)] byte *pbData,
+    [in] ULONG cbMax,
+    [out] ULONG *pcbData);
+}
+
+[
+  object,
+  uuid(00000101-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumString : IUnknown
+{
+  typedef [unique] IEnumString *LPENUMSTRING;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    LPOLESTR *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    LPOLESTR *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumString **ppenum);
+}
+
+[
+  object,
+  uuid(00000140-0000-0000-C000-000000000046)
+]
+interface IClassActivator : IUnknown
+{
+  HRESULT GetClassObject(
+    [in] REFCLSID rclsid,
+    [in] DWORD dwClassContext,
+    [in] LCID locale,
+    [in] REFIID riid,
+    [out, iid_is(riid)] void **ppv);
+}
+
+/******************** Storage ********************/
+
+[
+  object,
+  uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
+  pointer_default(unique)
+]
+interface ISequentialStream : IUnknown
+{
+  [local]
+  HRESULT Read(
+    [out, size_is(cb), length_is(*pcbRead)]
+    void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbRead);
+
+  [call_as(Read)]
+  HRESULT RemoteRead(
+    [out, size_is(cb), length_is(*pcbRead)]
+    byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbRead);
+
+  [local]
+  HRESULT Write(
+    [in, size_is(cb)] const void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  [call_as(Write)]
+  HRESULT RemoteWrite(
+    [in, size_is(cb)] const byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+}
+
+[
+  object,
+  uuid(0000000c-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IStream : ISequentialStream
+{
+  typedef [unique] IStream *LPSTREAM;
+
+  typedef struct tagSTATSTG {
+    LPOLESTR pwcsName;
+    DWORD type;
+    ULARGE_INTEGER cbSize;
+    FILETIME mtime;
+    FILETIME ctime;
+    FILETIME atime;
+    DWORD grfMode;
+    DWORD grfLocksSupported;
+    CLSID clsid;
+    DWORD grfStateBits;
+    DWORD reserved;
+  } STATSTG;
+
+  typedef enum tagSTGTY {
+    STGTY_STORAGE   = 1,
+    STGTY_STREAM    = 2,
+    STGTY_LOCKBYTES = 3,
+    STGTY_PROPERTY  = 4
+  } STGTY;
+
+  typedef enum tagSTREAM_SEEK {
+    STREAM_SEEK_SET = 0,
+    STREAM_SEEK_CUR = 1,
+    STREAM_SEEK_END = 2
+  } STREAM_SEEK;
+
+  /* these are defined in Linux's fcntl.h,
+   * undefine them to avoid conflicts */
+  cpp_quote("#undef LOCK_MAND")
+  cpp_quote("#undef LOCK_READ")
+  cpp_quote("#undef LOCK_WRITE")
+  cpp_quote("#undef LOCK_RW")
+
+  typedef enum tagLOCKTYPE {
+    LOCK_WRITE      = 1,
+    LOCK_EXCLUSIVE  = 2,
+    LOCK_ONLYONCE   = 4
+  } LOCKTYPE;
+
+  [local]
+  HRESULT Seek(
+    [in] LARGE_INTEGER dlibMove,
+    [in] DWORD dwOrigin,
+    [out] ULARGE_INTEGER *plibNewPosition);
+
+  [call_as(Seek)]
+  HRESULT RemoteSeek(
+    [in] LARGE_INTEGER dlibMove,
+    [in] DWORD dwOrigin,
+    [out] ULARGE_INTEGER *plibNewPosition);
+
+  HRESULT SetSize(
+    [in] ULARGE_INTEGER libNewSize);
+
+  [local]
+  HRESULT CopyTo(
+    [in, unique] IStream *pstm,
+    [in] ULARGE_INTEGER cb,
+    [out] ULARGE_INTEGER *pcbRead,
+    [out] ULARGE_INTEGER *pcbWritten);
+
+  [call_as(CopyTo)]
+  HRESULT RemoteCopyTo(
+    [in, unique] IStream *pstm,
+    [in] ULARGE_INTEGER cb,
+    [out] ULARGE_INTEGER *pcbRead,
+    [out] ULARGE_INTEGER *pcbWritten);
+
+  HRESULT Commit(
+    [in] DWORD grfCommitFlags);
+
+  HRESULT Revert();
+
+  HRESULT LockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT UnlockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT Stat(
+    [out] STATSTG *pstatstg,
+    [in] DWORD grfStatFlag);
+
+  HRESULT Clone(
+    [out] IStream **ppstm);
+}
+
+[
+  object,
+  pointer_default(unique)
+]
+interface IStream16 : ISequentialStream
+{
+  typedef [unique] IStream16 *LPSTREAM16;
+
+  typedef struct tagSTATSTG16 {
+    LPOLESTR16 pwcsName;
+    DWORD type;
+    ULARGE_INTEGER cbSize;
+    FILETIME mtime;
+    FILETIME ctime;
+    FILETIME atime;
+    DWORD grfMode;
+    DWORD grfLocksSupported;
+    CLSID clsid;
+    DWORD grfStateBits;
+    DWORD reserved;
+  } STATSTG16;
+
+  [local]
+  HRESULT Seek(
+    [in] LARGE_INTEGER dlibMove,
+    [in] DWORD dwOrigin,
+    [out] ULARGE_INTEGER *plibNewPosition);
+
+  [call_as(Seek)]
+  HRESULT RemoteSeek(
+    [in] LARGE_INTEGER dlibMove,
+    [in] DWORD dwOrigin,
+    [out] ULARGE_INTEGER *plibNewPosition);
+
+  HRESULT SetSize(
+    [in] ULARGE_INTEGER libNewSize);
+
+  [local]
+  HRESULT CopyTo(
+    [in, unique] IStream16 *pstm,
+    [in] ULARGE_INTEGER cb,
+    [out] ULARGE_INTEGER *pcbRead,
+    [out] ULARGE_INTEGER *pcbWritten);
+
+  [call_as(CopyTo)]
+  HRESULT RemoteCopyTo(
+    [in, unique] IStream16 *pstm,
+    [in] ULARGE_INTEGER cb,
+    [out] ULARGE_INTEGER *pcbRead,
+    [out] ULARGE_INTEGER *pcbWritten);
+
+  HRESULT Commit(
+    [in] DWORD grfCommitFlags);
+
+  HRESULT Revert();
+
+  HRESULT LockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT UnlockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT Stat(
+    [out] STATSTG *pstatstg,
+    [in] DWORD grfStatFlag);
+
+  HRESULT Clone(
+    [out] IStream16 **ppstm);
+}
+
+[
+  object,
+  uuid(0000000d-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumSTATSTG : IUnknown
+{
+  typedef [unique] IEnumSTATSTG *LPENUMSTATSTG;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumSTATSTG **ppenum);
+}
+
+[
+  object,
+  uuid(0000000b-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IStorage : IUnknown
+{
+  typedef [unique] IStorage *LPSTORAGE;
+
+  typedef struct tagRemSNB {
+    unsigned long ulCntStr;
+    unsigned long ulCntChar;
+    [size_is(ulCntChar)] OLECHAR rgString[];
+  } RemSNB;
+
+  typedef [unique] RemSNB *wireSNB;
+  typedef [wire_marshal(wireSNB)] OLECHAR **SNB;
+
+  HRESULT CreateStream(
+    [in] LPCOLESTR pwcsName,
+    [in] DWORD grfMode,
+    [in] DWORD reserved1,
+    [in] DWORD reserved2,
+    [out] IStream **ppstm);
+
+  [local]
+  HRESULT OpenStream(
+    [in] LPCOLESTR pwcsName,
+    [in, unique] void *reserved1,
+    [in] DWORD grfMode,
+    [in] DWORD reserved2,
+    [out] IStream **ppstm);
+
+  [call_as(OpenStream)]
+  HRESULT RemoteOpenStream(
+    [in] LPCOLESTR pwcsName,
+    [in] unsigned long cbReserved1,
+    [in, unique, size_is(cbReserved1)] byte *reserved1,
+    [in] DWORD grfMode,
+    [in] DWORD reserved2,
+    [out] IStream **ppstm);
+
+  HRESULT CreateStorage(
+    [in] LPCOLESTR pwcsName,
+    [in] DWORD grfMode,
+    [in] DWORD dwStgFmt,
+    [in] DWORD reserved2,
+    [out] IStorage **ppstg);
+
+  HRESULT OpenStorage(
+    [in, unique] LPCOLESTR pwcsName,
+    [in, unique] IStorage *pstgPriority,
+    [in] DWORD grfMode,
+    [in, unique] SNB snbExclude,
+    [in] DWORD reserved,
+    [out] IStorage **ppstg);
+
+  HRESULT CopyTo(
+    [in] DWORD ciidExclude,
+    [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
+    [in, unique] SNB snbExclude,
+    [in, unique] IStorage *pstgDest);
+
+  HRESULT MoveElementTo(
+    [in] LPCOLESTR pwcsName,
+    [in, unique] IStorage *pstgDest,
+    [in] LPCOLESTR pwcsNewName,
+    [in] DWORD grfFlags);
+
+  HRESULT Commit(
+    [in] DWORD grfCommitFlags);
+
+  HRESULT Revert();
+
+  [local]
+  HRESULT EnumElements(
+    [in] DWORD reserved1,
+    [in, unique, size_is(1)] void *reserved2,
+    [in] DWORD reserved3,
+    [out] IEnumSTATSTG **ppenum);
+
+  [call_as(EnumElements)]
+  HRESULT RemoteEnumElements(
+    [in] DWORD reserved1,
+    [in] unsigned long cbReserved2,
+    [in, unique, size_is(cbReserved2)] byte *reserved2,
+    [in] DWORD reserved3,
+    [out] IEnumSTATSTG **ppenum);
+
+  HRESULT DestroyElement(
+    [in] LPCOLESTR pwcsName);
+
+  HRESULT RenameElement(
+    [in] LPCOLESTR pwcsOldName,
+    [in] LPCOLESTR pwcsNewName);
+
+  HRESULT SetElementTimes(
+    [in, unique] LPCOLESTR pwcsName,
+    [in, unique] const FILETIME *pctime,
+    [in, unique] const FILETIME *patime,
+    [in, unique] const FILETIME *pmtime);
+
+  HRESULT SetClass(
+    [in] REFCLSID clsid);
+
+  HRESULT SetStateBits(
+    [in] DWORD grfStateBits,
+    [in] DWORD grfMask);
+
+  HRESULT Stat(
+    [out] STATSTG *pstatstg,
+    [in] DWORD grfStatFlag);
+}
+
+[
+  object,
+  pointer_default(unique)
+]
+interface IStorage16 : IUnknown
+{
+  typedef [unique] IStorage16 *LPSTORAGE16;
+
+  typedef struct tagRemSNB16 {
+    unsigned long ulCntStr;
+    unsigned long ulCntChar;
+    [size_is(ulCntChar)] OLECHAR16 rgString[];
+  } RemSNB16;
+
+  typedef [unique] RemSNB16 *wireSNB16;
+  typedef [wire_marshal(wireSNB16)] OLECHAR16 **SNB16;
+
+  HRESULT CreateStream(
+    [in] LPCOLESTR16 pwcsName,
+    [in] DWORD grfMode,
+    [in] DWORD reserved1,
+    [in] DWORD reserved2,
+    [out] IStream16 **ppstm);
+
+  [local]
+  HRESULT OpenStream(
+    [in] LPCOLESTR16 pwcsName,
+    [in, unique] void *reserved1,
+    [in] DWORD grfMode,
+    [in] DWORD reserved2,
+    [out] IStream16 **ppstm);
+
+  [call_as(OpenStream)]
+  HRESULT RemoteOpenStream(
+    [in] LPCOLESTR16 pwcsName,
+    [in] unsigned long cbReserved1,
+    [in, unique, size_is(cbReserved1)] byte *reserved1,
+    [in] DWORD grfMode,
+    [in] DWORD reserved2,
+    [out] IStream16 **ppstm);
+
+  HRESULT CreateStorage(
+    [in] LPCOLESTR16 pwcsName,
+    [in] DWORD grfMode,
+    [in] DWORD dwStgFmt,
+    [in] DWORD reserved2,
+    [out] IStorage16 **ppstg);
+
+  HRESULT OpenStorage(
+    [in, unique] LPCOLESTR16 pwcsName,
+    [in, unique] IStorage16 *pstgPriority,
+    [in] DWORD grfMode,
+    [in, unique] SNB16 snbExclude,
+    [in] DWORD reserved,
+    [out] IStorage16 **ppstg);
+
+  HRESULT CopyTo(
+    [in] DWORD ciidExclude,
+    [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
+    [in, unique] SNB16 snbExclude,
+    [in, unique] IStorage16 *pstgDest);
+
+  HRESULT MoveElementTo(
+    [in] LPCOLESTR16 pwcsName,
+    [in, unique] IStorage16 *pstgDest,
+    [in] LPCOLESTR16 pwcsNewName,
+    [in] DWORD grfFlags);
+
+  HRESULT Commit(
+    [in] DWORD grfCommitFlags);
+
+  HRESULT Revert();
+
+  [local]
+  HRESULT EnumElements(
+    [in] DWORD reserved1,
+    [in, unique, size_is(1)] void *reserved2,
+    [in] DWORD reserved3,
+    [out] IEnumSTATSTG **ppenum);
+
+  [call_as(EnumElements)]
+  HRESULT RemoteEnumElements(
+    [in] DWORD reserved1,
+    [in] unsigned long cbReserved2,
+    [in, unique, size_is(cbReserved2)] byte *reserved2,
+    [in] DWORD reserved3,
+    [out] IEnumSTATSTG **ppenum);
+
+  HRESULT DestroyElement(
+    [in] LPCOLESTR16 pwcsName);
+
+  HRESULT RenameElement(
+    [in] LPCOLESTR16 pwcsOldName,
+    [in] LPCOLESTR16 pwcsNewName);
+
+  HRESULT SetElementTimes(
+    [in, unique] LPCOLESTR16 pwcsName,
+    [in, unique] const FILETIME *pctime,
+    [in, unique] const FILETIME *patime,
+    [in, unique] const FILETIME *pmtime);
+
+  HRESULT SetClass(
+    [in] REFCLSID clsid);
+
+  HRESULT SetStateBits(
+    [in] DWORD grfStateBits,
+    [in] DWORD grfMask);
+
+  HRESULT Stat(
+    [out] STATSTG *pstatstg,
+    [in] DWORD grfStatFlag);
+}
+
+[
+  object,
+  uuid(0000010b-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IPersistFile : IPersist
+{
+  typedef [unique] IPersistFile *LPPERSISTFILE;
+
+  HRESULT IsDirty();
+
+  HRESULT Load(
+    [in] LPCOLESTR pszFileName,
+    [in] DWORD dwMode);
+
+  HRESULT Save(
+    [in, unique] LPCOLESTR pszFileName,
+    [in] BOOL fRemember);
+
+  HRESULT SaveCompleted(
+    [in, unique] LPCOLESTR pszFileName);
+
+  HRESULT GetCurFile(
+    [out] LPOLESTR *ppszFileName);
+}
+
+[
+  object,
+  uuid(0000010a-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IPersistStorage : IPersist
+{
+  typedef [unique] IPersistStorage *LPPERSISTSTORAGE;
+
+  HRESULT IsDirty();
+
+  HRESULT InitNew(
+    [in, unique] IStorage *pStg);
+
+  HRESULT Load(
+    [in, unique] IStorage *pStg);
+
+  HRESULT Save(
+    [in, unique] IStorage *pStgSave,
+    [in] BOOL fSameAsLoad);
+
+  HRESULT SaveCompleted(
+    [in, unique] IStorage *pStgNew);
+
+  HRESULT HandsOffStorage();
+}
+
+[
+  object,
+  uuid(00000012-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IRootStorage : IUnknown
+{
+  typedef [unique] IRootStorage *LPROOTSTORAGE;
+
+  HRESULT SwitchToFile(
+    [in] LPOLESTR pszFile);
+}
+
+[
+  object,
+  uuid(0000000a-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface ILockBytes : IUnknown
+{
+  typedef [unique] ILockBytes *LPLOCKBYTES;
+
+  [local]
+  HRESULT ReadAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [out, size_is(cb), length_is(*pcbRead)]
+    void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbRead);
+
+  [call_as(ReadAt)]
+  HRESULT RemoteReadAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [out, size_is(cb), length_is(*pcbRead)]
+    byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbRead);
+
+  [local]
+  HRESULT WriteAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [in, size_is(cb)] const void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  [call_as(WriteAt)]
+  HRESULT RemoteWriteAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [in, size_is(cb)] const byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  HRESULT Flush();
+
+  HRESULT SetSize(
+    [in] ULARGE_INTEGER cb);
+
+  HRESULT LockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT UnlockRegion(
+    [in] ULARGE_INTEGER libOffset,
+    [in] ULARGE_INTEGER cb,
+    [in] DWORD dwLockType);
+
+  HRESULT Stat(
+    [out] STATSTG *pstatstg,
+    [in] DWORD grfStatFlag);
+}
+
+[
+  object,
+  uuid(99caf010-415e-11cf-8814-00aa00b569f5),
+  pointer_default(unique)
+]
+interface IFillLockBytes : IUnknown
+{
+  [local]
+  HRESULT FillAppend(
+    [in, size_is(cb)] const void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  [call_as(FillAppend)]
+  HRESULT RemoteFillAppend(
+    [in, size_is(cb)] const byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  [local]
+  HRESULT FillAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [in, size_is(cb)] const void *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  [call_as(FillAt)]
+  HRESULT RemoteFillAt(
+    [in] ULARGE_INTEGER ulOffset,
+    [in, size_is(cb)] const byte *pv,
+    [in] ULONG cb,
+    [out] ULONG *pcbWritten);
+
+  HRESULT SetFillSize(
+    [in] ULARGE_INTEGER ulSize);
+
+  HRESULT Terminate(
+    [in] BOOL bCanceled);
+}
+
+[
+  object,
+  uuid(a9d758a0-4617-11cf-95fc-00aa00680db4),
+  pointer_default(unique)
+]
+interface IProgressNotify : IUnknown
+{
+  HRESULT OnProgress(
+    [in] DWORD dwProgressCurrent,
+    [in] DWORD dwProgressMaximum,
+    [in] BOOL fAccurate,
+    [in] BOOL fOwner);
+}
+
+[
+  local,
+  object,
+  uuid(0e6d4d90-6738-11cf-9608-00aa00680db4),
+  pointer_default(unique)
+]
+interface ILayoutStorage : IUnknown
+{
+  typedef struct tagStorageLayout {
+    DWORD LayoutType;
+    OLECHAR *pwcsElementName;
+    LARGE_INTEGER cOffset;
+    LARGE_INTEGER cBytes;
+  } StorageLayout;
+
+  HRESULT LayoutScript(
+    [in] StorageLayout *pStorageLayout,
+    [in] DWORD nEntries,
+    [in] DWORD glfInterleavedFlag);
+
+  HRESULT BeginMonitor();
+
+  HRESULT EndMonitor();
+
+  HRESULT ReLayoutDocfile(
+    [in] OLECHAR *pwcsNewDfName);
+
+  HRESULT ReLayoutDocfileOnILockBytes(
+    [in] ILockBytes *pILockBytes);
+}
+
+/******************** Data Object ********************/
+
+[
+  object,
+  uuid(00000103-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumFORMATETC : IUnknown
+{
+  typedef [unique] IEnumFORMATETC *LPENUMFORMATETC;
+
+  typedef struct tagDVTARGETDEVICE {
+    DWORD tdSize;
+    WORD tdDriverNameOffset;
+    WORD tdDeviceNameOffset;
+    WORD tdPortNameOffset;
+    WORD tdExtDevmodeOffset;
+    [size_is(tdSize - sizeof(DWORD) - 4*sizeof(WORD))]
+    BYTE tdData[];
+  } DVTARGETDEVICE;
+
+  typedef CLIPFORMAT *LPCLIPFORMAT;
+
+  typedef struct tagFORMATETC {
+    CLIPFORMAT cfFormat;
+    [unique] DVTARGETDEVICE *ptd;
+    DWORD dwAspect;
+    LONG lindex;
+    DWORD tymed;
+  } FORMATETC, *LPFORMATETC;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    FORMATETC *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    FORMATETC *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumFORMATETC **ppenum);
+}
+
+[
+  object,
+  uuid(00000105-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumSTATDATA : IUnknown
+{
+  typedef [unique] IEnumSTATDATA *LPENUMSTATDATA;
+
+  typedef enum tagADVF {
+    ADVF_NODATA            = 1,
+    ADVF_PRIMEFIRST        = 2,
+    ADVF_ONLYONCE          = 4,
+    ADVF_DATAONSTOP        = 64,
+    ADVFCACHE_NOHANDLER    = 8,
+    ADVFCACHE_FORCEBUILTIN = 16,
+    ADVFCACHE_ONSAVE       = 32
+  } ADVF;
+
+  typedef struct tagSTATDATA
+  {
+    FORMATETC formatetc;
+    DWORD advf;
+    [unique] IAdviseSink *pAdvSink;
+    DWORD dwConnection;
+  } STATDATA, *LPSTATDATA;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATDATA *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATDATA *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumSTATDATA **ppenum);
+}
+
+[
+  object,
+  uuid(0000010f-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IAdviseSink : IUnknown
+{
+  typedef IAdviseSink *LPADVISESINK;
+
+  typedef [v1_enum] enum tagTYMED {
+    TYMED_HGLOBAL  = 1,
+    TYMED_FILE     = 2,
+    TYMED_ISTREAM  = 4,
+    TYMED_ISTORAGE = 8,
+    TYMED_GDI      = 16,
+    TYMED_MFPICT   = 32,
+    TYMED_ENHMF    = 64,
+    TYMED_NULL     = 0
+  } TYMED;
+
+  typedef struct tagRemSTGMEDIUM {
+    DWORD tymed;
+    DWORD dwHandleType;
+    unsigned long pData;
+    unsigned long pUnkForRelease;
+    unsigned long cbData;
+    [size_is(cbData)] byte data[];
+  } RemSTGMEDIUM;
+
+  /* FIXME: C/C++ nameless union version */
+  typedef struct tagSTGMEDIUM {
+    DWORD tymed;
+    [switch_is(tymed)] union {
+    [case(TYMED_GDI)]      HBITMAP hBitmap;
+    [case(TYMED_MFPICT)]   HMETAFILEPICT hMetaFilePict;
+    [case(TYMED_ENHMF)]    HENHMETAFILE hEnhMetaFile;
+    [case(TYMED_HGLOBAL)]  HGLOBAL hGlobal;
+    [case(TYMED_FILE)]     LPOLESTR lpszFileName;
+    [case(TYMED_ISTREAM)]  IStream *pstm;
+    [case(TYMED_ISTORAGE)] IStorage *pstg;
+    [default]              ;
+    };
+    [unique] IUnknown *pUnkForRelease;
+  } uSTGMEDIUM;
+
+/* copied from wingdi.h */
+#define OBJ_PEN             1
+#define OBJ_BRUSH           2
+#define OBJ_DC              3
+#define OBJ_METADC          4
+#define OBJ_PAL             5
+#define OBJ_FONT            6
+#define OBJ_BITMAP          7
+#define OBJ_REGION          8
+#define OBJ_METAFILE        9
+#define OBJ_MEMDC           10
+#define OBJ_EXTPEN          11
+#define OBJ_ENHMETADC       12
+#define OBJ_ENHMETAFILE     13
+
+  typedef union _GDI_OBJECT switch(DWORD ObjectType) u {
+    case OBJ_BITMAP: wireHBITMAP hBitmap;
+    case OBJ_PAL:    wireHPALETTE hPalette;
+    default:         wireHGLOBAL hGeneric;
+  } GDI_OBJECT;
+
+  typedef struct _userSTGMEDIUM {
+    union _STGMEDIUM_UNION switch(DWORD tymed) u {
+    case TYMED_NULL:     ;
+    case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
+    case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
+    case TYMED_GDI:      GDI_OBJECT *hGdiHandle;
+    case TYMED_HGLOBAL:  wireHGLOBAL hGlobal;
+    case TYMED_FILE:     LPOLESTR lpszFileName;
+    case TYMED_ISTREAM:  BYTE_BLOB *pstm;
+    case TYMED_ISTORAGE: BYTE_BLOB *pstg;
+    };
+    IUnknown *pUnkForRelease;
+  } userSTGMEDIUM;
+
+  typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
+  typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
+
+  typedef [unique] userSTGMEDIUM *wireASYNC_STGMEDIUM;
+  typedef [wire_marshal(wireASYNC_STGMEDIUM)] STGMEDIUM ASYNC_STGMEDIUM;
+
+  typedef STGMEDIUM *LPSTGMEDIUM;
+
+  typedef struct _userFLAG_STGMEDIUM {
+    long ContextFlags;
+    long fPassOwnership;
+    userSTGMEDIUM Stgmed;
+  } userFLAG_STGMEDIUM;
+
+  typedef [unique] userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
+
+  typedef [wire_marshal(wireFLAG_STGMEDIUM)] struct _FLAG_STGMEDIUM {
+    long ContextFlags;
+    long fPassOwnership;
+    STGMEDIUM Stgmed;
+  } FLAG_STGMEDIUM;
+
+  [local]
+  void OnDataChange(
+    [in, unique] FORMATETC *pFormatetc,
+    [in, unique] STGMEDIUM *pStgmed);
+
+  [call_as(OnDataChange), async]
+  HRESULT  RemoteOnDataChange(
+    [in] IAsyncManager **ppIAM,
+    [in, unique] FORMATETC *pFormatetc,
+    [in, unique] ASYNC_STGMEDIUM *pStgmed);
+
+  [local]
+  void OnViewChange(
+    [in] DWORD dwAspect,
+    [in] LONG lindex);
+
+  [call_as(OnViewChange), async]
+  HRESULT RemoteOnViewChange(
+    [in] IAsyncManager **ppIAM,
+    [in] DWORD dwAspect,
+    [in] LONG lindex);
+
+  [local]
+  void OnRename(
+    [in] IMoniker *pmk);
+
+  [call_as(OnRename), async]
+  HRESULT RemoteOnRename(
+    [in] IAsyncManager **ppIAM,
+    [in] IMoniker *pmk);
+
+  [local]
+  void OnSave();
+
+  [call_as(OnSave), async]
+  HRESULT RemoteOnSave(
+    [in] IAsyncManager **ppIAM);
+
+  [local]
+  void OnClose();
+
+  [call_as(OnClose)]
+  HRESULT RemoteOnClose();
+}
+
+[
+  object,
+  uuid(00000125-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IAdviseSink2 : IAdviseSink
+{
+  typedef [unique] IAdviseSink2 *LPADVISESINK2;
+
+  [local]
+  void OnLinkSrcChange(
+    [in, unique] IMoniker *pmk);
+
+  [call_as(OnLinkSrcChange), async]
+  HRESULT RemoteOnLinkSrcChange(
+    [in] IAsyncManager **ppIAM,
+    [in, unique] IMoniker *pmk);
+}
+
+[
+  object,
+  uuid(0000010e-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IDataObject : IUnknown
+{
+  typedef [unique] IDataObject *LPDATAOBJECT;
+
+  typedef enum tagDATADIR {
+    DATADIR_GET = 1,
+    DATADIR_SET = 2
+  } DATADIR;
+
+  [local]
+  HRESULT GetData(
+    [in, unique] FORMATETC *pformatetcIn,
+    [out] STGMEDIUM *pmedium);
+
+  [call_as(GetData)]
+  HRESULT RemoteGetData(
+    [in, unique] FORMATETC *pformatetcIn,
+    [out] STGMEDIUM *pRemoteMedium);
+
+  [local]
+  HRESULT GetDataHere(
+    [in, unique] FORMATETC *pformatetc,
+    [in, out] STGMEDIUM *pmedium);
+
+  [call_as(GetDataHere)]
+  HRESULT RemoteGetDataHere(
+    [in, unique] FORMATETC *pformatetc,
+    [in, out] STGMEDIUM *pRemoteMedium);
+
+  HRESULT QueryGetData(
+    [in, unique] FORMATETC *pformatetc);
+
+  HRESULT GetCanonicalFormatEtc(
+    [in, unique] FORMATETC *pformatectIn,
+    [out] FORMATETC *pformatetcOut);
+
+  [local]
+  HRESULT SetData(
+    [in, unique] FORMATETC *pformatetc,
+    [in, unique] STGMEDIUM *pmedium,
+    [in] BOOL fRelease);
+
+  [call_as(SetData)]
+  HRESULT RemoteSetData(
+    [in, unique] FORMATETC *pformatetc,
+    [in, unique] FLAG_STGMEDIUM *pmedium,
+    [in] BOOL fRelease);
+
+  HRESULT EnumFormatEtc(
+    [in] DWORD dwDirection,
+    [out] IEnumFORMATETC **ppenumFormatEtc);
+
+  HRESULT DAdvise(
+    [in] FORMATETC *pformatetc,
+    [in] DWORD advf,
+    [in, unique] IAdviseSink *pAdvSink,
+    [out] DWORD *pdwConnection);
+
+  HRESULT DUnadvise(
+    [in] DWORD dwConnection);
+
+  HRESULT EnumDAdvise(
+    [out] IEnumSTATDATA **ppenumAdvise);
+}
+
+[
+  local,
+  object,
+  uuid(00000110-0000-0000-C000-000000000046)
+]
+interface IDataAdviseHolder : IUnknown
+{
+  typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
+
+  HRESULT Advise(
+    [in, unique] IDataObject *pDataObject,
+    [in, unique] FORMATETC *pFetc,
+    [in] DWORD advf,
+    [in, unique] IAdviseSink *pAdvise,
+    [out] DWORD *pdwConnection);
+
+  HRESULT Unadvise(
+    [in] DWORD dwConnection);
+
+  HRESULT EnumAdvise(
+    [out] IEnumSTATDATA **ppenumAdvise);
+
+  HRESULT SendOnDataChange(
+    [in, unique] IDataObject *pDataObject,
+    [in] DWORD dwReserved,
+    [in] DWORD advf);
+}
+
+/******************** Remoting ********************/
+
+[
+  local,
+  object,
+  uuid(00000016-0000-0000-C000-000000000046)
+]
+interface IMessageFilter : IUnknown
+{
+  typedef [unique] IMessageFilter *LPMESSAGEFILTER;
+
+  typedef enum tagCALLTYPE {
+    CALLTYPE_TOPLEVEL = 1,
+    CALLTYPE_NESTED   = 2,
+    CALLTYPE_ASYNC    = 3,
+    CALLTYPE_TOPLEVEL_CALLPENDING = 4,
+    CALLTYPE_ASYNC_CALLPENDING    = 5
+  } CALLTYPE;
+
+  typedef enum tagSERVERCALL {
+    SERVERCALL_ISHANDLED  = 0,
+    SERVERCALL_REJECTED   = 1,
+    SERVERCALL_RETRYLATER = 2
+  } SERVERCALL;
+
+  typedef enum tagPENDINGTYPE {
+    PENDINGTYPE_TOPLEVEL = 1,
+    PENDINGTYPE_NESTED   = 2
+  } PENDINGTYPE;
+
+  typedef enum tagPENDINGMSG {
+    PENDINGMSG_CANCELCALL     = 0,
+    PENDINGMSG_WAITNOPROCESS  = 1,
+    PENDINGMSG_WAITDEFPROCESS = 2
+  } PENDINGMSG;
+
+  typedef struct tagINTERFACEINFO {
+    IUnknown *pUnk;
+    IID iid;
+    WORD wMethod;
+  } INTERFACEINFO, *LPINTERFACEINFO;
+
+  DWORD HandleInComingCall(
+    [in] DWORD dwCallType,
+    [in] HTASK htaskCaller,
+    [in] DWORD dwTickCount,
+    [in] LPINTERFACEINFO lpInterfaceInfo);
+
+  DWORD RetryRejectedCall(
+    [in] HTASK htaskCallee,
+    [in] DWORD dwTickCount,
+    [in] DWORD dwRejectType);
+
+  DWORD MessagePending(
+    [in] HTASK htaskCallee,
+    [in] DWORD dwTickCount,
+    [in] DWORD dwPendingType);
+}
+
+[
+  local,
+  object,
+  uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
+]
+interface IRpcChannelBuffer : IUnknown
+{
+  typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
+
+  typedef unsigned long RPCOLEDATAREP;
+
+  typedef struct tagRPCOLEMESSAGE {
+    void *reserved1;
+    RPCOLEDATAREP dataRepresentation;
+    void *Buffer;
+    ULONG cbBuffer;
+    ULONG iMethod;
+    void *reserved2[5];
+    ULONG rpcFlags;
+  } RPCOLEMESSAGE;
+
+  typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
+
+  HRESULT GetBuffer(
+    [in] RPCOLEMESSAGE *pMessage,
+    [in] REFIID riid);
+
+  HRESULT SendReceive(
+    [in,out] RPCOLEMESSAGE *pMessage,
+    [out] ULONG *pStatus);
+
+  HRESULT FreeBuffer(
+    [in] RPCOLEMESSAGE *pMessage);
+
+  HRESULT GetDestCtx(
+    [out] DWORD *pdwDestContext,
+    [out] void **ppvDestContext);
+
+  HRESULT IsConnected();
+}
+
+[
+  local,
+  object,
+  uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
+]
+interface IRpcChannelBuffer2 : IRpcChannelBuffer
+{
+  typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
+
+  HRESULT GetProtocolVersion(
+    [in,out] DWORD *pdwVersion);
+}
+
+[
+  local,
+  object,
+  uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
+]
+interface IRpcChannelBuffer3 : IRpcChannelBuffer2
+{
+  typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
+
+  HRESULT Send(
+    [in,out] RPCOLEMESSAGE *pMsg,
+    [out] ULONG *pulStatus);
+
+  HRESULT Receive(
+    [in,out] RPCOLEMESSAGE *pMsg,
+    [in] ULONG ulSize,
+    [out] ULONG *pulStatus);
+
+  HRESULT Cancel(
+    [in] RPCOLEMESSAGE *pMsg);
+
+  HRESULT GetCallContext(
+    [in] RPCOLEMESSAGE *pMsg,
+    [in] REFIID riid,
+    [out] void **pInterface);
+
+  HRESULT GetDestCtxEx(
+    [in] RPCOLEMESSAGE *pMsg,
+    [out] DWORD *pdwDestContext,
+    [out] void **ppvDestContext);
+
+  HRESULT GetState(
+    [in] RPCOLEMESSAGE *pMsg,
+    [out] DWORD *pState);
+
+  HRESULT RegisterAsync(
+    [in] RPCOLEMESSAGE *pMsg,
+    [in] IAsyncManager *pAsyncMgr);
+}
+
+[
+  local,
+  object,
+  uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
+]
+interface IRpcProxyBuffer : IUnknown
+{
+  typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
+
+  HRESULT Connect(
+    [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
+
+  void Disconnect();
+}
+
+[
+  local,
+  object,
+  uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
+]
+interface IRpcStubBuffer : IUnknown
+{
+  typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
+
+  HRESULT Connect(
+    [in] IUnknown *pUnkServer);
+
+  void Disconnect();
+
+  HRESULT Invoke(
+    [in] RPCOLEMESSAGE *_prpcmsg,
+    [in] IRpcChannelBuffer *_pRpcChannelBuffer);
+
+  IRpcStubBuffer *IsIIDSupported(
+    [in] REFIID riid);
+
+  ULONG CountRefs();
+
+  HRESULT DebugServerQueryInterface(
+    void **ppv);
+
+  void DebugServerRelease(
+    void *pv);
+}
+
+[
+  local,
+  object,
+  uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
+]
+interface IPSFactoryBuffer : IUnknown
+{
+  typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
+
+  HRESULT CreateProxy(
+    [in] IUnknown *pUnkOuter,
+    [in] REFIID riid,
+    [out] IRpcProxyBuffer **ppProxy,
+    [out] void **ppv);
+
+  HRESULT CreateStub(
+    [in] REFIID riid,
+    [in, unique] IUnknown *pUnkServer,
+    [out] IRpcStubBuffer **ppStub);
+}
+
+[
+  local,
+  object,
+  uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
+]
+interface IChannelHook : IUnknown
+{
+  typedef [unique] IChannelHook *LPCHANNELHOOK;
+
+  typedef struct SChannelHookCallInfo {
+    IID iid;
+    DWORD cbSize;
+    GUID uCausality;
+    DWORD dwServerPid;
+    DWORD iMethod;
+    void *pObject;
+  } SChannelHookCallInfo;
+
+  void ClientGetSize(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [out] ULONG *pDataSize);
+
+  void ClientFillBuffer(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [in, out] ULONG *pDataSize,
+    [in] void *pDataBuffer);
+
+  void ClientNotify(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [in] ULONG cbDataSize,
+    [in] void *pDataBuffer,
+    [in] DWORD lDataRep,
+    [in] HRESULT hrFault);
+
+  void ServerNotify(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [in] ULONG cbDataSize,
+    [in] void *pDataBuffer,
+    [in] DWORD lDataRep);
+
+  void ServerGetSize(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [in] HRESULT hrFault,
+    [out] ULONG *pDataSize);
+
+  void ServerFillBuffer(
+    [in] REFGUID uExtent,
+    [in] REFIID riid,
+    [in, out] ULONG *pDataSize,
+    [in] void *pDataBuffer,
+    [in] HRESULT hrFault );
+}
+
+/******************** Property Storage ********************/
+
+interface IEnumSTATPROPSTG;
+interface IEnumSTATPROPSETSTG;
+
+[
+  object,
+  uuid(00000138-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IPropertyStorage : IUnknown
+{
+  typedef [unique] IPropertyStorage *LPPROPERTYSTORAGE;
+
+  extern const FMTID FMTID_SummaryInformation;
+  extern const FMTID FMTID_DocSummaryInformation;
+  extern const FMTID FMTID_UserDefinedProperties;
+
+  const DWORD PROPSETFLAG_DEFAULT = 0;
+  const DWORD PROPSETFLAG_NONSIMPLE = 1;
+  const DWORD PROPSETFLAG_ANSI = 2;
+  const DWORD PROPSETFLAG_UNBUFFERED = 4;
+
+  typedef struct tagPROPVARIANT PROPVARIANT;
+
+  #define TYPEDEF_CA(type, name) \
+    typedef struct tag##name { \
+      ULONG cElems; \
+      [size_is(cElems)] \
+      type *pElems; \
+    } name
+
+  TYPEDEF_CA(unsigned char, CAUB);
+  TYPEDEF_CA(short, CAI);
+  TYPEDEF_CA(USHORT, CAUI);
+  TYPEDEF_CA(long, CAL);
+  TYPEDEF_CA(ULONG, CAUL);
+  TYPEDEF_CA(float, CAFLT);
+  TYPEDEF_CA(double, CADBL);
+  TYPEDEF_CA(CY, CACY);
+  TYPEDEF_CA(DATE, CADATE);
+  TYPEDEF_CA(BSTR, CABSTR);
+  TYPEDEF_CA(BSTRBLOB, CABSTRBLOB);
+  TYPEDEF_CA(VARIANT_BOOL, CABOOL);
+  TYPEDEF_CA(SCODE,  CASCODE);
+  TYPEDEF_CA(PROPVARIANT, CAPROPVARIANT);
+  TYPEDEF_CA(LARGE_INTEGER, CAH);
+  TYPEDEF_CA(ULARGE_INTEGER, CAUH);
+  TYPEDEF_CA(LPSTR, CALPSTR);
+  TYPEDEF_CA(LPWSTR, CALPWSTR);
+  TYPEDEF_CA(FILETIME, CAFILETIME);
+  TYPEDEF_CA(CLIPDATA, CACLIPDATA);
+  TYPEDEF_CA(CLSID, CACLSID);
+
+  struct tagPROPVARIANT {
+    VARTYPE vt;
+    WORD wReserved1;
+    WORD wReserved2;
+    WORD wReserved3;
+    [switch_is(vt & 0x1fff)] union {
+    [case(VT_EMPTY, VT_NULL)]             ;
+    [case(VT_UI1)]                        UCHAR bVal;
+    [case(VT_I2)]                         short iVal;
+    [case(VT_UI2)]                        USHORT uiVal;
+    [case(VT_BOOL)]                       VARIANT_BOOL boolVal;
+#if 0 /* illegal in C++ */
+    [case(VT_ILLEGAL)]                    _VARIANT_BOOL bool;
+#endif
+    [case(VT_I4)]                         long lVal;
+    [case(VT_UI4)]                        ULONG ulVal;
+    [case(VT_R4)]                         float fltVal;
+    [case(VT_ERROR)]                      SCODE scode;
+    [case(VT_I8)]                         LARGE_INTEGER hVal;
+    [case(VT_UI8)]                        ULARGE_INTEGER uhVal;
+    [case(VT_R8)]                         double dblVal;
+    [case(VT_CY)]                         CY cyVal;
+    [case(VT_DATE)]                       DATE date;
+    [case(VT_FILETIME)]                   FILETIME filetime;
+    [case(VT_CLSID)]                      CLSID *puuid;
+    [case(VT_BLOB, VT_BLOB_OBJECT)]       BLOB blob;
+    [case(VT_CF)]                         CLIPDATA *pclipdata;
+    [case(VT_STREAM, VT_STREAMED_OBJECT)] IStream *pStream;
+    [case(VT_STORAGE, VT_STORED_OBJECT)]  IStorage *pStorage;
+    [case(VT_BSTR)]                       BSTR bstrVal;
+    [case(VT_BSTR_BLOB)]                  BSTRBLOB bstrblobVal;
+    [case(VT_LPSTR)]                      LPSTR pszVal;
+    [case(VT_LPWSTR)]                     LPWSTR pwszVal;
+    [case(VT_UI1|VT_VECTOR)]              CAUB caub;
+    [case(VT_I2|VT_VECTOR)]               CAI cai;
+    [case(VT_UI2|VT_VECTOR)]              CAUI caui;
+    [case(VT_BOOL|VT_VECTOR)]             CABOOL cabool;
+    [case(VT_I4|VT_VECTOR)]               CAL cal;
+    [case(VT_UI4|VT_VECTOR)]              CAUL caul;
+    [case(VT_R4|VT_VECTOR)]               CAFLT caflt;
+    [case(VT_ERROR|VT_VECTOR)]            CASCODE cascode;
+    [case(VT_I8|VT_VECTOR)]               CAH cah;
+    [case(VT_UI8|VT_VECTOR)]              CAUH cauh;
+    [case(VT_R8|VT_VECTOR)]               CADBL cadbl;
+    [case(VT_CY|VT_VECTOR)]               CACY cacy;
+    [case(VT_DATE|VT_VECTOR)]             CADATE cadate;
+    [case(VT_FILETIME|VT_VECTOR)]         CAFILETIME cafiletime;
+    [case(VT_CLSID|VT_VECTOR)]            CACLSID cauuid;
+    [case(VT_CF|VT_VECTOR)]               CACLIPDATA caclipdata;
+    [case(VT_BSTR|VT_VECTOR)]             CABSTR cabstr;
+    [case(VT_BSTR_BLOB|VT_VECTOR)]        CABSTRBLOB cabstrblob;
+    [case(VT_LPSTR|VT_VECTOR)]            CALPSTR calpstr;
+    [case(VT_LPWSTR|VT_VECTOR)]           CALPWSTR calpwstr;
+    [case(VT_VARIANT|VT_VECTOR)]          CAPROPVARIANT capropvar;
+    };
+  };
+
+  typedef struct tagPROPVARIANT *LPPROPVARIANT;
+
+  /* FIXME: bunches of property IDs */
+
+  const ULONG PRSPEC_INVALID = 0xffffffff;
+  const ULONG PRSPEC_LPWSTR = 0;
+  const ULONG PRSPEC_PROPID = 1;
+
+  typedef struct tagPROPSPEC {
+    ULONG ulKind;
+    [switch_is(ulKind)] union {
+    [case(PRSPEC_PROPID)] PROPID propid;
+    [case(PRSPEC_LPWSTR)] LPOLESTR lpwstr;
+    [default]             ;
+    };
+  } PROPSPEC;
+
+  typedef struct tagSTATPROPSTG {
+    LPOLESTR lpwstrName;
+    PROPID propid;
+    VARTYPE vt;
+  } STATPROPSTG;
+
+  /* FIXME: macros */
+
+  typedef struct tagSTATPROPSETSTG {
+    FMTID fmtid;
+    CLSID clsid;
+    DWORD grfFlags;
+    FILETIME mtime;
+    FILETIME ctime;
+    FILETIME atime;
+    DWORD dwOSVersion;
+  } STATPROPSETSTG;
+
+  HRESULT ReadMultiple(
+    [in] ULONG cpspec,
+    [in, size_is(cpspec)] const PROPSPEC rgpspec[],
+    [out, size_is(cpspec)] PROPVARIANT rgpropvar[]);
+
+  HRESULT WriteMultiple(
+    [in] ULONG cpspec,
+    [in, size_is(cpspec)] const PROPSPEC rgpspec[],
+    [in, size_is(cpspec)] const PROPVARIANT rgpropvar[],
+    [in] PROPID propidNameFirst);
+
+  HRESULT DeleteMultiple(
+    [in] ULONG cpspec,
+    [in, size_is(cpspec)] const PROPSPEC rgpspec[]);
+
+  HRESULT ReadPropertyNames(
+    [in] ULONG cpropid,
+    [in, size_is(cpropid)] const PROPID rgpropid[],
+    [out, size_is(cpropid)] LPOLESTR rglpwstrName[]);
+
+  HRESULT WritePropertyNames(
+    [in] ULONG cpropid,
+    [in, size_is(cpropid)] const PROPID rgpropid[],
+    [in, size_is(cpropid)] const LPOLESTR rglpwstrName[]);
+
+  HRESULT DeletePropertyNames(
+    [in] ULONG cpropid,
+    [in, size_is(cpropid)] const PROPID rgpropid[]);
+
+  HRESULT Commit(
+    [in] DWORD grfCommitFlags);
+
+  HRESULT Revert();
+
+  HRESULT Enum(
+    [out] IEnumSTATPROPSTG **ppenum);
+
+  HRESULT SetTimes(
+    [in] const FILETIME *pctime,
+    [in] const FILETIME *patime,
+    [in] const FILETIME *pmtime);
+
+  HRESULT SetClass(
+    [in] REFCLSID clsid);
+
+  HRESULT Stat(
+    [out] STATPROPSETSTG *statpsstg);
+}
+
+[
+  object,
+  uuid(0000013A-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IPropertySetStorage : IUnknown
+{
+  typedef [unique] IPropertySetStorage *LPPROPERTYSETSTORAGE;
+
+  HRESULT Create(
+    [in] REFFMTID rfmtid,
+    [in, unique] const CLSID *pclsid,
+    [in] DWORD grfFlags,
+    [in] DWORD grfMode,
+    [out] IPropertyStorage **ppprstg);
+
+  HRESULT Open(
+    [in] REFFMTID rfmtid,
+    [in] DWORD grfMode,
+    [out] IPropertyStorage **ppprstg);
+
+  HRESULT Delete(
+    [in] REFFMTID rfmtid);
+
+  HRESULT Enum(
+    [out] IEnumSTATPROPSETSTG **ppenum);
+}
+
+[
+  object,
+  uuid(00000139-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumSTATPROPSTG : IUnknown
+{
+  typedef [unique] IEnumSTATPROPSTG *LPENUMSTATPROPSTG;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATPROPSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATPROPSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumSTATPROPSTG **ppenum);
+}
+
+[
+  object,
+  uuid(0000013B-0000-0000-C000-000000000046),
+  pointer_default(unique)
+]
+interface IEnumSTATPROPSETSTG : IUnknown
+{
+  typedef [unique] IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;
+
+  [local]
+  HRESULT Next(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATPROPSETSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  [call_as(Next)]
+  HRESULT RemoteNext(
+    [in] ULONG celt,
+    [out, size_is(celt), length_is(*pceltFetched)]
+    STATPROPSETSTG *rgelt,
+    [out] ULONG *pceltFetched);
+
+  HRESULT Skip(
+    [in] ULONG celt);
+
+  HRESULT Reset();
+
+  HRESULT Clone(
+    [out] IEnumSTATPROPSETSTG **ppenum);
+}
+
+/******************** Connection Points ********************/
+/* FIXME */
+
+/******************** DCOM ********************/
+
+[
+  local,
+  object,
+  uuid(0000013D-0000-0000-C000-000000000046)
+]
+interface IClientSecurity : IUnknown
+{
+  typedef struct tagSOLE_AUTHENTICATION_SERVICE {
+    DWORD dwAuthnSvc;
+    DWORD dwAuthzSvc;
+    OLECHAR *pPrincipalName;
+    HRESULT hr;
+  } SOLE_AUTHENTICATION_SERVICE;
+
+  typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
+
+  typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
+    EOAC_NONE           = 0x0,
+    EOAC_MUTUAL_AUTH    = 0x1,
+    EOAC_CLOAKING       = 0x10,
+    EOAC_SECURE_REFS    = 0x2,
+    EOAC_ACCESS_CONTROL = 0x4,
+    EOAC_APPID          = 0x8
+  } EOLE_AUTHENTICATION_CAPABILITIES;
+
+  HRESULT QueryBlanket(
+    [in] IUnknown *pProxy,
+    [out] DWORD *pAuthnSvc,
+    [out] DWORD *pAuthzSvc,
+    [out] OLECHAR **pServerPrincName,
+    [out] DWORD *pAuthnLevel,
+    [out] DWORD *pImpLevel,
+    [out] void **pAuthInfo,
+    [out] DWORD *pCapabilites);
+
+  HRESULT SetBlanket(
+    [in] IUnknown *pProxy,
+    [in] DWORD AuthnSvc,
+    [in] DWORD AuthzSvc,
+    [in] OLECHAR *pServerPrincName,
+    [in] DWORD AuthnLevel,
+    [in] DWORD ImpLevel,
+    [in] void *pAuthInfo,
+    [in] DWORD Capabilities);
+
+  HRESULT CopyProxy(
+    [in] IUnknown *pProxy,
+    [out] IUnknown **ppCopy);
+}
+
+[
+  local,
+  object,
+  uuid(0000013E-0000-0000-C000-000000000046)
+]
+interface IServerSecurity : IUnknown
+{
+  HRESULT QueryBlanket(
+    [out] DWORD *pAuthnSvc,
+    [out] DWORD *pAuthzSvc,
+    [out] OLECHAR **pServerPrincName,
+    [out] DWORD *pAuthnLevel,
+    [out] DWORD *pImpLevel,
+    [out] void **pPrivs,
+    [out] DWORD *pCapabilities);
+
+  HRESULT ImpersonateClient();
+
+  HRESULT RevertToSelf();
+
+  BOOL IsImpersonating();
+}
+
+[
+  local,
+  object,
+  uuid(00000024-0000-0000-C000-000000000046)
+]
+interface IAsyncSetup : IUnknown
+{
+  HRESULT GetAsyncManager(
+    [in] REFIID riid,
+    [in] IUnknown *pOuter,
+    [in] DWORD dwFlags,
+    [out] IUnknown **ppInner,
+    [out] IAsyncManager **ppAsyncMgr);
+}
+
+[
+  local,
+  object,
+  uuid(0000002A-0000-0000-C000-000000000046)
+]
+interface IAsyncManager : IUnknown
+{
+  typedef enum tagDCOM_CALL_STATE {
+    DCOM_NONE          = 0,
+    DCOM_CALL_COMPLETE = 1,
+    DCOM_CALL_CANCELED = 2
+  } DCOM_CALL_STATE;
+
+  HRESULT CompleteCall(
+    [in] HRESULT Result);
+  HRESULT GetCallContext(
+    [in] REFIID riid,
+    [out] void **pInterface);
+  HRESULT GetState(
+    [out] ULONG *pulStateFlags);
+}