From: Zebediah Figura <zfigura(a)codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/setupapi/tests/Makefile.in | 6 ++-
dlls/setupapi/tests/install.c | 90 ++++++++++++++++++++++++++++++++
dlls/setupapi/tests/selfreg.c | 50 ++++++++++++++++++
dlls/setupapi/tests/selfreg.spec | 2 +
4 files changed, 147 insertions(+), 1 deletion(-)
create mode 100644 dlls/setupapi/tests/selfreg.c
create mode 100644 dlls/setupapi/tests/selfreg.spec
diff --git a/dlls/setupapi/tests/Makefile.in b/dlls/setupapi/tests/Makefile.in
index 83f751c7dbd..df7c6687875 100644
--- a/dlls/setupapi/tests/Makefile.in
+++ b/dlls/setupapi/tests/Makefile.in
@@ -1,5 +1,7 @@
TESTDLL = setupapi.dll
-IMPORTS = advapi32 cabinet setupapi shell32 uuid user32
+IMPORTS = advapi32 cabinet ole32 setupapi shell32 uuid user32
+
+selfreg_IMPORTS = uuid advapi32 ole32
SOURCES = \
coinst.c \
@@ -11,6 +13,8 @@ SOURCES = \
misc.c \
parser.c \
query.c \
+ selfreg.c \
+ selfreg.spec \
setupapi.rc \
setupcab.c \
stringtable.c
diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c
index fd10fd91332..b918bb21f60 100644
--- a/dlls/setupapi/tests/install.c
+++ b/dlls/setupapi/tests/install.c
@@ -54,6 +54,24 @@ static char CURR_DIR[MAX_PATH];
* Helpers
*/
+static void load_resource(const char *name, const char *filename)
+{
+ DWORD written;
+ HANDLE file;
+ HRSRC res;
+ void *ptr;
+
+ file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
+ ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", filename, GetLastError());
+
+ res = FindResourceA(NULL, name, "TESTDLL");
+ ok( res != 0, "couldn't find resource\n" );
+ ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res ));
+ WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL );
+ ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
+ CloseHandle( file );
+}
+
static void create_inf_file(LPCSTR filename, const char *data)
{
DWORD res;
@@ -2040,6 +2058,77 @@ static void test_start_copy(void)
delete_file("dst/");
}
+static void test_register_dlls(void)
+{
+ static const char inf_data[] = "[Version]\n"
+ "Signature=\"$Chicago$\"\n"
+ "[DefaultInstall]\n"
+ "RegisterDlls=register_section\n"
+ "UnregisterDlls=register_section\n"
+ "[register_section]\n"
+ "40000,,winetest_selfreg.dll,1\n";
+
+ void *context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, 0);
+ char path[MAX_PATH];
+ HRESULT hr;
+ HINF hinf;
+ BOOL ret;
+ HKEY key;
+ LONG l;
+
+ create_inf_file("test.inf", inf_data);
+ sprintf(path, "%s\\test.inf", CURR_DIR);
+ hinf = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL);
+ ok(hinf != INVALID_HANDLE_VALUE, "Failed to open INF file, error %#x.\n", GetLastError());
+
+ load_resource("selfreg.dll", "winetest_selfreg.dll");
+ ret = SetupSetDirectoryIdA(hinf, 40000, CURR_DIR);
+ ok(ret, "Failed to set directory ID, error %u.\n", GetLastError());
+
+ RegDeleteKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg");
+
+ ret = SetupInstallFromInfSectionA(NULL, hinf, "DefaultInstall", SPINST_REGSVR,
+ NULL, "C:\\", 0, SetupDefaultQueueCallbackA, context, NULL, NULL);
+ ok(ret, "Failed to install, error %#x.\n", GetLastError());
+
+ l = RegOpenKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg", &key);
+ todo_wine ok(!l, "Got error %u.\n", l);
+ RegCloseKey(key);
+
+ ret = SetupInstallFromInfSectionA(NULL, hinf, "DefaultInstall", SPINST_UNREGSVR,
+ NULL, "C:\\", 0, SetupDefaultQueueCallbackA, context, NULL, NULL);
+ ok(ret, "Failed to install, error %#x.\n", GetLastError());
+
+ l = RegOpenKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg", &key);
+ ok(l == ERROR_FILE_NOT_FOUND, "Got error %u.\n", l);
+
+ hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ ret = SetupInstallFromInfSectionA(NULL, hinf, "DefaultInstall", SPINST_REGSVR,
+ NULL, "C:\\", 0, SetupDefaultQueueCallbackA, context, NULL, NULL);
+ ok(ret, "Failed to install, error %#x.\n", GetLastError());
+
+ l = RegOpenKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg", &key);
+ ok(!l, "Got error %u.\n", l);
+ RegCloseKey(key);
+
+ ret = SetupInstallFromInfSectionA(NULL, hinf, "DefaultInstall", SPINST_UNREGSVR,
+ NULL, "C:\\", 0, SetupDefaultQueueCallbackA, context, NULL, NULL);
+ ok(ret, "Failed to install, error %#x.\n", GetLastError());
+
+ l = RegOpenKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg", &key);
+ ok(l == ERROR_FILE_NOT_FOUND, "Got error %u.\n", l);
+
+ CoUninitialize();
+
+ SetupCloseInfFile(hinf);
+ ret = DeleteFileA("test.inf");
+ ok(ret, "Failed to delete INF file, error %u.\n", GetLastError());
+ ret = DeleteFileA("winetest_selfreg.dll");
+ ok(ret, "Failed to delete test DLL, error %u.\n", GetLastError());
+}
+
START_TEST(install)
{
char temp_path[MAX_PATH], prev_path[MAX_PATH];
@@ -2069,6 +2158,7 @@ START_TEST(install)
test_close_queue();
test_install_file();
test_start_copy();
+ test_register_dlls();
UnhookWindowsHookEx(hhook);
diff --git a/dlls/setupapi/tests/selfreg.c b/dlls/setupapi/tests/selfreg.c
new file mode 100644
index 00000000000..f687990f3bc
--- /dev/null
+++ b/dlls/setupapi/tests/selfreg.c
@@ -0,0 +1,50 @@
+/*
+ * DLL for testing COM self-registration
+ *
+ * Copyright 2020 Zebediah Figura for CodeWeavers
+ *
+ * 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
+ */
+
+#define COBJMACROS
+#include "msxml.h"
+
+HRESULT WINAPI DllRegisterServer(void)
+{
+ IUnknown *unk;
+ HKEY key;
+
+ if (CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void **)&unk) == S_OK)
+ {
+ RegCreateKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg", &key);
+ RegCloseKey(key);
+ IUnknown_Release(unk);
+ }
+ return S_OK;
+}
+
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ IUnknown *unk;
+
+ if (CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void **)&unk) == S_OK)
+ {
+ RegDeleteKeyA(HKEY_CURRENT_USER, "winetest_setupapi_selfreg");
+ IUnknown_Release(unk);
+ }
+ return S_OK;
+}
diff --git a/dlls/setupapi/tests/selfreg.spec b/dlls/setupapi/tests/selfreg.spec
new file mode 100644
index 00000000000..0f9b07355f7
--- /dev/null
+++ b/dlls/setupapi/tests/selfreg.spec
@@ -0,0 +1,2 @@
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
--
2.25.0