Zebediah Figura : setupapi/tests: Add some tests for COM self-registration.

Alexandre Julliard julliard at winehq.org
Tue Feb 11 15:44:53 CST 2020


Module: wine
Branch: master
Commit: e0b5da7b34e9f38990939bd20cf4b2fa749c3f6e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e0b5da7b34e9f38990939bd20cf4b2fa749c3f6e

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Feb 10 14:41:30 2020 -0600

setupapi/tests: Add some tests for COM self-registration.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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(-)

diff --git a/dlls/setupapi/tests/Makefile.in b/dlls/setupapi/tests/Makefile.in
index 83f751c7db..df7c668787 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 fd10fd9133..b918bb21f6 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 0000000000..f687990f3b
--- /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 0000000000..0f9b07355f
--- /dev/null
+++ b/dlls/setupapi/tests/selfreg.spec
@@ -0,0 +1,2 @@
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()




More information about the wine-cvs mailing list