Signed-off-by: Nikolay Sivov nsivov@codeweavers.com ---
Global options supposedly control exception handling configuration of a COM core, which is now in combase.
dlls/combase/combase.c | 162 +++++++++++++++++++++++++++++++++++++- dlls/combase/combase.spec | 2 +- dlls/ole32/compobj.c | 96 ---------------------- dlls/ole32/oleproxy.c | 13 --- 4 files changed, 162 insertions(+), 111 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c index 09d455317d1..cda0d52f579 100644 --- a/dlls/combase/combase.c +++ b/dlls/combase/combase.c @@ -429,6 +429,150 @@ static void com_cleanup_tlsdata(void) NtCurrentTeb()->ReservedForOle = NULL; }
+struct global_options +{ + IGlobalOptions IGlobalOptions_iface; + LONG refcount; +}; + +static inline struct global_options *impl_from_IGlobalOptions(IGlobalOptions *iface) +{ + return CONTAINING_RECORD(iface, struct global_options, IGlobalOptions_iface); +} + +static HRESULT WINAPI global_options_QueryInterface(IGlobalOptions *iface, REFIID riid, void **ppv) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), ppv); + + if (IsEqualGUID(&IID_IGlobalOptions, riid) || IsEqualGUID(&IID_IUnknown, riid)) + { + *ppv = iface; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*ppv); + return S_OK; +} + +static ULONG WINAPI global_options_AddRef(IGlobalOptions *iface) +{ + struct global_options *options = impl_from_IGlobalOptions(iface); + LONG refcount = InterlockedIncrement(&options->refcount); + + TRACE("%p, refcount %d.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI global_options_Release(IGlobalOptions *iface) +{ + struct global_options *options = impl_from_IGlobalOptions(iface); + LONG refcount = InterlockedDecrement(&options->refcount); + + TRACE("%p, refcount %d.\n", iface, refcount); + + if (!refcount) + heap_free(options); + + return refcount; +} + +static HRESULT WINAPI global_options_Set(IGlobalOptions *iface, GLOBALOPT_PROPERTIES property, ULONG_PTR value) +{ + FIXME("%p, %u, %lx.\n", iface, property, value); + + return S_OK; +} + +static HRESULT WINAPI global_options_Query(IGlobalOptions *iface, GLOBALOPT_PROPERTIES property, ULONG_PTR *value) +{ + FIXME("%p, %u, %p.\n", iface, property, value); + + return E_NOTIMPL; +} + +static const IGlobalOptionsVtbl global_options_vtbl = +{ + global_options_QueryInterface, + global_options_AddRef, + global_options_Release, + global_options_Set, + global_options_Query +}; + +static HRESULT WINAPI class_factory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), ppv); + + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) + { + *ppv = iface; + return S_OK; + } + + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI class_factory_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI class_factory_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI class_factory_LockServer(IClassFactory *iface, BOOL fLock) +{ + TRACE("%d\n", fLock); + + return S_OK; +} + +static HRESULT WINAPI global_options_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) +{ + struct global_options *object; + HRESULT hr; + + TRACE("%p, %s, %p.\n", outer, debugstr_guid(riid), ppv); + + if (outer) + return E_INVALIDARG; + + if (!(object = heap_alloc(sizeof(*object)))) + return E_OUTOFMEMORY; + object->IGlobalOptions_iface.lpVtbl = &global_options_vtbl; + object->refcount = 1; + + hr = IGlobalOptions_QueryInterface(&object->IGlobalOptions_iface, riid, ppv); + IGlobalOptions_Release(&object->IGlobalOptions_iface); + return hr; +} + +static const IClassFactoryVtbl global_options_factory_vtbl = +{ + class_factory_QueryInterface, + class_factory_AddRef, + class_factory_Release, + global_options_CreateInstance, + class_factory_LockServer +}; + +static IClassFactory global_options_factory = { &global_options_factory_vtbl }; + +static HRESULT get_builtin_class_factory(REFCLSID rclsid, REFIID riid, void **obj) +{ + if (IsEqualCLSID(rclsid, &CLSID_GlobalOptions)) + return IClassFactory_QueryInterface(&global_options_factory, riid, obj); + return E_UNEXPECTED; +} + /*********************************************************************** * FreePropVariantArray (combase.@) */ @@ -1569,7 +1713,11 @@ static HRESULT com_get_class_object(REFCLSID rclsid, DWORD clscontext, IsEqualCLSID(rclsid, &CLSID_StdGlobalInterfaceTable)) { apartment_release(apt); - return Ole32DllGetClassObject(rclsid, riid, obj); + + if (IsEqualCLSID(rclsid, &CLSID_GlobalOptions)) + return get_builtin_class_factory(rclsid, riid, obj); + else + return Ole32DllGetClassObject(rclsid, riid, obj); } }
@@ -3226,3 +3374,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved)
return TRUE; } + +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj) +{ + TRACE("%s, %s, %p.\n", debugstr_guid(rclsid), debugstr_guid(riid), obj); + + *obj = NULL; + + if (IsEqualCLSID(rclsid, &CLSID_GlobalOptions)) + return IClassFactory_QueryInterface(&global_options_factory, riid, obj); + + return CLASS_E_CLASSNOTAVAILABLE; +} diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index 6e74cca1f24..0437714edcc 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -178,7 +178,7 @@ @ stub DcomChannelSetHResult @ stdcall DllDebugObjectRPCHook(long ptr) @ stdcall DllGetActivationFactory(ptr ptr) -@ stdcall -private DllGetClassObject(ptr ptr ptr) ole32.DllGetClassObject +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stub EnableHookObject @ stdcall FreePropVariantArray(long ptr) @ stub FreePropVariantArrayWorker diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 51db61414dc..c40d8d03b2d 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -924,102 +924,6 @@ HRESULT Handler_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return CLASS_E_CLASSNOTAVAILABLE; }
-typedef struct { - IGlobalOptions IGlobalOptions_iface; - LONG ref; -} GlobalOptions; - -static inline GlobalOptions *impl_from_IGlobalOptions(IGlobalOptions *iface) -{ - return CONTAINING_RECORD(iface, GlobalOptions, IGlobalOptions_iface); -} - -static HRESULT WINAPI GlobalOptions_QueryInterface(IGlobalOptions *iface, REFIID riid, void **ppv) -{ - GlobalOptions *This = impl_from_IGlobalOptions(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - - if (IsEqualGUID(&IID_IGlobalOptions, riid) || IsEqualGUID(&IID_IUnknown, riid)) - { - *ppv = iface; - } - else - { - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI GlobalOptions_AddRef(IGlobalOptions *iface) -{ - GlobalOptions *This = impl_from_IGlobalOptions(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; -} - -static ULONG WINAPI GlobalOptions_Release(IGlobalOptions *iface) -{ - GlobalOptions *This = impl_from_IGlobalOptions(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if (!ref) - heap_free(This); - - return ref; -} - -static HRESULT WINAPI GlobalOptions_Set(IGlobalOptions *iface, GLOBALOPT_PROPERTIES property, ULONG_PTR value) -{ - GlobalOptions *This = impl_from_IGlobalOptions(iface); - FIXME("(%p)->(%u %lx)\n", This, property, value); - return S_OK; -} - -static HRESULT WINAPI GlobalOptions_Query(IGlobalOptions *iface, GLOBALOPT_PROPERTIES property, ULONG_PTR *value) -{ - GlobalOptions *This = impl_from_IGlobalOptions(iface); - FIXME("(%p)->(%u %p)\n", This, property, value); - return E_NOTIMPL; -} - -static const IGlobalOptionsVtbl GlobalOptionsVtbl = { - GlobalOptions_QueryInterface, - GlobalOptions_AddRef, - GlobalOptions_Release, - GlobalOptions_Set, - GlobalOptions_Query -}; - -HRESULT WINAPI GlobalOptions_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) -{ - GlobalOptions *global_options; - HRESULT hres; - - TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); - - if (outer) - return E_INVALIDARG; - - global_options = heap_alloc(sizeof(*global_options)); - if (!global_options) - return E_OUTOFMEMORY; - global_options->IGlobalOptions_iface.lpVtbl = &GlobalOptionsVtbl; - global_options->ref = 1; - - hres = IGlobalOptions_QueryInterface(&global_options->IGlobalOptions_iface, riid, ppv); - IGlobalOptions_Release(&global_options->IGlobalOptions_iface); - return hres; -} - /*********************************************************************** * DllMain (OLE32.@) */ diff --git a/dlls/ole32/oleproxy.c b/dlls/ole32/oleproxy.c index 0429e0f5495..e40e2b073e5 100644 --- a/dlls/ole32/oleproxy.c +++ b/dlls/ole32/oleproxy.c @@ -148,17 +148,6 @@ static const IClassFactoryVtbl ComCatCFVtbl =
static IClassFactory ComCatCF = { &ComCatCFVtbl };
-static const IClassFactoryVtbl GlobalOptionsCFVtbl = -{ - ClassFactory_QueryInterface, - ClassFactory_AddRef, - ClassFactory_Release, - GlobalOptions_CreateInstance, - ClassFactory_LockServer -}; - -IClassFactory GlobalOptionsCF = { &GlobalOptionsCFVtbl }; - static const IClassFactoryVtbl GlobalInterfaceTableCFVtbl = { ClassFactory_QueryInterface, @@ -230,8 +219,6 @@ HRESULT WINAPI Ole32DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj) return IClassFactory_QueryInterface(&GlobalInterfaceTableCF, riid, obj); else if (IsEqualCLSID(rclsid, &CLSID_ManualResetEvent)) return IClassFactory_QueryInterface(&ManualResetEventCF, riid, obj); - else if (IsEqualCLSID(rclsid, &CLSID_GlobalOptions)) - return IClassFactory_QueryInterface(&GlobalOptionsCF, riid, obj); else if (IsEqualCLSID(rclsid, &CLSID_InProcFreeMarshaler)) return FTMarshalCF_Create(riid, obj); else