combase: Lookup activatable class library in the activation context.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
9d1beee6c7
commit
ea0fa9f1dc
|
@ -37,8 +37,18 @@ static const char *debugstr_hstring(HSTRING hstr)
|
||||||
return wine_dbgstr_wn(str, len);
|
return wine_dbgstr_wn(str, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct activatable_class_data
|
||||||
|
{
|
||||||
|
ULONG size;
|
||||||
|
DWORD unk;
|
||||||
|
DWORD module_len;
|
||||||
|
DWORD module_offset;
|
||||||
|
DWORD threading_model;
|
||||||
|
};
|
||||||
|
|
||||||
static HRESULT get_library_for_classid(const WCHAR *classid, WCHAR **out)
|
static HRESULT get_library_for_classid(const WCHAR *classid, WCHAR **out)
|
||||||
{
|
{
|
||||||
|
ACTCTX_SECTION_KEYED_DATA data;
|
||||||
HKEY hkey_root, hkey_class;
|
HKEY hkey_root, hkey_class;
|
||||||
DWORD type, size;
|
DWORD type, size;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -46,6 +56,17 @@ static HRESULT get_library_for_classid(const WCHAR *classid, WCHAR **out)
|
||||||
|
|
||||||
*out = NULL;
|
*out = NULL;
|
||||||
|
|
||||||
|
/* search activation context first */
|
||||||
|
data.cbSize = sizeof(data);
|
||||||
|
if (FindActCtxSectionStringW(FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
|
||||||
|
ACTIVATION_CONTEXT_SECTION_WINRT_ACTIVATABLE_CLASSES, classid, &data))
|
||||||
|
{
|
||||||
|
struct activatable_class_data *activatable_class = (struct activatable_class_data *)data.lpData;
|
||||||
|
void *ptr = (BYTE *)data.lpSectionBase + activatable_class->module_offset;
|
||||||
|
*out = wcsdup(ptr);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* load class registry key */
|
/* load class registry key */
|
||||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\WindowsRuntime\\ActivatableClassId",
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\WindowsRuntime\\ActivatableClassId",
|
||||||
0, KEY_READ, &hkey_root))
|
0, KEY_READ, &hkey_root))
|
||||||
|
|
|
@ -95,21 +95,19 @@ static void test_ActivationFactories(void)
|
||||||
todo_wine
|
todo_wine
|
||||||
ok(hr == E_NOTIMPL || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
|
ok(hr == E_NOTIMPL || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
|
||||||
"RoGetActivationFactory returned %#lx.\n", hr);
|
"RoGetActivationFactory returned %#lx.\n", hr);
|
||||||
|
todo_wine
|
||||||
ok(factory == NULL, "got factory %p.\n", factory);
|
ok(factory == NULL, "got factory %p.\n", factory);
|
||||||
|
if (factory) IActivationFactory_Release(factory);
|
||||||
WindowsDeleteString(str);
|
WindowsDeleteString(str);
|
||||||
hr = WindowsCreateString(L"Wine.Test.Trusted", ARRAY_SIZE(L"Wine.Test.Trusted") - 1, &str);
|
hr = WindowsCreateString(L"Wine.Test.Trusted", ARRAY_SIZE(L"Wine.Test.Trusted") - 1, &str);
|
||||||
ok(hr == S_OK, "WindowsCreateString returned %#lx.\n", hr);
|
ok(hr == S_OK, "WindowsCreateString returned %#lx.\n", hr);
|
||||||
hr = RoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory);
|
hr = RoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory);
|
||||||
todo_wine
|
|
||||||
ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
|
ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
|
||||||
"RoGetActivationFactory returned %#lx.\n", hr);
|
"RoGetActivationFactory returned %#lx.\n", hr);
|
||||||
if (hr == REGDB_E_CLASSNOTREG)
|
if (hr == REGDB_E_CLASSNOTREG)
|
||||||
ok(!factory, "got factory %p.\n", factory);
|
ok(!factory, "got factory %p.\n", factory);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
todo_wine
|
|
||||||
ok(!!factory, "got factory %p.\n", factory);
|
ok(!!factory, "got factory %p.\n", factory);
|
||||||
}
|
|
||||||
if (!factory) ref = 0;
|
if (!factory) ref = 0;
|
||||||
else ref = IActivationFactory_Release(factory);
|
else ref = IActivationFactory_Release(factory);
|
||||||
ok(ref == 0, "Release returned %lu\n", ref);
|
ok(ref == 0, "Release returned %lu\n", ref);
|
||||||
|
@ -126,6 +124,8 @@ START_TEST(roapi)
|
||||||
|
|
||||||
test_ActivationFactories();
|
test_ActivationFactories();
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
ret = DeleteFileW(L"wine.combase.test.dll");
|
ret = DeleteFileW(L"wine.combase.test.dll");
|
||||||
|
todo_wine_if(!ret && GetLastError() == ERROR_ACCESS_DENIED)
|
||||||
ok(ret, "Failed to delete file, error %lu\n", GetLastError());
|
ok(ret, "Failed to delete file, error %lu\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue