Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2020
- 82 participants
- 799 discussions
Windows SDKs use #include here to import one into the other, so we do
the same.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
v2: So this is probably how it should be, at least to match recent
Windows SDKs, and to define IAgileObject in the right place.
Supersedes: 193527
include/Makefile.in | 1 +
include/objidl.idl | 1217 +---------------------------------------
include/objidlbase.idl | 1198 +++++++++++++++++++++++++++++++++++++++
3 files changed, 1227 insertions(+), 1189 deletions(-)
create mode 100644 include/objidlbase.idl
diff --git a/include/Makefile.in b/include/Makefile.in
index 91a02645c33..8621c5a8ff8 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -532,6 +532,7 @@ SOURCES = \
objbase.h \
objectarray.idl \
objidl.idl \
+ objidlbase.idl \
objsafe.idl \
objsel.h \
ocidl.idl \
diff --git a/include/objidl.idl b/include/objidl.idl
index a86ceb8b1d6..7576a686aeb 100644
--- a/include/objidl.idl
+++ b/include/objidl.idl
@@ -18,166 +18,18 @@
#ifndef DO_NO_IMPORTS
import "unknwn.idl";
+#define DO_NO_IMPORTS
+#define OBJIDL_UNDEF_DO_NO_IMPORTS
+#endif
+
+#include "objidlbase.idl"
+#ifdef OBJIDL_UNDEF_DO_NO_IMPORTS
+#undef DO_NO_IMPORTS
#endif
-interface IStream;
-interface IEnumString;
interface IRunningObjectTable;
interface IMoniker;
interface IAdviseSink;
-interface IAsyncManager;
-interface ISynchronize;
-
-typedef struct _COSERVERINFO {
- DWORD dwReserved1;
- LPWSTR pwszName;
- COAUTHINFO *pAuthInfo;
- DWORD dwReserved2;
-} COSERVERINFO;
-
-/******************** 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(000001cf-0000-0000-C000-000000000046)
-]
-interface IMarshal2 : IMarshal
-{
- typedef [unique] IMarshal2 *LPMARSHAL2;
-}
-
-[
- 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] SIZE_T cb);
-
- LPVOID Realloc(
- [in] LPVOID pv,
- [in] SIZE_T cb);
-
- void Free(
- [in] LPVOID pv);
-
- SIZE_T GetSize(
- [in] LPVOID pv);
-
- int DidAlloc(LPVOID pv);
-
- void HeapMinimize();
-}
[
local,
@@ -233,87 +85,6 @@ interface IMallocSpy : IUnknown
void PostHeapMinimize();
}
-[
- local,
- object,
- uuid(00000021-0000-0000-C000-000000000046)
-]
-interface IInternalUnknown : IUnknown
-{
- HRESULT QueryInternalInterface(
- [in] REFIID riid,
- [out] void **ppv);
-}
-
-[
- 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 ********************/
[
@@ -668,38 +439,6 @@ interface IROTData : IUnknown
[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)
@@ -714,143 +453,6 @@ interface IClassActivator : IUnknown
[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,
uuid(0000000d-0000-0000-C000-000000000046),
@@ -1689,604 +1291,36 @@ interface IMessageFilter : IUnknown
}
[
- local,
- object,
- uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
+ object,
+ uuid(0e6d4d92-6738-11cf-9608-00aa00680db4)
]
-interface IRpcChannelBuffer : IUnknown
+interface IDirectWriterLock : 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 WaitForWriteAccess(
+ [in] DWORD dwTimeout);
- HRESULT GetDestCtx(
- [out] DWORD *pdwDestContext,
- [out] void **ppvDestContext);
+ HRESULT ReleaseWriteAccess();
- HRESULT IsConnected();
+ HRESULT HaveWriteAccess();
}
[
- local,
- object,
- uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
+ object,
+ uuid(00000026-0000-0000-C000-000000000046)
]
-interface IRpcChannelBuffer2 : IRpcChannelBuffer
+interface IUrlMon : IUnknown
{
- 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(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
- pointer_default(unique)
-]
-interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
-{
- HRESULT Send(
- [in, out] RPCOLEMESSAGE *pMsg,
- [in] ISynchronize *pSync,
- [out] ULONG *pulStatus);
-
- HRESULT Receive(
- [in, out] RPCOLEMESSAGE *pMsg,
- [out] ULONG *pulStatus);
-
- HRESULT GetDestCtxEx(
- [in] RPCOLEMESSAGE *pMsg,
- [out] DWORD *pdwDestContext,
- [out] void **ppvDestContext);
-}
-
-[
- local,
- object,
- uuid(58a08519-24c8-4935-b482-3fd823333a4f)
-]
-interface IRpcSyntaxNegotiate : IUnknown
-{
- HRESULT NegotiateSyntax(
- [in, out] RPCOLEMESSAGE *pMsg);
-}
-
-[
- 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 );
-}
-
-extern const FMTID FMTID_SummaryInformation;
-extern const FMTID FMTID_DocSummaryInformation;
-extern const FMTID FMTID_UserDefinedProperties;
-
-
-/******************** 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 struct tagSOLE_AUTHENTICATION_INFO {
- DWORD dwAuthnSvc;
- DWORD dwAuthzSvc;
- void *pAuthInfo;
- } SOLE_AUTHENTICATION_INFO;
-
- const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR*) -1;
- const void *COLE_DEFAULT_AUTHINFO = (void*) -1;
-
- typedef struct tagSOLE_AUTHENTICATION_LIST {
- DWORD cAuthInfo;
- SOLE_AUTHENTICATION_INFO *aAuthInfo;
- } SOLE_AUTHENTICATION_LIST;
-
- typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
- EOAC_NONE = 0x0,
- EOAC_MUTUAL_AUTH = 0x1,
- EOAC_SECURE_REFS = 0x2, /* CoInitializeSecurity only */
- EOAC_ACCESS_CONTROL = 0x4, /* CoInitializeSecurity only */
- EOAC_APPID = 0x8, /* CoInitializeSecurity only */
- EOAC_DYNAMIC = 0x10, /* CoInitializeSecurity only */
- EOAC_STATIC_CLOAKING = 0x20,
- EOAC_DYNAMIC_CLOAKING = 0x40,
- EOAC_ANY_AUTHORITY = 0x80,
- EOAC_MAKE_FULLSIC = 0x100,
- EOAC_REQUIRE_FULLSIC = 0x200, /* CoInitializeSecurity only */
- EOAC_AUTO_IMPERSONATE = 0x400, /* CoInitializeSecurity only */
- EOAC_DEFAULT = 0x800,
- EOAC_DISABLE_AAA = 0x1000, /* CoInitializeSecurity only */
- EOAC_NO_CUSTOM_MARSHAL = 0x2000, /* CoInitializeSecurity only */
- } 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 *pCapabilities);
-
- 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);
-}
-
-[
- object,
- uuid(0e6d4d92-6738-11cf-9608-00aa00680db4)
-]
-interface IDirectWriterLock : IUnknown
-{
- HRESULT WaitForWriteAccess(
- [in] DWORD dwTimeout);
-
- HRESULT ReleaseWriteAccess();
-
- HRESULT HaveWriteAccess();
-}
-
-[
- object,
- uuid(00000030-0000-0000-C000-000000000046)
-]
-
-interface ISynchronize : IUnknown
-{
- HRESULT Wait(
- [in] DWORD dwFlags,
- [in] DWORD dwMilliseconds);
-
- HRESULT Signal();
-
- HRESULT Reset();
-}
-
-
-[
- local,
- object,
- uuid(00000031-0000-0000-C000-000000000046)
-]
-interface ISynchronizeHandle : IUnknown
-{
- HRESULT GetHandle(
- [out] HANDLE *ph);
-}
-
-
-[
- local,
- object,
- uuid(00000032-0000-0000-C000-000000000046)
-]
-interface ISynchronizeEvent : ISynchronizeHandle
-{
- HRESULT SetEventHandle(
- [in] HANDLE *ph);
-}
-
-
-[
- local,
- object,
- uuid(00000033-0000-0000-C000-000000000046)
-]
-interface ISynchronizeContainer : IUnknown
-{
- HRESULT AddSynchronize(
- [in] ISynchronize *pSync);
-
- HRESULT WaitMultiple(
- [in] DWORD dwFlags,
- [in] DWORD dwTimeOut,
- [out] ISynchronize **ppSync);
-}
-
-[
- local,
- object,
- uuid(00000025-0000-0000-C000-000000000046)
-]
-interface ISynchronizeMutex : ISynchronize
-{
- HRESULT ReleaseMutex();
-}
-
-[
- local,
- object,
- uuid(00000029-0000-0000-C000-000000000046)
-]
-
-interface ICancelMethodCalls : IUnknown
-{
- typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;
-
- HRESULT Cancel(
- [in] ULONG ulSeconds);
-
- HRESULT TestCancel();
-}
-
-[
- 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);
-}
-
-[
- local,
- object,
- uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
- pointer_default(unique)
-]
-interface ICallFactory : IUnknown
-{
- HRESULT CreateCall(
- [in] REFIID riid,
- [in] IUnknown *pCtrlUnk,
- [in] REFIID riid2,
- [out, iid_is(riid2)] IUnknown **ppv);
-}
-
-[
- local,
- object,
- uuid(00000144-0000-0000-C000-000000000046)
-]
-interface IRpcOptions : IUnknown
-{
- HRESULT Set(
- [in] IUnknown *pPrx,
- [in] DWORD dwProperty,
- [in] ULONG_PTR dwValue);
-
- HRESULT Query(
- [in] IUnknown *pPrx,
- [in] DWORD dwProperty,
- [out] ULONG_PTR *pdwValue);
-}
-
-enum {
- COMBND_RPCTIMEOUT = 1,
- COMBND_SERVER_LOCALITY = 2
-};
-
-enum {
- SERVER_LOCALITY_PROCESS_LOCAL = 0,
- SERVER_LOCALITY_MACHINE_LOCAL = 1,
- SERVER_LOCALITY_REMOTE = 2
-};
-
-[
- local,
- object,
- uuid(00000149-0000-0000-C000-000000000046),
- pointer_default(unique)
-]
-interface IRpcHelper : IUnknown
-{
- HRESULT GetDCOMProtocolVersion(
- [out] DWORD *pComVersion);
-
- HRESULT GetIIDFromOBJREF(
- [in] void *pObjRef,
- [out] IID **piid);
-}
-
-[
- local,
- object,
- uuid(eb0cb9e8-7996-11d2-872e-0000f8080859)
-]
-interface IReleaseMarshalBuffers : IUnknown
-{
- HRESULT ReleaseMarshalBuffer(
- [in] RPCOLEMESSAGE *pMsg,
- [in] DWORD dwFlags,
- [in, unique] IUnknown *pChnl);
-}
-
-[
- local,
- object,
- uuid(0000002B-0000-0000-C000-000000000046)
-]
-interface IWaitMultiple : IUnknown
-{
- HRESULT WaitMultiple(
- [in] DWORD timeout,
- [out] ISynchronize **pSync);
- HRESULT AddSynchronize(
- [in] ISynchronize *pSync);
-}
-
-
-[
- object,
- uuid(00000026-0000-0000-C000-000000000046)
-]
-interface IUrlMon : IUnknown
-{
- HRESULT AsyncGetClassBits(
- [in] REFCLSID rclsid,
- [in, unique] LPCWSTR pszTYPE,
- [in, unique] LPCWSTR pszExt,
- [in] DWORD dwFileVersionMS,
- [in] DWORD dwFileVersionLS,
- [in, unique] LPCWSTR pszCodeBase,
- [in] IBindCtx *pbc,
- [in] DWORD dwClassContext,
- [in] REFIID riid,
- [in] DWORD flags);
+ HRESULT AsyncGetClassBits(
+ [in] REFCLSID rclsid,
+ [in, unique] LPCWSTR pszTYPE,
+ [in, unique] LPCWSTR pszExt,
+ [in] DWORD dwFileVersionMS,
+ [in] DWORD dwFileVersionLS,
+ [in, unique] LPCWSTR pszCodeBase,
+ [in] IBindCtx *pbc,
+ [in] DWORD dwClassContext,
+ [in] REFIID riid,
+ [in] DWORD flags);
}
[
@@ -2300,87 +1334,6 @@ interface IForegroundTransfer : IUnknown
[in] void *lpvReserved);
}
-[
- local,
- object,
- uuid(00000147-0000-0000-C000-000000000046)
-]
-interface IAddrTrackingControl : IUnknown
-{
- typedef [unique] IAddrTrackingControl *LPADDRTRACKINGCONTROL;
-
- HRESULT EnableCOMDynamicAddrTracking();
- HRESULT DisableCOMDynamicAddrTracking();
-}
-
-[
- local,
- object,
- uuid(00000148-0000-0000-C000-000000000046)
-]
-interface IAddrExclusionControl : IUnknown
-{
- typedef [unique] IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
-
- HRESULT GetCurrentAddrExclusionList(
- [in] REFIID riid,
- [out, iid_is(riid)] void **ppEnumerator);
- HRESULT UpdateAddrExclusionList(
- [in] IUnknown *pEnumerator);
-}
-
-typedef enum _APTTYPE {
- APTTYPE_CURRENT = -1,
- APTTYPE_STA = 0,
- APTTYPE_MTA = 1,
- APTTYPE_NA = 2,
- APTTYPE_MAINSTA = 3
-} APTTYPE;
-
-typedef enum _APTTYPEQUALIFIER {
- APTTYPEQUALIFIER_NONE,
- APTTYPEQUALIFIER_IMPLICIT_MTA,
- APTTYPEQUALIFIER_NA_ON_MTA,
- APTTYPEQUALIFIER_NA_ON_STA,
- APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA,
- APTTYPEQUALIFIER_NA_ON_MAINSTA
-} APTTYPEQUALIFIER;
-
-typedef enum _THDTYPE {
- THDTYPE_BLOCKMESSAGES = 0,
- THDTYPE_PROCESSMESSAGES = 1
-} THDTYPE;
-
-[
- local,
- object,
- uuid(000001ce-0000-0000-C000-000000000046),
- pointer_default(unique)
-]
-interface IComThreadingInfo : IUnknown
-{
- HRESULT GetCurrentApartmentType(
- [out] APTTYPE *pAptType);
- HRESULT GetCurrentThreadType(
- [out] THDTYPE *pThreadType);
- HRESULT GetCurrentLogicalThreadId(
- [out] GUID *pguidLogicalThreadId);
- HRESULT SetCurrentLogicalThreadId(
- [in] REFGUID rguid);
-}
-
-
-[
- object,
- pointer_default(unique),
- uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
-]
-interface IProcessInitControl : IUnknown
-{
- HRESULT ResetInitializerTimeout(
- [in] DWORD dwSecondsRemaining);
-}
-
[
local,
object,
@@ -2426,40 +1379,6 @@ interface IThumbnailExtractor : IUnknown
[in] IStorage *pStg);
}
-typedef enum tagGLOBALOPT_PROPERTIES
-{
- COMGLB_EXCEPTION_HANDLING = 1,
- COMGLB_APPID = 2,
- COMGLB_RPC_THREADPOOL_SETTING = 3
-} GLOBALOPT_PROPERTIES;
-
-typedef enum tagGLOBALOPT_EH_VALUES
-{
- COMGLB_EXCEPTION_HANDLE = 0,
- COMGLB_EXCEPTION_DONOT_HANDLE_FATAL = 1,
- COMGLB_EXCEPTION_DONOT_HANDLE = COMGLB_EXCEPTION_DONOT_HANDLE_FATAL,
- COMGLB_EXCEPTION_DONOT_HANDLE_ANY = 2
-} GLOBALOPT_EH_VALUES;
-
-typedef enum tagGLOBALOPT_RPCTP_VALUES
-{
- COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL = 0,
- COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL = 1
-} GLOBALOPT_RPCTP_VALUES;
-
-
-[
- object,
- local,
- pointer_default(unique),
- uuid(0000015B-0000-0000-C000-000000000046)
-]
-interface IGlobalOptions : IUnknown
-{
- HRESULT Set([in] GLOBALOPT_PROPERTIES property, [in] ULONG_PTR value);
- HRESULT Query([in] GLOBALOPT_PROPERTIES property, [out ] ULONG_PTR *value);
-}
-
[
object,
pointer_default(unique),
@@ -2480,83 +1399,3 @@ interface IApartmentShutdown : IUnknown
{
void OnUninitialize([in] UINT64 identifier);
}
-
-cpp_quote("#ifdef USE_COM_CONTEXT_DEF")
-
-typedef DWORD CPFLAGS;
-
-typedef struct tagContextProperty
-{
- GUID policyId;
- CPFLAGS flags;
- [unique] IUnknown *pUnk;
-} ContextProperty;
-
-[
- local,
- object,
- uuid(000001c1-0000-0000-C000-000000000046)
-]
-interface IEnumContextProps : IUnknown
-{
- typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS;
-
- HRESULT Next(
- [in] ULONG celt,
- [out, size_is(celt), length_is(*pceltFetched)] ContextProperty *pContextProperties,
- [out] ULONG *pceltFetched);
-
- HRESULT Skip(
- [in] ULONG celt);
-
- HRESULT Reset();
-
- HRESULT Clone(
- [out] IEnumContextProps **ppEnumContextProps);
-
- HRESULT Count(
- [out] ULONG *pcelt);
-}
-
-[
- local,
- object,
- uuid(000001c0-0000-0000-C000-000000000046)
-]
-interface IContext : IUnknown
-{
- HRESULT SetProperty(
- [in] REFGUID policyId,
- [in] CPFLAGS flags,
- [in] IUnknown *pUnk);
-
- HRESULT RemoveProperty(
- [in] REFGUID policyId);
-
- HRESULT GetProperty(
- [in] REFGUID guid,
- [out] CPFLAGS *pFlags,
- [out] IUnknown **ppUnk);
-
- HRESULT EnumContextProps(
- [out] IEnumContextProps **ppEnumContextProps);
-}
-
-[
- local,
- object,
- uuid(000001c6-0000-0000-c000-000000000046),
- pointer_default(unique)
-]
-interface IObjContext : IContext
-{
- void Reserved1();
- void Reserved2();
- void Reserved3();
- void Reserved4();
- void Reserved5();
- void Reserved6();
- void Reserved7();
-}
-
-cpp_quote("#endif /* defined USE_COM_CONTEXT_DEF */")
diff --git a/include/objidlbase.idl b/include/objidlbase.idl
new file mode 100644
index 00000000000..47602b98d35
--- /dev/null
+++ b/include/objidlbase.idl
@@ -0,0 +1,1198 @@
+/*
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DO_NO_IMPORTS
+import "unknwn.idl";
+#endif
+
+cpp_quote("#ifndef _OBJIDLBASE_")
+cpp_quote("#define _OBJIDLBASE_")
+
+interface IStream;
+interface IEnumString;
+
+interface IAsyncManager;
+interface ISynchronize;
+
+typedef struct _COSERVERINFO {
+ DWORD dwReserved1;
+ LPWSTR pwszName;
+ COAUTHINFO *pAuthInfo;
+ DWORD dwReserved2;
+} COSERVERINFO;
+
+/******************** 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(000001cf-0000-0000-C000-000000000046)
+]
+interface IMarshal2 : IMarshal
+{
+ typedef [unique] IMarshal2 *LPMARSHAL2;
+}
+
+[
+ 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] SIZE_T cb);
+
+ LPVOID Realloc(
+ [in] LPVOID pv,
+ [in] SIZE_T cb);
+
+ void Free(
+ [in] LPVOID pv);
+
+ SIZE_T GetSize(
+ [in] LPVOID pv);
+
+ int DidAlloc(LPVOID pv);
+
+ void HeapMinimize();
+}
+
+[
+ local,
+ object,
+ uuid(00000021-0000-0000-C000-000000000046)
+]
+interface IInternalUnknown : IUnknown
+{
+ HRESULT QueryInternalInterface(
+ [in] REFIID riid,
+ [out] void **ppv);
+}
+
+[
+ 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);
+}
+
+[
+ 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);
+}
+
+/******************** 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);
+}
+
+
+
+
+[
+ 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(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
+ pointer_default(unique)
+]
+interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
+{
+ HRESULT Send(
+ [in, out] RPCOLEMESSAGE *pMsg,
+ [in] ISynchronize *pSync,
+ [out] ULONG *pulStatus);
+
+ HRESULT Receive(
+ [in, out] RPCOLEMESSAGE *pMsg,
+ [out] ULONG *pulStatus);
+
+ HRESULT GetDestCtxEx(
+ [in] RPCOLEMESSAGE *pMsg,
+ [out] DWORD *pdwDestContext,
+ [out] void **ppvDestContext);
+}
+
+[
+ local,
+ object,
+ uuid(58a08519-24c8-4935-b482-3fd823333a4f)
+]
+interface IRpcSyntaxNegotiate : IUnknown
+{
+ HRESULT NegotiateSyntax(
+ [in, out] RPCOLEMESSAGE *pMsg);
+}
+
+[
+ 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 );
+}
+
+extern const FMTID FMTID_SummaryInformation;
+extern const FMTID FMTID_DocSummaryInformation;
+extern const FMTID FMTID_UserDefinedProperties;
+
+
+/******************** 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 struct tagSOLE_AUTHENTICATION_INFO {
+ DWORD dwAuthnSvc;
+ DWORD dwAuthzSvc;
+ void *pAuthInfo;
+ } SOLE_AUTHENTICATION_INFO;
+
+ const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR*) -1;
+ const void *COLE_DEFAULT_AUTHINFO = (void*) -1;
+
+ typedef struct tagSOLE_AUTHENTICATION_LIST {
+ DWORD cAuthInfo;
+ SOLE_AUTHENTICATION_INFO *aAuthInfo;
+ } SOLE_AUTHENTICATION_LIST;
+
+ typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
+ EOAC_NONE = 0x0,
+ EOAC_MUTUAL_AUTH = 0x1,
+ EOAC_SECURE_REFS = 0x2, /* CoInitializeSecurity only */
+ EOAC_ACCESS_CONTROL = 0x4, /* CoInitializeSecurity only */
+ EOAC_APPID = 0x8, /* CoInitializeSecurity only */
+ EOAC_DYNAMIC = 0x10, /* CoInitializeSecurity only */
+ EOAC_STATIC_CLOAKING = 0x20,
+ EOAC_DYNAMIC_CLOAKING = 0x40,
+ EOAC_ANY_AUTHORITY = 0x80,
+ EOAC_MAKE_FULLSIC = 0x100,
+ EOAC_REQUIRE_FULLSIC = 0x200, /* CoInitializeSecurity only */
+ EOAC_AUTO_IMPERSONATE = 0x400, /* CoInitializeSecurity only */
+ EOAC_DEFAULT = 0x800,
+ EOAC_DISABLE_AAA = 0x1000, /* CoInitializeSecurity only */
+ EOAC_NO_CUSTOM_MARSHAL = 0x2000, /* CoInitializeSecurity only */
+ } 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 *pCapabilities);
+
+ 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);
+}
+
+[
+ object,
+ uuid(00000030-0000-0000-C000-000000000046)
+]
+
+interface ISynchronize : IUnknown
+{
+ HRESULT Wait(
+ [in] DWORD dwFlags,
+ [in] DWORD dwMilliseconds);
+
+ HRESULT Signal();
+
+ HRESULT Reset();
+}
+
+
+[
+ local,
+ object,
+ uuid(00000031-0000-0000-C000-000000000046)
+]
+interface ISynchronizeHandle : IUnknown
+{
+ HRESULT GetHandle(
+ [out] HANDLE *ph);
+}
+
+
+[
+ local,
+ object,
+ uuid(00000032-0000-0000-C000-000000000046)
+]
+interface ISynchronizeEvent : ISynchronizeHandle
+{
+ HRESULT SetEventHandle(
+ [in] HANDLE *ph);
+}
+
+
+[
+ local,
+ object,
+ uuid(00000033-0000-0000-C000-000000000046)
+]
+interface ISynchronizeContainer : IUnknown
+{
+ HRESULT AddSynchronize(
+ [in] ISynchronize *pSync);
+
+ HRESULT WaitMultiple(
+ [in] DWORD dwFlags,
+ [in] DWORD dwTimeOut,
+ [out] ISynchronize **ppSync);
+}
+
+[
+ local,
+ object,
+ uuid(00000025-0000-0000-C000-000000000046)
+]
+interface ISynchronizeMutex : ISynchronize
+{
+ HRESULT ReleaseMutex();
+}
+
+[
+ local,
+ object,
+ uuid(00000029-0000-0000-C000-000000000046)
+]
+
+interface ICancelMethodCalls : IUnknown
+{
+ typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;
+
+ HRESULT Cancel(
+ [in] ULONG ulSeconds);
+
+ HRESULT TestCancel();
+}
+
+[
+ 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);
+}
+
+[
+ local,
+ object,
+ uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
+ pointer_default(unique)
+]
+interface ICallFactory : IUnknown
+{
+ HRESULT CreateCall(
+ [in] REFIID riid,
+ [in] IUnknown *pCtrlUnk,
+ [in] REFIID riid2,
+ [out, iid_is(riid2)] IUnknown **ppv);
+}
+
+[
+ local,
+ object,
+ uuid(00000144-0000-0000-C000-000000000046)
+]
+interface IRpcOptions : IUnknown
+{
+ HRESULT Set(
+ [in] IUnknown *pPrx,
+ [in] DWORD dwProperty,
+ [in] ULONG_PTR dwValue);
+
+ HRESULT Query(
+ [in] IUnknown *pPrx,
+ [in] DWORD dwProperty,
+ [out] ULONG_PTR *pdwValue);
+}
+
+enum {
+ COMBND_RPCTIMEOUT = 1,
+ COMBND_SERVER_LOCALITY = 2
+};
+
+enum {
+ SERVER_LOCALITY_PROCESS_LOCAL = 0,
+ SERVER_LOCALITY_MACHINE_LOCAL = 1,
+ SERVER_LOCALITY_REMOTE = 2
+};
+
+[
+ local,
+ object,
+ uuid(00000149-0000-0000-C000-000000000046),
+ pointer_default(unique)
+]
+interface IRpcHelper : IUnknown
+{
+ HRESULT GetDCOMProtocolVersion(
+ [out] DWORD *pComVersion);
+
+ HRESULT GetIIDFromOBJREF(
+ [in] void *pObjRef,
+ [out] IID **piid);
+}
+
+[
+ local,
+ object,
+ uuid(eb0cb9e8-7996-11d2-872e-0000f8080859)
+]
+interface IReleaseMarshalBuffers : IUnknown
+{
+ HRESULT ReleaseMarshalBuffer(
+ [in] RPCOLEMESSAGE *pMsg,
+ [in] DWORD dwFlags,
+ [in, unique] IUnknown *pChnl);
+}
+
+[
+ local,
+ object,
+ uuid(0000002B-0000-0000-C000-000000000046)
+]
+interface IWaitMultiple : IUnknown
+{
+ HRESULT WaitMultiple(
+ [in] DWORD timeout,
+ [out] ISynchronize **pSync);
+ HRESULT AddSynchronize(
+ [in] ISynchronize *pSync);
+}
+
+
+[
+ local,
+ object,
+ uuid(00000147-0000-0000-C000-000000000046)
+]
+interface IAddrTrackingControl : IUnknown
+{
+ typedef [unique] IAddrTrackingControl *LPADDRTRACKINGCONTROL;
+
+ HRESULT EnableCOMDynamicAddrTracking();
+ HRESULT DisableCOMDynamicAddrTracking();
+}
+
+[
+ local,
+ object,
+ uuid(00000148-0000-0000-C000-000000000046)
+]
+interface IAddrExclusionControl : IUnknown
+{
+ typedef [unique] IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
+
+ HRESULT GetCurrentAddrExclusionList(
+ [in] REFIID riid,
+ [out, iid_is(riid)] void **ppEnumerator);
+ HRESULT UpdateAddrExclusionList(
+ [in] IUnknown *pEnumerator);
+}
+
+typedef enum _APTTYPE {
+ APTTYPE_CURRENT = -1,
+ APTTYPE_STA = 0,
+ APTTYPE_MTA = 1,
+ APTTYPE_NA = 2,
+ APTTYPE_MAINSTA = 3
+} APTTYPE;
+
+typedef enum _APTTYPEQUALIFIER {
+ APTTYPEQUALIFIER_NONE,
+ APTTYPEQUALIFIER_IMPLICIT_MTA,
+ APTTYPEQUALIFIER_NA_ON_MTA,
+ APTTYPEQUALIFIER_NA_ON_STA,
+ APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA,
+ APTTYPEQUALIFIER_NA_ON_MAINSTA
+} APTTYPEQUALIFIER;
+
+typedef enum _THDTYPE {
+ THDTYPE_BLOCKMESSAGES = 0,
+ THDTYPE_PROCESSMESSAGES = 1
+} THDTYPE;
+
+[
+ local,
+ object,
+ uuid(000001ce-0000-0000-C000-000000000046),
+ pointer_default(unique)
+]
+interface IComThreadingInfo : IUnknown
+{
+ HRESULT GetCurrentApartmentType(
+ [out] APTTYPE *pAptType);
+ HRESULT GetCurrentThreadType(
+ [out] THDTYPE *pThreadType);
+ HRESULT GetCurrentLogicalThreadId(
+ [out] GUID *pguidLogicalThreadId);
+ HRESULT SetCurrentLogicalThreadId(
+ [in] REFGUID rguid);
+}
+
+
+[
+ object,
+ pointer_default(unique),
+ uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
+]
+interface IProcessInitControl : IUnknown
+{
+ HRESULT ResetInitializerTimeout(
+ [in] DWORD dwSecondsRemaining);
+}
+
+typedef enum tagGLOBALOPT_PROPERTIES
+{
+ COMGLB_EXCEPTION_HANDLING = 1,
+ COMGLB_APPID = 2,
+ COMGLB_RPC_THREADPOOL_SETTING = 3
+} GLOBALOPT_PROPERTIES;
+
+typedef enum tagGLOBALOPT_EH_VALUES
+{
+ COMGLB_EXCEPTION_HANDLE = 0,
+ COMGLB_EXCEPTION_DONOT_HANDLE_FATAL = 1,
+ COMGLB_EXCEPTION_DONOT_HANDLE = COMGLB_EXCEPTION_DONOT_HANDLE_FATAL,
+ COMGLB_EXCEPTION_DONOT_HANDLE_ANY = 2
+} GLOBALOPT_EH_VALUES;
+
+typedef enum tagGLOBALOPT_RPCTP_VALUES
+{
+ COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL = 0,
+ COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL = 1
+} GLOBALOPT_RPCTP_VALUES;
+
+
+[
+ object,
+ local,
+ pointer_default(unique),
+ uuid(0000015B-0000-0000-C000-000000000046)
+]
+interface IGlobalOptions : IUnknown
+{
+ HRESULT Set([in] GLOBALOPT_PROPERTIES property, [in] ULONG_PTR value);
+ HRESULT Query([in] GLOBALOPT_PROPERTIES property, [out ] ULONG_PTR *value);
+}
+
+cpp_quote("#ifdef USE_COM_CONTEXT_DEF")
+
+typedef DWORD CPFLAGS;
+
+typedef struct tagContextProperty
+{
+ GUID policyId;
+ CPFLAGS flags;
+ [unique] IUnknown *pUnk;
+} ContextProperty;
+
+[
+ local,
+ object,
+ uuid(000001c1-0000-0000-C000-000000000046)
+]
+interface IEnumContextProps : IUnknown
+{
+ typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS;
+
+ HRESULT Next(
+ [in] ULONG celt,
+ [out, size_is(celt), length_is(*pceltFetched)] ContextProperty *pContextProperties,
+ [out] ULONG *pceltFetched);
+
+ HRESULT Skip(
+ [in] ULONG celt);
+
+ HRESULT Reset();
+
+ HRESULT Clone(
+ [out] IEnumContextProps **ppEnumContextProps);
+
+ HRESULT Count(
+ [out] ULONG *pcelt);
+}
+
+[
+ local,
+ object,
+ uuid(000001c0-0000-0000-C000-000000000046)
+]
+interface IContext : IUnknown
+{
+ HRESULT SetProperty(
+ [in] REFGUID policyId,
+ [in] CPFLAGS flags,
+ [in] IUnknown *pUnk);
+
+ HRESULT RemoveProperty(
+ [in] REFGUID policyId);
+
+ HRESULT GetProperty(
+ [in] REFGUID guid,
+ [out] CPFLAGS *pFlags,
+ [out] IUnknown **ppUnk);
+
+ HRESULT EnumContextProps(
+ [out] IEnumContextProps **ppEnumContextProps);
+}
+
+[
+ local,
+ object,
+ uuid(000001c6-0000-0000-c000-000000000046),
+ pointer_default(unique)
+]
+interface IObjContext : IContext
+{
+ void Reserved1();
+ void Reserved2();
+ void Reserved3();
+ void Reserved4();
+ void Reserved5();
+ void Reserved6();
+ void Reserved7();
+}
+
+cpp_quote("#endif /* defined USE_COM_CONTEXT_DEF */")
+cpp_quote("#endif /* defined _OBJIDLBASE_ */")
--
2.28.0
1
1
[PATCH v2] xactengine3_7: Explicity copy the XACT_RUNTIME_PARAMETERS members
by Alistair Leslie-Hughes 02 Oct '20
by Alistair Leslie-Hughes 02 Oct '20
02 Oct '20
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=49911
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/xactengine3_7/xact_dll.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/xactengine3_7/xact_dll.c b/dlls/xactengine3_7/xact_dll.c
index e6e4dbb7b35..667ac58128b 100644
--- a/dlls/xactengine3_7/xact_dll.c
+++ b/dlls/xactengine3_7/xact_dll.c
@@ -780,7 +780,16 @@ static HRESULT WINAPI IXACT3EngineImpl_Initialize(IXACT3Engine *iface,
TRACE("(%p)->(%p)\n", This, pParams);
- memcpy(¶ms, pParams, sizeof(FACTRuntimeParameters));
+ memset(¶ms, 0, sizeof(FACTRuntimeParameters));
+ /* Explicitly copy to the FAudio structure as the packing is wrong under 64 bits */
+ params.lookAheadTime = pParams->lookAheadTime;
+ params.pGlobalSettingsBuffer = pParams->pGlobalSettingsBuffer;
+ params.globalSettingsBufferSize = pParams->globalSettingsBufferSize;
+ params.globalSettingsFlags = pParams->globalSettingsFlags;
+ params.globalSettingsAllocAttributes = pParams->globalSettingsAllocAttributes;
+ params.pRendererID = (int16_t*)pParams->pRendererID;
+ params.pXAudio2 = NULL;
+ params.pMasteringVoice = NULL;
/* FIXME: pXAudio2 and pMasteringVoice are pointers to
* IXAudio2/IXAudio2MasteringVoice objects. FACT wants pointers to
@@ -793,12 +802,10 @@ static HRESULT WINAPI IXACT3EngineImpl_Initialize(IXACT3Engine *iface,
* -flibit
*/
if (pParams->pXAudio2 != NULL){
- FIXME("pXAudio2 parameter not supported! Falling back to NULL\n");
- params.pXAudio2 = NULL;
+ FIXME("pXAudio2 parameter not supported!\n");
if (pParams->pMasteringVoice != NULL){
- FIXME("pXAudio2 parameter not supported! Falling back to NULL\n");
- params.pMasteringVoice = NULL;
+ FIXME("pMasteringVoice parameter not supported!\n");
}
}
--
2.28.0
1
0
02 Oct '20
IP Address controls (SysIPAddress32) should set focus to the edit box
upon WM_SETFOCUS.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49924
Signed-off-by: Hirofumi Katayama <katayama.hirofumi.mz(a)gmail.com>
---
I forgot attachment.
https://github.com/reactos/reactos/commit/0733d96d9d90337c9c0537c0406650c9a…
https://jira.reactos.org/browse/CORE-3479
2
1
[PATCH v2 1/4] amstream: Implement IDirectDrawStreamSample::CompletionStatus.
by Anton Baskanov 02 Oct '20
by Anton Baskanov 02 Oct '20
02 Oct '20
Signed-off-by: Anton Baskanov <baskanov(a)gmail.com>
---
dlls/amstream/ddrawstream.c | 53 ++++--
dlls/amstream/tests/amstream.c | 292 +++++++++++++++++++++++++++++++++
2 files changed, 335 insertions(+), 10 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c
index 972c2b9f4d0..2526410cbff 100644
--- a/dlls/amstream/ddrawstream.c
+++ b/dlls/amstream/ddrawstream.c
@@ -70,7 +70,7 @@ struct ddraw_sample
struct ddraw_stream *parent;
IDirectDrawSurface *surface;
RECT rect;
- HANDLE update_event;
+ CONDITION_VARIABLE update_cv;
struct list entry;
HRESULT update_hr;
@@ -82,7 +82,7 @@ static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDraw
static void remove_queued_update(struct ddraw_sample *sample)
{
list_remove(&sample->entry);
- SetEvent(sample->update_event);
+ WakeConditionVariable(&sample->update_cv);
}
static void flush_update_queue(struct ddraw_stream *stream, HRESULT update_hr)
@@ -1414,7 +1414,6 @@ static ULONG WINAPI ddraw_sample_Release(IDirectDrawStreamSample *iface)
if (sample->surface)
IDirectDrawSurface_Release(sample->surface);
- CloseHandle(sample->update_event);
HeapFree(GetProcessHeap(), 0, sample);
}
@@ -1491,6 +1490,7 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
}
if (!sample->parent->peer || sample->parent->eos)
{
+ sample->update_hr = MS_S_ENDOFSTREAM;
LeaveCriticalSection(&sample->parent->cs);
return MS_S_ENDOFSTREAM;
}
@@ -1501,25 +1501,58 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
}
sample->update_hr = MS_S_PENDING;
- ResetEvent(sample->update_event);
list_add_tail(&sample->parent->update_queue, &sample->entry);
WakeConditionVariable(&sample->parent->update_queued_cv);
- LeaveCriticalSection(&sample->parent->cs);
-
if (flags & SSUPDATE_ASYNC)
+ {
+ LeaveCriticalSection(&sample->parent->cs);
return MS_S_PENDING;
+ }
+
+ while (sample->update_hr == MS_S_PENDING)
+ SleepConditionVariableCS(&sample->update_cv, &sample->parent->cs, INFINITE);
- WaitForSingleObject(sample->update_event, INFINITE);
+ LeaveCriticalSection(&sample->parent->cs);
return sample->update_hr;
}
static HRESULT WINAPI ddraw_sample_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
{
- FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
+ struct ddraw_sample *sample = impl_from_IDirectDrawStreamSample(iface);
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("sample %p, flags %#x, milliseconds %u.\n", sample, flags, milliseconds);
+
+ EnterCriticalSection(&sample->parent->cs);
+
+ if (sample->update_hr == MS_S_PENDING)
+ {
+ if (flags & (COMPSTAT_NOUPDATEOK | COMPSTAT_ABORT))
+ {
+ sample->update_hr = MS_S_NOUPDATE;
+ remove_queued_update(sample);
+ }
+ else if (flags & COMPSTAT_WAIT)
+ {
+ DWORD start_time = GetTickCount();
+ DWORD elapsed = 0;
+ while (sample->update_hr == MS_S_PENDING && elapsed < milliseconds)
+ {
+ DWORD sleep_time = milliseconds - elapsed;
+ if (!SleepConditionVariableCS(&sample->update_cv, &sample->parent->cs, sleep_time))
+ break;
+ elapsed = GetTickCount() - start_time;
+ }
+ }
+ }
+
+ hr = sample->update_hr;
+
+ LeaveCriticalSection(&sample->parent->cs);
+
+ return hr;
}
/*** IDirectDrawStreamSample methods ***/
@@ -1583,7 +1616,7 @@ static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDraw
object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
object->ref = 1;
object->parent = parent;
- object->update_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ InitializeConditionVariable(&object->update_cv);
IAMMediaStream_AddRef(&parent->IAMMediaStream_iface);
++parent->sample_refs;
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index e5d1dd621f3..5467b519189 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -4028,6 +4028,21 @@ static DWORD CALLBACK ammediastream_receive(void *param)
return 0;
}
+static IStreamSample *streamsample_sample;
+static DWORD streamsample_flags;
+static DWORD streamsample_timeout;
+static HRESULT streamsample_expected_hr;
+
+static DWORD CALLBACK streamsample_completion_status(void *param)
+{
+ HRESULT hr;
+
+ hr = IStreamSample_CompletionStatus(streamsample_sample, streamsample_flags, streamsample_timeout);
+ ok(hr == streamsample_expected_hr, "Got hr %#x.\n", hr);
+
+ return 0;
+}
+
static void test_audiostreamsample_update(void)
{
static const BYTE test_data[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
@@ -7221,6 +7236,282 @@ static void test_ddrawstreamsample_update(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_ddrawstreamsample_completion_status(void)
+{
+ static const BYTE test_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+ IAMMultiMediaStream *mmstream = create_ammultimediastream();
+ IDirectDrawStreamSample *stream_sample1;
+ IDirectDrawStreamSample *stream_sample2;
+ IDirectDrawMediaStream *ddraw_stream;
+ IMediaSample *media_sample;
+ IMediaFilter *media_filter;
+ struct testfilter source;
+ VIDEOINFO video_info;
+ IGraphBuilder *graph;
+ IMediaStream *stream;
+ AM_MEDIA_TYPE mt;
+ HANDLE thread;
+ HRESULT hr;
+ ULONG ref;
+ IPin *pin;
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IDirectDrawMediaStream, (void **)&ddraw_stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IPin, (void **)&pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(graph != NULL, "Expected non-NULL graph.\n");
+ hr = IGraphBuilder_QueryInterface(graph, &IID_IMediaFilter, (void **)&media_filter);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ testfilter_init(&source);
+ hr = IGraphBuilder_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaFilter_SetSyncSource(media_filter, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ video_info = rgb32_video_info;
+ video_info.bmiHeader.biWidth = 3;
+ video_info.bmiHeader.biHeight = 1;
+ mt = rgb32_mt;
+ mt.pbFormat = (BYTE *)&video_info;
+ hr = IGraphBuilder_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &mt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &stream_sample1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &stream_sample2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, 100);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_NOUPDATEOK, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_ABORT, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_NOUPDATEOK | COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_ABORT | COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ streamsample_sample = (IStreamSample *)stream_sample1;
+ streamsample_flags = COMPSTAT_WAIT;
+ streamsample_timeout = INFINITE;
+ streamsample_expected_hr = S_OK;
+ thread = CreateThread(NULL, 0, streamsample_completion_status, NULL, 0, NULL);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "CompletionStatus returned prematurely.\n");
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ ok(!WaitForSingleObject(thread, 2000), "Wait timed out.\n");
+ CloseHandle(thread);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ streamsample_sample = (IStreamSample *)stream_sample1;
+ streamsample_flags = COMPSTAT_WAIT;
+ streamsample_timeout = INFINITE;
+ streamsample_expected_hr = MS_S_ENDOFSTREAM;
+ thread = CreateThread(NULL, 0, streamsample_completion_status, NULL, 0, NULL);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "CompletionStatus returned prematurely.\n");
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ ok(!WaitForSingleObject(thread, 2000), "Wait timed out.\n");
+ CloseHandle(thread);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, 6);
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_E_NOTRUNNING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ IGraphBuilder_Disconnect(graph, pin);
+ IGraphBuilder_Disconnect(graph, &source.source.pin.IPin_iface);
+
+ ref = IDirectDrawStreamSample_Release(stream_sample1);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IDirectDrawStreamSample_Release(stream_sample2);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IMediaFilter_Release(media_filter);
+ ref = IGraphBuilder_Release(graph);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IPin_Release(pin);
+ IDirectDrawMediaStream_Release(ddraw_stream);
+ ref = IMediaStream_Release(stream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(amstream)
{
const WCHAR *test_avi_path;
@@ -7276,6 +7567,7 @@ START_TEST(amstream)
test_ddrawstreamsample_get_media_stream();
test_ddrawstreamsample_update();
+ test_ddrawstreamsample_completion_status();
test_ammediastream_join_am_multi_media_stream();
test_ammediastream_join_filter();
--
2.17.1
2
5
[PATCH 1/4] amstream: Implement IDirectDrawStreamSample::CompletionStatus.
by Anton Baskanov 01 Oct '20
by Anton Baskanov 01 Oct '20
01 Oct '20
Signed-off-by: Anton Baskanov <baskanov(a)gmail.com>
---
dlls/amstream/ddrawstream.c | 31 +++-
dlls/amstream/tests/amstream.c | 280 +++++++++++++++++++++++++++++++++
2 files changed, 308 insertions(+), 3 deletions(-)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c
index 972c2b9f4d0..9020828f578 100644
--- a/dlls/amstream/ddrawstream.c
+++ b/dlls/amstream/ddrawstream.c
@@ -1491,6 +1491,7 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
}
if (!sample->parent->peer || sample->parent->eos)
{
+ sample->update_hr = MS_S_ENDOFSTREAM;
LeaveCriticalSection(&sample->parent->cs);
return MS_S_ENDOFSTREAM;
}
@@ -1517,9 +1518,33 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
static HRESULT WINAPI ddraw_sample_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
{
- FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
+ struct ddraw_sample *sample = impl_from_IDirectDrawStreamSample(iface);
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("sample %p, flags %#x, milliseconds %u.\n", sample, flags, milliseconds);
+
+ EnterCriticalSection(&sample->parent->cs);
+
+ if (sample->update_hr == MS_S_PENDING)
+ {
+ if (flags & (COMPSTAT_NOUPDATEOK | COMPSTAT_ABORT))
+ {
+ sample->update_hr = MS_S_NOUPDATE;
+ remove_queued_update(sample);
+ }
+ else if (flags & COMPSTAT_WAIT)
+ {
+ LeaveCriticalSection(&sample->parent->cs);
+ WaitForSingleObject(sample->update_event, milliseconds);
+ EnterCriticalSection(&sample->parent->cs);
+ }
+ }
+
+ hr = sample->update_hr;
+
+ LeaveCriticalSection(&sample->parent->cs);
+
+ return hr;
}
/*** IDirectDrawStreamSample methods ***/
@@ -1583,7 +1608,7 @@ static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDraw
object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
object->ref = 1;
object->parent = parent;
- object->update_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ object->update_event = CreateEventW(NULL, TRUE, TRUE, NULL);
IAMMediaStream_AddRef(&parent->IAMMediaStream_iface);
++parent->sample_refs;
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index e5d1dd621f3..44debac2333 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -4028,6 +4028,21 @@ static DWORD CALLBACK ammediastream_receive(void *param)
return 0;
}
+static IStreamSample *streamsample_sample;
+static DWORD streamsample_flags;
+static DWORD streamsample_timeout;
+static HRESULT streamsample_expected_hr;
+
+static DWORD CALLBACK streamsample_completion_status(void *param)
+{
+ HRESULT hr;
+
+ hr = IStreamSample_CompletionStatus(streamsample_sample, streamsample_flags, streamsample_timeout);
+ ok(hr == streamsample_expected_hr, "Got hr %#x.\n", hr);
+
+ return 0;
+}
+
static void test_audiostreamsample_update(void)
{
static const BYTE test_data[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
@@ -7221,6 +7236,270 @@ static void test_ddrawstreamsample_update(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_ddrawstreamsample_completion_status(void)
+{
+ static const BYTE test_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+ IAMMultiMediaStream *mmstream = create_ammultimediastream();
+ IDirectDrawStreamSample *stream_sample1;
+ IDirectDrawStreamSample *stream_sample2;
+ IDirectDrawMediaStream *ddraw_stream;
+ IMediaSample *media_sample;
+ IMediaFilter *media_filter;
+ struct testfilter source;
+ VIDEOINFO video_info;
+ IGraphBuilder *graph;
+ IMediaStream *stream;
+ AM_MEDIA_TYPE mt;
+ HANDLE thread;
+ HRESULT hr;
+ ULONG ref;
+ IPin *pin;
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IDirectDrawMediaStream, (void **)&ddraw_stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaStream_QueryInterface(stream, &IID_IPin, (void **)&pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(graph != NULL, "Expected non-NULL graph.\n");
+ hr = IGraphBuilder_QueryInterface(graph, &IID_IMediaFilter, (void **)&media_filter);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ testfilter_init(&source);
+ hr = IGraphBuilder_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaFilter_SetSyncSource(media_filter, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ video_info = rgb32_video_info;
+ video_info.bmiHeader.biWidth = 3;
+ video_info.bmiHeader.biHeight = 1;
+ mt = rgb32_mt;
+ mt.pbFormat = (BYTE *)&video_info;
+ hr = IGraphBuilder_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &mt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &stream_sample1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &stream_sample2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, 100);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_NOUPDATEOK, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample2, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_ABORT, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_NOUPDATE, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample2, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == MS_S_ENDOFSTREAM, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ streamsample_sample = (IStreamSample *)stream_sample1;
+ streamsample_flags = COMPSTAT_WAIT;
+ streamsample_timeout = INFINITE;
+ streamsample_expected_hr = S_OK;
+ thread = CreateThread(NULL, 0, streamsample_completion_status, NULL, 0, NULL);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "CompletionStatus returned prematurely.\n");
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ ok(!WaitForSingleObject(thread, 2000), "Wait timed out.\n");
+ CloseHandle(thread);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ streamsample_sample = (IStreamSample *)stream_sample1;
+ streamsample_flags = COMPSTAT_WAIT;
+ streamsample_timeout = INFINITE;
+ streamsample_expected_hr = MS_S_ENDOFSTREAM;
+ thread = CreateThread(NULL, 0, streamsample_completion_status, NULL, 0, NULL);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "CompletionStatus returned prematurely.\n");
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ ok(!WaitForSingleObject(thread, 2000), "Wait timed out.\n");
+ CloseHandle(thread);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ media_sample = ammediastream_allocate_sample(&source, test_data, 6);
+ hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ref = IMediaSample_Release(media_sample);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_Update(stream_sample1, SSUPDATE_ASYNC, NULL, NULL, 0);
+ ok(hr == MS_E_NOTRUNNING, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IDirectDrawStreamSample_CompletionStatus(stream_sample1, COMPSTAT_WAIT, INFINITE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ IGraphBuilder_Disconnect(graph, pin);
+ IGraphBuilder_Disconnect(graph, &source.source.pin.IPin_iface);
+
+ ref = IDirectDrawStreamSample_Release(stream_sample1);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IDirectDrawStreamSample_Release(stream_sample2);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IMediaFilter_Release(media_filter);
+ ref = IGraphBuilder_Release(graph);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IPin_Release(pin);
+ IDirectDrawMediaStream_Release(ddraw_stream);
+ ref = IMediaStream_Release(stream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(amstream)
{
const WCHAR *test_avi_path;
@@ -7276,6 +7555,7 @@ START_TEST(amstream)
test_ddrawstreamsample_get_media_stream();
test_ddrawstreamsample_update();
+ test_ddrawstreamsample_completion_status();
test_ammediastream_join_am_multi_media_stream();
test_ammediastream_join_filter();
--
2.17.1
2
7
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/mciqtz32/mciqtz.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index ec4a8b531a0..487a0d820cd 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -74,7 +74,6 @@ static WINE_MCIQTZ* MCIQTZ_mciGetOpenDev(UINT wDevID)
static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
{
WINE_MCIQTZ* wma;
- static const WCHAR mciAviWStr[] = {'M','C','I','A','V','I',0};
TRACE("(%s, %p)\n", debugstr_w(str), modp);
@@ -89,7 +88,7 @@ static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
wma->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL);
modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO;
wma->wDevID = modp->wDeviceID;
- modp->wCustomCommandTable = wma->command_table = mciLoadCommandResource(MCIQTZ_hInstance, mciAviWStr, 0);
+ modp->wCustomCommandTable = wma->command_table = mciLoadCommandResource(MCIQTZ_hInstance, L"MCIAVI", 0);
mciSetDriverData(wma->wDevID, (DWORD_PTR)wma);
return modp->wDeviceID;
--
2.26.2
2
1
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/httpapi/httpapi_main.c | 9 +++------
dlls/httpapi/tests/httpapi.c | 31 ++++++++++++-------------------
2 files changed, 15 insertions(+), 25 deletions(-)
diff --git a/dlls/httpapi/httpapi_main.c b/dlls/httpapi/httpapi_main.c
index 6be4d11d35f..52fa6cc1d80 100644
--- a/dlls/httpapi/httpapi_main.c
+++ b/dlls/httpapi/httpapi_main.c
@@ -27,8 +27,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(http);
-static const WCHAR device_nameW[] = {'\\','D','e','v','i','c','e','\\','H','t','t','p','\\','R','e','q','Q','u','e','u','e',0};
-
static WCHAR *heap_strdupW(const WCHAR *str)
{
int len = wcslen(str) + 1;
@@ -53,7 +51,6 @@ static WCHAR *heap_strdupW(const WCHAR *str)
*/
ULONG WINAPI HttpInitialize(HTTPAPI_VERSION version, ULONG flags, void *reserved)
{
- static const WCHAR httpW[] = {'h','t','t','p',0};
SC_HANDLE manager, service;
TRACE("version %u.%u, flags %#x, reserved %p.\n", version.HttpApiMajorVersion,
@@ -68,7 +65,7 @@ ULONG WINAPI HttpInitialize(HTTPAPI_VERSION version, ULONG flags, void *reserved
if (!(manager = OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT)))
return GetLastError();
- if (!(service = OpenServiceW(manager, httpW, SERVICE_START)))
+ if (!(service = OpenServiceW(manager, L"http", SERVICE_START)))
{
ERR("Failed to open HTTP service, error %u.\n", GetLastError());
CloseServiceHandle(manager);
@@ -205,7 +202,7 @@ ULONG WINAPI HttpCreateHttpHandle(HANDLE *handle, ULONG reserved)
if (!handle)
return ERROR_INVALID_PARAMETER;
- RtlInitUnicodeString(&string, device_nameW);
+ RtlInitUnicodeString(&string, L"\\Device\\Http\\ReqQueue");
attr.ObjectName = &string;
return RtlNtStatusToDosError(NtCreateFile(handle, 0, &attr, &iosb, NULL,
FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0));
@@ -752,7 +749,7 @@ ULONG WINAPI HttpCreateRequestQueue(HTTPAPI_VERSION version, const WCHAR *name,
if (flags)
FIXME("Unhandled flags %#x.\n", flags);
- RtlInitUnicodeString(&string, device_nameW);
+ RtlInitUnicodeString(&string, L"\\Device\\Http\\ReqQueue");
attr.ObjectName = &string;
if (sa && sa->bInheritHandle)
attr.Attributes |= OBJ_INHERIT;
diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c
index b6bfbbccf04..c54158d45a2 100644
--- a/dlls/httpapi/tests/httpapi.c
+++ b/dlls/httpapi/tests/httpapi.c
@@ -33,13 +33,6 @@
#include "wine/test.h"
-static const WCHAR invalid_url1[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
-static const WCHAR invalid_url2[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
-static const WCHAR invalid_url3[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/',0};
-static const WCHAR invalid_url4[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t','/',0};
-static const WCHAR invalid_url5[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','/',0};
-static const WCHAR invalid_url6[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','0','/',0};
-
static ULONG (WINAPI *pHttpAddUrlToUrlGroup)(HTTP_URL_GROUP_ID id, const WCHAR *url, HTTP_URL_CONTEXT context, ULONG reserved);
static ULONG (WINAPI *pHttpCreateServerSession)(HTTPAPI_VERSION version, HTTP_SERVER_SESSION_ID *session_id, ULONG reserved);
static ULONG (WINAPI *pHttpCreateRequestQueue)(HTTPAPI_VERSION version, const WCHAR *name, SECURITY_ATTRIBUTES *sa, ULONG flags, HANDLE *handle);
@@ -205,17 +198,17 @@ static void test_v1_server(void)
ret = HttpAddUrl(NULL, L"http://localhost:50000/", NULL);
ok(ret == ERROR_INVALID_HANDLE || ret == ERROR_INVALID_PARAMETER /* < Vista */, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url1, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost:50000", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url2, NULL);
+ ret = HttpAddUrl(queue, L"localhost:50000", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url3, NULL);
+ ret = HttpAddUrl(queue, L"localhost:50000/", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url4, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost/", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url5, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost:/", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, invalid_url6, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost:0/", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
port = add_url_v1(queue);
swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
@@ -1273,17 +1266,17 @@ static void test_v2_server(void)
port = add_url_v2(group);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url1, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"http://localhost:50000", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url2, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"localhost:50000", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url3, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"localhost:50000/", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url4, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"http://localhost/", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url5, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"http://localhost:/", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, invalid_url6, 0xdeadbeef, 0);
+ ret = pHttpAddUrlToUrlGroup(group, L"http://localhost:0/", 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0);
--
2.26.2
3
2
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/http.sys/http.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/dlls/http.sys/http.c b/dlls/http.sys/http.c
index 31c7fc09713..e655edfeea2 100644
--- a/dlls/http.sys/http.c
+++ b/dlls/http.sys/http.c
@@ -977,8 +977,6 @@ static void WINAPI unload(DRIVER_OBJECT *driver)
NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
{
- static const WCHAR device_nameW[] = {'\\','D','e','v','i','c','e','\\','H','t','t','p','\\','R','e','q','Q','u','e','u','e',0};
- static const WCHAR directory_nameW[] = {'\\','D','e','v','i','c','e','\\','H','t','t','p',0};
OBJECT_ATTRIBUTES attr = {sizeof(attr)};
UNICODE_STRING string;
WSADATA wsadata;
@@ -986,12 +984,12 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
TRACE("driver %p, path %s.\n", driver, debugstr_w(path->Buffer));
- RtlInitUnicodeString(&string, directory_nameW);
+ RtlInitUnicodeString(&string, L"\\Device\\Http");
attr.ObjectName = &string;
if ((ret = NtCreateDirectoryObject(&directory_obj, 0, &attr)) && ret != STATUS_OBJECT_NAME_COLLISION)
ERR("Failed to create \\Device\\Http directory, status %#x.\n", ret);
- RtlInitUnicodeString(&string, device_nameW);
+ RtlInitUnicodeString(&string, L"\\Device\\Http\\ReqQueue");
if ((ret = IoCreateDevice(driver, 0, &string, FILE_DEVICE_UNKNOWN, 0, FALSE, &device_obj)))
{
ERR("Failed to create request queue device, status %#x.\n", ret);
--
2.26.2
2
1
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
include/wine/afd.h | 1 +
server/sock.c | 50 ++++++++++++++++++++++++++++------------------
2 files changed, 32 insertions(+), 19 deletions(-)
diff --git a/include/wine/afd.h b/include/wine/afd.h
index 24e6c31f228..9ca03039f81 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -24,6 +24,7 @@
#include <winioctl.h>
#define IOCTL_AFD_CREATE CTL_CODE(FILE_DEVICE_NETWORK, 200, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_AFD_ACCEPT CTL_CODE(FILE_DEVICE_NETWORK, 201, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_AFD_ADDRESS_LIST_CHANGE CTL_CODE(FILE_DEVICE_NETWORK, 323, METHOD_BUFFERED, 0)
diff --git a/server/sock.c b/server/sock.c
index f165e86b129..f66fe091174 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -851,16 +851,11 @@ static int accept_new_fd( struct sock *sock )
}
/* accept a socket (creates a new fd) */
-static struct sock *accept_socket( obj_handle_t handle )
+static struct sock *accept_socket( struct sock *sock )
{
struct sock *acceptsock;
- struct sock *sock;
int acceptfd;
- sock = (struct sock *)get_handle_obj( current->process, handle, FILE_READ_DATA, &sock_ops );
- if (!sock)
- return NULL;
-
if (get_unix_fd( sock->fd ) == -1) return NULL;
if ( sock->deferred )
@@ -870,15 +865,10 @@ static struct sock *accept_socket( obj_handle_t handle )
}
else
{
- if ((acceptfd = accept_new_fd( sock )) == -1)
- {
- release_object( sock );
- return NULL;
- }
+ if ((acceptfd = accept_new_fd( sock )) == -1) return NULL;
if (!(acceptsock = create_socket()))
{
close( acceptfd );
- release_object( sock );
return NULL;
}
@@ -899,7 +889,6 @@ static struct sock *accept_socket( obj_handle_t handle )
get_fd_options( sock->fd ) )))
{
release_object( acceptsock );
- release_object( sock );
return NULL;
}
}
@@ -907,7 +896,6 @@ static struct sock *accept_socket( obj_handle_t handle )
sock->pmask &= ~FD_ACCEPT;
sock->hmask &= ~FD_ACCEPT;
sock_reselect( sock );
- release_object( sock );
return acceptsock;
}
@@ -1100,6 +1088,26 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 0;
}
+ case IOCTL_AFD_ACCEPT:
+ {
+ struct sock *acceptsock;
+ obj_handle_t handle;
+
+ if (get_reply_max_size() != sizeof(handle))
+ {
+ set_error( STATUS_BUFFER_TOO_SMALL );
+ return 0;
+ }
+
+ if (!(acceptsock = accept_socket( sock ))) return 0;
+ handle = alloc_handle( current->process, &acceptsock->obj,
+ GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, OBJ_INHERIT );
+ acceptsock->wparam = handle;
+ release_object( acceptsock );
+ set_reply_data( &handle, sizeof(handle) );
+ return 0;
+ }
+
case IOCTL_AFD_ADDRESS_LIST_CHANGE:
if ((sock->state & FD_WINE_NONBLOCKING) && async_is_blocking( async ))
{
@@ -1420,15 +1428,19 @@ struct object *create_socket_device( struct object *root, const struct unicode_s
/* accept a socket */
DECL_HANDLER(accept_socket)
{
- struct sock *sock;
+ struct sock *sock, *acceptsock;
+
+ if (!(sock = (struct sock *)get_handle_obj( current->process, req->lhandle, FILE_READ_DATA, &sock_ops )))
+ return;
reply->handle = 0;
- if ((sock = accept_socket( req->lhandle )) != NULL)
+ if ((acceptsock = accept_socket( sock )) != NULL)
{
- reply->handle = alloc_handle( current->process, &sock->obj, req->access, req->attributes );
- sock->wparam = reply->handle; /* wparam for message is the socket handle */
- release_object( &sock->obj );
+ reply->handle = alloc_handle( current->process, &acceptsock->obj, req->access, req->attributes );
+ acceptsock->wparam = reply->handle; /* wparam for message is the socket handle */
+ release_object( acceptsock );
}
+ release_object( sock );
}
/* accept a socket into an initialized socket */
--
2.28.0
1
5
[PATCH vkd3d v2 1/5] vkd3d-utils: Introduce D3DCompile() and D3DCompile2().
by Zebediah Figura 01 Oct '20
by Zebediah Figura 01 Oct '20
01 Oct '20
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
Makefile.am | 2 +-
include/vkd3d_d3dcommon.idl | 26 +++++
include/vkd3d_d3dcompiler.h | 46 +++++++++
include/vkd3d_utils.h | 8 ++
include/vkd3d_windows.h | 2 +
libs/vkd3d-utils/vkd3d_utils.map | 2 +
libs/vkd3d-utils/vkd3d_utils_main.c | 125 +++++++++++++++++++++++++
libs/vkd3d-utils/vkd3d_utils_private.h | 1 +
8 files changed, 211 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 6f8af578..22a245e9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -127,7 +127,7 @@ libvkd3d_utils_la_SOURCES = \
libs/vkd3d-utils/vkd3d_utils_main.c \
libs/vkd3d-utils/vkd3d_utils_private.h
libvkd3d_utils_la_LDFLAGS = $(AM_LDFLAGS) -version-info 2:0:1
-libvkd3d_utils_la_LIBADD = libvkd3d-common.la libvkd3d.la @PTHREAD_LIBS@
+libvkd3d_utils_la_LIBADD = libvkd3d-common.la libvkd3d-shader.la libvkd3d.la @PTHREAD_LIBS@
if HAVE_LD_VERSION_SCRIPT
libvkd3d_utils_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libs/vkd3d-utils/vkd3d_utils.map
EXTRA_libvkd3d_utils_la_DEPENDENCIES = $(srcdir)/libs/vkd3d-utils/vkd3d_utils.map
diff --git a/include/vkd3d_d3dcommon.idl b/include/vkd3d_d3dcommon.idl
index 8bfa567c..e43cbe41 100644
--- a/include/vkd3d_d3dcommon.idl
+++ b/include/vkd3d_d3dcommon.idl
@@ -93,3 +93,29 @@ interface ID3D10Blob : IUnknown
typedef ID3D10Blob ID3DBlob;
cpp_quote("#define IID_ID3DBlob IID_ID3D10Blob")
+
+typedef enum _D3D_INCLUDE_TYPE
+{
+ D3D_INCLUDE_LOCAL = 0,
+ D3D_INCLUDE_SYSTEM,
+ D3D10_INCLUDE_LOCAL = D3D_INCLUDE_LOCAL,
+ D3D10_INCLUDE_SYSTEM = D3D_INCLUDE_SYSTEM,
+ D3D_INCLUDE_FORCE_DWORD = 0x7fffffff,
+} D3D_INCLUDE_TYPE;
+
+[
+ object,
+ local,
+]
+interface ID3DInclude
+{
+ HRESULT Open(D3D_INCLUDE_TYPE include_type, const char *filename, const void *parent_data, const void **data,
+ UINT *size);
+ HRESULT Close(const void *data);
+}
+
+typedef struct _D3D_SHADER_MACRO
+{
+ const char *Name;
+ const char *Definition;
+} D3D_SHADER_MACRO;
diff --git a/include/vkd3d_d3dcompiler.h b/include/vkd3d_d3dcompiler.h
index 25f60449..7137294f 100644
--- a/include/vkd3d_d3dcompiler.h
+++ b/include/vkd3d_d3dcompiler.h
@@ -20,6 +20,52 @@
#define __VKD3D_D3DCOMPILER_H
#ifndef __D3DCOMPILER_H__
+#define D3DCOMPILE_DEBUG 0x00000001
+#define D3DCOMPILE_SKIP_VALIDATION 0x00000002
+#define D3DCOMPILE_SKIP_OPTIMIZATION 0x00000004
+#define D3DCOMPILE_PACK_MATRIX_ROW_MAJOR 0x00000008
+#define D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR 0x00000010
+#define D3DCOMPILE_PARTIAL_PRECISION 0x00000020
+#define D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT 0x00000040
+#define D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT 0x00000080
+#define D3DCOMPILE_NO_PRESHADER 0x00000100
+#define D3DCOMPILE_AVOID_FLOW_CONTROL 0x00000200
+#define D3DCOMPILE_PREFER_FLOW_CONTROL 0x00000400
+#define D3DCOMPILE_ENABLE_STRICTNESS 0x00000800
+#define D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY 0x00001000
+#define D3DCOMPILE_IEEE_STRICTNESS 0x00002000
+#define D3DCOMPILE_OPTIMIZATION_LEVEL0 0x00004000
+#define D3DCOMPILE_OPTIMIZATION_LEVEL1 0x00000000
+#define D3DCOMPILE_OPTIMIZATION_LEVEL2 0x0000c000
+#define D3DCOMPILE_OPTIMIZATION_LEVEL3 0x00008000
+#define D3DCOMPILE_RESERVED16 0x00010000
+#define D3DCOMPILE_RESERVED17 0x00020000
+#define D3DCOMPILE_WARNINGS_ARE_ERRORS 0x00040000
+#define D3DCOMPILE_RESOURCES_MAY_ALIAS 0x00080000
+#define D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES 0x00100000
+#define D3DCOMPILE_ALL_RESOURCES_BOUND 0x00200000
+#define D3DCOMPILE_DEBUG_NAME_FOR_SOURCE 0x00400000
+#define D3DCOMPILE_DEBUG_NAME_FOR_BINARY 0x00800000
+
+#define D3DCOMPILE_EFFECT_CHILD_EFFECT 0x00000001
+#define D3DCOMPILE_EFFECT_ALLOW_SLOW_OPS 0x00000002
+
+#define D3DCOMPILE_FLAGS2_FORCE_ROOT_SIGNATURE_LATEST 0x00000000
+#define D3DCOMPILE_FLAGS2_FORCE_ROOT_SIGNATURE_1_0 0x00000010
+#define D3DCOMPILE_FLAGS2_FORCE_ROOT_SIGNATURE_1_1 0x00000020
+
+#define D3DCOMPILE_SECDATA_MERGE_UAV_SLOTS 0x00000001
+#define D3DCOMPILE_SECDATA_PRESERVE_TEMPLATE_SLOTS 0x00000002
+#define D3DCOMPILE_SECDATA_REQUIRE_TEMPLATE_MATCH 0x00000004
+
+HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entrypoint,
+ const char *profile, UINT flags, UINT effect_flags, ID3DBlob **shader, ID3DBlob **error_messages);
+HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entrypoint,
+ const char *profile, UINT flags, UINT effect_flags, UINT secondary_flags,
+ const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader,
+ ID3DBlob **error_messages);
HRESULT WINAPI D3DCreateBlob(SIZE_T size, ID3D10Blob **blob);
#endif /* __D3DCOMPILER_H__ */
diff --git a/include/vkd3d_utils.h b/include/vkd3d_utils.h
index f1fc4dbd..c005d4e9 100644
--- a/include/vkd3d_utils.h
+++ b/include/vkd3d_utils.h
@@ -55,6 +55,14 @@ HRESULT WINAPI D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_S
ID3DBlob **blob, ID3DBlob **error_blob);
/* 1.3 */
+HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
+ const char *target, UINT flags, UINT effect_flags, ID3DBlob **shader, ID3DBlob **error_messages);
+HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
+ const char *target, UINT flags, UINT effect_flags, UINT secondary_flags,
+ const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader,
+ ID3DBlob **error_messages);
HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3D10Blob **blob);
#ifdef __cplusplus
diff --git a/include/vkd3d_windows.h b/include/vkd3d_windows.h
index ad2f08a6..8398d403 100644
--- a/include/vkd3d_windows.h
+++ b/include/vkd3d_windows.h
@@ -65,6 +65,8 @@ typedef int HRESULT;
# define DXGI_ERROR_NOT_FOUND _HRESULT_TYPEDEF_(0x887a0002)
# define DXGI_ERROR_MORE_DATA _HRESULT_TYPEDEF_(0x887a0003)
+# define D3DERR_INVALIDCALL _HRESULT_TYPEDEF_(0x8876086c)
+
/* Basic types */
typedef unsigned char BYTE;
typedef unsigned int DWORD;
diff --git a/libs/vkd3d-utils/vkd3d_utils.map b/libs/vkd3d-utils/vkd3d_utils.map
index 20d182c5..337409ee 100644
--- a/libs/vkd3d-utils/vkd3d_utils.map
+++ b/libs/vkd3d-utils/vkd3d_utils.map
@@ -8,6 +8,8 @@ global:
D3D12GetDebugInterface;
D3D12SerializeRootSignature;
D3D12SerializeVersionedRootSignature;
+ D3DCompile;
+ D3DCompile2;
D3DCreateBlob;
vkd3d_create_event;
vkd3d_destroy_event;
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c
index ffb655f8..8f54ac86 100644
--- a/libs/vkd3d-utils/vkd3d_utils_main.c
+++ b/libs/vkd3d-utils/vkd3d_utils_main.c
@@ -125,6 +125,131 @@ HRESULT WINAPI D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_S
return vkd3d_serialize_versioned_root_signature(desc, blob, error_blob);
}
+static int open_include(const char *filename, bool local, const char *parent_data, void *context,
+ struct vkd3d_shader_code *code)
+{
+ ID3DInclude *iface = context;
+ unsigned int size;
+
+ if (FAILED(ID3DInclude_Open(iface, local ? D3D_INCLUDE_LOCAL : D3D_INCLUDE_SYSTEM,
+ filename, parent_data, &code->code, &size)))
+ return VKD3D_ERROR;
+
+ code->size = size;
+ return VKD3D_OK;
+}
+
+static void close_include(const struct vkd3d_shader_code *code, void *context)
+{
+ ID3DInclude *iface = context;
+
+ ID3DInclude_Close(iface, code->code);
+}
+
+HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entry_point,
+ const char *profile, UINT flags, UINT effect_flags, UINT secondary_flags,
+ const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader_blob,
+ ID3DBlob **messages_blob)
+{
+ struct vkd3d_shader_preprocess_info preprocess_info;
+ struct vkd3d_shader_hlsl_source_info hlsl_info;
+ struct vkd3d_shader_compile_option options[1];
+ struct vkd3d_shader_compile_info compile_info;
+ struct vkd3d_shader_code byte_code;
+ const D3D_SHADER_MACRO *macro;
+ char *messages;
+ HRESULT hr;
+ int ret;
+
+ TRACE("data %p, data_size %lu, filename %s, macros %p, include %p, entry_point %s, "
+ "profile %s, flags %#x, effect_flags %#x, secondary_flags %#x, secondary_data %p, "
+ "secondary_data_size %lu, shader_blob %p, messages_blob %p.\n",
+ data, data_size, debugstr_a(filename), macros, include, debugstr_a(entry_point),
+ debugstr_a(profile), flags, effect_flags, secondary_flags, secondary_data,
+ secondary_data_size, shader_blob, messages_blob);
+
+ if (flags & ~D3DCOMPILE_DEBUG)
+ FIXME("Ignoring flags %#x.\n", flags);
+ if (effect_flags)
+ FIXME("Ignoring effect flags %#x.\n", effect_flags);
+ if (secondary_flags)
+ FIXME("Ignoring secondary flags %#x.\n", secondary_flags);
+
+ compile_info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO;
+ compile_info.next = &preprocess_info;
+ compile_info.source.code = data;
+ compile_info.source.size = data_size;
+ compile_info.source_type = VKD3D_SHADER_SOURCE_HLSL;
+ compile_info.target_type = VKD3D_SHADER_TARGET_DXBC_TPF;
+ compile_info.options = options;
+ compile_info.option_count = 0;
+ compile_info.log_level = VKD3D_SHADER_LOG_INFO;
+ compile_info.source_name = filename;
+
+ preprocess_info.type = VKD3D_SHADER_STRUCTURE_TYPE_PREPROCESS_INFO;
+ preprocess_info.next = &hlsl_info;
+ preprocess_info.macros = (const struct vkd3d_shader_macro *)macros;
+ preprocess_info.macro_count = 0;
+ if (macros)
+ {
+ for (macro = macros; macro->Name; ++macro)
+ ++preprocess_info.macro_count;
+ }
+ preprocess_info.pfn_open_include = open_include;
+ preprocess_info.pfn_close_include = close_include;
+ preprocess_info.include_context = include;
+
+ hlsl_info.type = VKD3D_SHADER_STRUCTURE_TYPE_HLSL_SOURCE_INFO;
+ hlsl_info.next = NULL;
+ hlsl_info.profile = profile;
+ hlsl_info.entry_point = entry_point;
+ hlsl_info.secondary_code.code = secondary_data;
+ hlsl_info.secondary_code.size = secondary_data_size;
+
+ if (!(flags & D3DCOMPILE_DEBUG))
+ options[compile_info.option_count++].name = VKD3D_SHADER_COMPILE_OPTION_STRIP_DEBUG;
+
+ ret = vkd3d_shader_compile(&compile_info, &byte_code, &messages);
+ if (messages)
+ {
+ if (messages_blob)
+ {
+ if (FAILED(hr = vkd3d_blob_create(messages, strlen(messages), messages_blob)))
+ {
+ vkd3d_shader_free_shader_code(&byte_code);
+ return hr;
+ }
+ }
+ else
+ vkd3d_shader_free_messages(messages);
+ }
+
+ if (!ret)
+ {
+ if (FAILED(hr = vkd3d_blob_create((void *)byte_code.code, byte_code.size, shader_blob)))
+ {
+ vkd3d_shader_free_shader_code(&byte_code);
+ return hr;
+ }
+ }
+
+ return hresult_from_vkd3d_result(ret);
+}
+
+HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename,
+ const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entrypoint,
+ const char *profile, UINT flags, UINT effect_flags, ID3DBlob **shader, ID3DBlob **error_messages)
+{
+ TRACE("data %p, data_size %lu, filename %s, macros %p, include %p, entrypoint %s, "
+ "profile %s, flags %#x, effect_flags %#x, shader %p, error_messages %p.\n",
+ data, data_size, debugstr_a(filename), macros, include, debugstr_a(entrypoint),
+ debugstr_a(profile), flags, effect_flags, shader, error_messages);
+
+ return D3DCompile2(data, data_size, filename, macros, include, entrypoint, profile, flags,
+ effect_flags, 0, NULL, 0, shader, error_messages);
+}
+
/* Events */
HANDLE vkd3d_create_event(void)
{
diff --git a/libs/vkd3d-utils/vkd3d_utils_private.h b/libs/vkd3d-utils/vkd3d_utils_private.h
index 3c73f421..06ac7e6b 100644
--- a/libs/vkd3d-utils/vkd3d_utils_private.h
+++ b/libs/vkd3d-utils/vkd3d_utils_private.h
@@ -26,6 +26,7 @@
#include <pthread.h>
#include <vkd3d.h>
#include <vkd3d_shader.h>
+#include <vkd3d_d3dcompiler.h>
#include "vkd3d_blob.h"
#include "vkd3d_memory.h"
--
2.28.0
4
10