setupapi/tests: Add some tests for COM self-registration.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0df9cce29d
commit
e0b5da7b34
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
@ stdcall -private DllRegisterServer()
|
||||
@ stdcall -private DllUnregisterServer()
|
Loading…
Reference in New Issue