From 46e727ae49efc66088f62753f66fbd52fae49e4c Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 15 May 2019 14:57:04 +0300 Subject: [PATCH] kernelbase: Add QISearch(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/kernelbase/Makefile.in | 1 + dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/main.c | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/dlls/kernelbase/Makefile.in b/dlls/kernelbase/Makefile.in index a7db45e4c1d..88ba774a7c1 100644 --- a/dlls/kernelbase/Makefile.in +++ b/dlls/kernelbase/Makefile.in @@ -1,4 +1,5 @@ MODULE = kernelbase.dll +IMPORTS = uuid C_SRCS = \ main.c \ diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index e586f500a47..7108c40a01f 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1191,7 +1191,7 @@ # @ stub PublishStateChangeNotification @ stdcall PulseEvent(long) kernel32.PulseEvent @ stdcall PurgeComm(long long) kernel32.PurgeComm -@ stdcall QISearch(long long long long) shlwapi.QISearch +@ stdcall QISearch(ptr ptr ptr ptr) @ stdcall QueryActCtxSettingsW(long ptr wstr wstr ptr long ptr) kernel32.QueryActCtxSettingsW @ stdcall QueryActCtxW(long ptr ptr long ptr long ptr) kernel32.QueryActCtxW @ stdcall QueryDepthSList(ptr) kernel32.QueryDepthSList diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c index 5192dfb3f25..3fce23657b9 100644 --- a/dlls/kernelbase/main.c +++ b/dlls/kernelbase/main.c @@ -17,10 +17,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define COBJMACROS + #include "ntstatus.h" #define WIN32_NO_STATUS #include "windows.h" #include "appmodel.h" +#include "shlwapi.h" #include "wine/debug.h" #include "winternl.h" @@ -125,3 +128,40 @@ BOOL WINAPI WaitOnAddress(volatile void *addr, void *cmp, SIZE_T size, DWORD tim return TRUE; } + +HRESULT WINAPI QISearch(void *base, const QITAB *table, REFIID riid, void **obj) +{ + const QITAB *ptr; + IUnknown *unk; + + TRACE("%p, %p, %s, %p\n", base, table, debugstr_guid(riid), obj); + + if (!obj) + return E_POINTER; + + for (ptr = table; ptr->piid; ++ptr) + { + TRACE("trying (offset %d) %s\n", ptr->dwOffset, debugstr_guid(ptr->piid)); + if (IsEqualIID(riid, ptr->piid)) + { + unk = (IUnknown *)((BYTE *)base + ptr->dwOffset); + TRACE("matched, returning (%p)\n", unk); + *obj = unk; + IUnknown_AddRef(unk); + return S_OK; + } + } + + if (IsEqualIID(riid, &IID_IUnknown)) + { + unk = (IUnknown *)((BYTE *)base + table->dwOffset); + TRACE("returning first for IUnknown (%p)\n", unk); + *obj = unk; + IUnknown_AddRef(unk); + return S_OK; + } + + WARN("Not found %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +}