From 27ec0bb430b2264e3305a2201caef9685d442598 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 19 Jul 2015 22:31:17 +0000 Subject: [PATCH] [INSENG] Sync with Wine Staging 1.7.47. CORE-9924 svn path=/trunk/; revision=68444 --- reactos/dll/win32/inseng/CMakeLists.txt | 2 +- reactos/dll/win32/inseng/inseng.rc | 2 +- .../inseng/{inseng.idl => inseng_classes.idl} | 14 +- .../inseng/{inseng.rgs => inseng_classes.rgs} | 0 reactos/dll/win32/inseng/inseng_main.c | 339 +++++++++++++++++- reactos/media/doc/README.WINE | 2 +- 6 files changed, 341 insertions(+), 18 deletions(-) rename reactos/dll/win32/inseng/{inseng.idl => inseng_classes.idl} (74%) rename reactos/dll/win32/inseng/{inseng.rgs => inseng_classes.rgs} (100%) diff --git a/reactos/dll/win32/inseng/CMakeLists.txt b/reactos/dll/win32/inseng/CMakeLists.txt index 780f1e446fa..7f83e8ff878 100644 --- a/reactos/dll/win32/inseng/CMakeLists.txt +++ b/reactos/dll/win32/inseng/CMakeLists.txt @@ -10,6 +10,6 @@ list(APPEND SOURCE add_library(inseng SHARED ${SOURCE} inseng.rc) set_module_type(inseng win32dll) -target_link_libraries(inseng wine) +target_link_libraries(inseng uuid wine) add_importlibs(inseng msvcrt kernel32 ntdll) add_cd_file(TARGET inseng DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/inseng/inseng.rc b/reactos/dll/win32/inseng/inseng.rc index fa51a63e0be..5f219e184b2 100644 --- a/reactos/dll/win32/inseng/inseng.rc +++ b/reactos/dll/win32/inseng/inseng.rc @@ -1 +1 @@ -1 WINE_REGISTRY "inseng.rgs" +1 WINE_REGISTRY "inseng_classes.rgs" diff --git a/reactos/dll/win32/inseng/inseng.idl b/reactos/dll/win32/inseng/inseng_classes.idl similarity index 74% rename from reactos/dll/win32/inseng/inseng.idl rename to reactos/dll/win32/inseng/inseng_classes.idl index ba7a0f91819..edb7c4d5f2e 100644 --- a/reactos/dll/win32/inseng/inseng.idl +++ b/reactos/dll/win32/inseng/inseng_classes.idl @@ -20,16 +20,4 @@ #pragma makedep register -[ - helpstring("Microsoft Active Setup Engine"), - threading(apartment), - uuid(6e449686-c509-11cf-aafa-00aa00b6015c) -] -coclass ActiveSetupEng { } - -[ - helpstring("Download Site Manager"), - threading(apartment), - uuid(bfc880f1-7484-11d0-8309-00aa00b6015c) -] -coclass DLManager { } +#include "inseng.idl" diff --git a/reactos/dll/win32/inseng/inseng.rgs b/reactos/dll/win32/inseng/inseng_classes.rgs similarity index 100% rename from reactos/dll/win32/inseng/inseng.rgs rename to reactos/dll/win32/inseng/inseng_classes.rgs diff --git a/reactos/dll/win32/inseng/inseng_main.c b/reactos/dll/win32/inseng/inseng_main.c index 7635a071612..34615249448 100644 --- a/reactos/dll/win32/inseng/inseng_main.c +++ b/reactos/dll/win32/inseng/inseng_main.c @@ -33,14 +33,345 @@ //#include "winuser.h" #include #include -//#include "initguid.h" +#include +#include #include WINE_DEFAULT_DEBUG_CHANNEL(inseng); +static inline void *heap_alloc(size_t len) +{ + return HeapAlloc(GetProcessHeap(), 0, len); +} + +static inline BOOL heap_free(void *mem) +{ + return HeapFree(GetProcessHeap(), 0, mem); +} + static HINSTANCE instance; +struct InstallEngine { + IInstallEngine2 IInstallEngine2_iface; + LONG ref; +}; + +static inline InstallEngine *impl_from_IInstallEngine2(IInstallEngine2 *iface) +{ + return CONTAINING_RECORD(iface, InstallEngine, IInstallEngine2_iface); +} + +static HRESULT WINAPI InstallEngine_QueryInterface(IInstallEngine2 *iface, REFIID riid, void **ppv) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->IInstallEngine2_iface; + }else if(IsEqualGUID(&IID_IInstallEngine, riid)) { + TRACE("(%p)->(IID_IInstallEngine %p)\n", This, ppv); + *ppv = &This->IInstallEngine2_iface; + }else if(IsEqualGUID(&IID_IInstallEngine2, riid)) { + TRACE("(%p)->(IID_IInstallEngine2 %p)\n", This, ppv); + *ppv = &This->IInstallEngine2_iface; + }else { + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI InstallEngine_AddRef(IInstallEngine2 *iface) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI InstallEngine_Release(IInstallEngine2 *iface) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + heap_free(This); + + return ref; +} + +static HRESULT WINAPI InstallEngine_GetEngineStatus(IInstallEngine2 *iface, DWORD *status) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%p)\n", This, status); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetCifFile(IInstallEngine2 *iface, const char *cab_name, const char *cif_name) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %s)\n", This, debugstr_a(cab_name), debugstr_a(cif_name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_DownloadComponents(IInstallEngine2 *iface, DWORD flags) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%x)\n", This, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_InstallComponents(IInstallEngine2 *iface, DWORD flags) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%x)\n", This, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_EnumInstallIDs(IInstallEngine2 *iface, UINT index, char **id) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%d %p)\n", This, index, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_EnumDownloadIDs(IInstallEngine2 *iface, UINT index, char **id) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%d %p)\n", This, index, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_IsComponentInstalled(IInstallEngine2 *iface, const char *id, DWORD *status) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_a(id), status); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_RegisterInstallEngineCallback(IInstallEngine2 *iface, IInstallEngineCallback *callback) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%p)\n", This, callback); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_UnregisterInstallEngineCallback(IInstallEngine2 *iface) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetAction(IInstallEngine2 *iface, const char *id, DWORD action, DWORD priority) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %d %d)\n", This, debugstr_a(id), action, priority); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_GetSizes(IInstallEngine2 *iface, const char *id, COMPONENT_SIZES *sizes) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_a(id), sizes); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_LaunchExtraCommand(IInstallEngine2 *iface, const char *inf_name, const char *section) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %s)\n", This, debugstr_a(inf_name), debugstr_a(section)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_GetDisplayName(IInstallEngine2 *iface, const char *id, const char *name) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s %s)\n", This, debugstr_a(id), debugstr_a(name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetBaseUrl(IInstallEngine2 *iface, const char *base_name) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s)\n", This, debugstr_a(base_name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetDownloadDir(IInstallEngine2 *iface, const char *download_dir) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s)\n", This, debugstr_a(download_dir)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetInstallDrive(IInstallEngine2 *iface, char drive) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%c)\n", This, drive); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetInstallOptions(IInstallEngine2 *iface, DWORD flags) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%x)\n", This, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetHWND(IInstallEngine2 *iface, HWND hwnd) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%p)\n", This, hwnd); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_SetIStream(IInstallEngine2 *iface, IStream *stream) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%p)\n", This, stream); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_Abort(IInstallEngine2 *iface, DWORD flags) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%x)\n", This, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_Suspend(IInstallEngine2 *iface) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine_Resume(IInstallEngine2 *iface) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine2_SetLocalCif(IInstallEngine2 *iface, const char *cif) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%s)\n", This, debugstr_a(cif)); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallEngine2_GetICifFile(IInstallEngine2 *iface, ICifFile **cif_file) +{ + InstallEngine *This = impl_from_IInstallEngine2(iface); + FIXME("(%p)->(%p)\n", This, cif_file); + return E_NOTIMPL; +} + +static const IInstallEngine2Vtbl InstallEngine2Vtbl = { + InstallEngine_QueryInterface, + InstallEngine_AddRef, + InstallEngine_Release, + InstallEngine_GetEngineStatus, + InstallEngine_SetCifFile, + InstallEngine_DownloadComponents, + InstallEngine_InstallComponents, + InstallEngine_EnumInstallIDs, + InstallEngine_EnumDownloadIDs, + InstallEngine_IsComponentInstalled, + InstallEngine_RegisterInstallEngineCallback, + InstallEngine_UnregisterInstallEngineCallback, + InstallEngine_SetAction, + InstallEngine_GetSizes, + InstallEngine_LaunchExtraCommand, + InstallEngine_GetDisplayName, + InstallEngine_SetBaseUrl, + InstallEngine_SetDownloadDir, + InstallEngine_SetInstallDrive, + InstallEngine_SetInstallOptions, + InstallEngine_SetHWND, + InstallEngine_SetIStream, + InstallEngine_Abort, + InstallEngine_Suspend, + InstallEngine_Resume, + InstallEngine2_SetLocalCif, + InstallEngine2_GetICifFile +}; + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); + *ppv = iface; + }else if(IsEqualGUID(&IID_IClassFactory, riid)) { + TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); + *ppv = iface; + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + return S_OK; +} + +static HRESULT WINAPI InstallEngineCF_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **ppv) +{ + InstallEngine *engine; + HRESULT hres; + + TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); + + engine = heap_alloc(sizeof(*engine)); + if(!engine) + return E_OUTOFMEMORY; + + engine->IInstallEngine2_iface.lpVtbl = &InstallEngine2Vtbl; + engine->ref = 1; + + hres = IInstallEngine2_QueryInterface(&engine->IInstallEngine2_iface, riid, ppv); + IInstallEngine2_Release(&engine->IInstallEngine2_iface); + return hres; +} + +static const IClassFactoryVtbl InstallEngineCFVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + InstallEngineCF_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory InstallEngineCF = { &InstallEngineCFVtbl }; + BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) @@ -60,8 +391,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) { - FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); + if(IsEqualGUID(rclsid, &CLSID_InstallEngine)) { + TRACE("(CLSID_InstallEngine %s %p)\n", debugstr_guid(iid), ppv); + return IClassFactory_QueryInterface(&InstallEngineCF, iid, ppv); + } + FIXME("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 2908f3b57ee..17eb37caba7 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -84,7 +84,7 @@ reactos/dll/win32/imm32 # Synced to Wine-1.7.27 reactos/dll/win32/inetcomm # Synced to WineStaging-1.7.47 reactos/dll/win32/inetmib1 # Synced to WineStaging-1.7.37 reactos/dll/win32/initpki # Synced to WineStaging-1.7.37 -reactos/dll/win32/inseng # Synced to WineStaging-1.7.37 +reactos/dll/win32/inseng # Synced to WineStaging-1.7.47 reactos/dll/win32/iphlpapi # Out of sync reactos/dll/win32/itircl # Synced to WineStaging-1.7.37 reactos/dll/win32/itss # Synced to WineStaging-1.7.37 -- 2.17.1