2007-06-29 23:12:41 +02:00
|
|
|
/*
|
|
|
|
* Tests for MSI Source functions
|
|
|
|
*
|
|
|
|
* Copyright (C) 2006 James Hawkins
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
2007-07-13 05:06:11 +02:00
|
|
|
#define _WIN32_MSI 300
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
#include <msiquery.h>
|
|
|
|
#include <msidefs.h>
|
|
|
|
#include <msi.h>
|
|
|
|
#include <sddl.h>
|
|
|
|
|
|
|
|
#include "wine/test.h"
|
|
|
|
|
2007-08-10 15:04:57 +02:00
|
|
|
static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
|
|
|
|
static UINT (WINAPI *pMsiSourceListGetInfoA)
|
|
|
|
(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
|
2007-11-05 10:16:13 +01:00
|
|
|
static UINT (WINAPI *pMsiSourceListAddSourceExA)
|
|
|
|
(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, DWORD);
|
2007-08-10 15:04:57 +02:00
|
|
|
|
|
|
|
static void init_functionpointers(void)
|
|
|
|
{
|
|
|
|
HMODULE hmsi = GetModuleHandleA("msi.dll");
|
|
|
|
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
|
|
|
|
|
2008-01-24 11:56:21 +01:00
|
|
|
#define GET_PROC(dll, func) \
|
|
|
|
p ## func = (void *)GetProcAddress(dll, #func); \
|
|
|
|
if(!p ## func) \
|
|
|
|
trace("GetProcAddress(%s) failed\n", #func);
|
|
|
|
|
|
|
|
GET_PROC(hmsi, MsiSourceListAddSourceExA)
|
|
|
|
GET_PROC(hmsi, MsiSourceListGetInfoA)
|
|
|
|
|
|
|
|
GET_PROC(hadvapi32, ConvertSidToStringSidA)
|
|
|
|
|
|
|
|
#undef GET_PROC
|
2007-08-10 15:04:57 +02:00
|
|
|
}
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
/* copied from dlls/msi/registry.c */
|
|
|
|
static BOOL squash_guid(LPCWSTR in, LPWSTR out)
|
|
|
|
{
|
|
|
|
DWORD i,n=1;
|
|
|
|
GUID guid;
|
|
|
|
|
|
|
|
if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
for(i=0; i<8; i++)
|
|
|
|
out[7-i] = in[n++];
|
|
|
|
n++;
|
|
|
|
for(i=0; i<4; i++)
|
|
|
|
out[11-i] = in[n++];
|
|
|
|
n++;
|
|
|
|
for(i=0; i<4; i++)
|
|
|
|
out[15-i] = in[n++];
|
|
|
|
n++;
|
|
|
|
for(i=0; i<2; i++)
|
|
|
|
{
|
|
|
|
out[17+i*2] = in[n++];
|
|
|
|
out[16+i*2] = in[n++];
|
|
|
|
}
|
|
|
|
n++;
|
|
|
|
for( ; i<8; i++)
|
|
|
|
{
|
|
|
|
out[17+i*2] = in[n++];
|
|
|
|
out[16+i*2] = in[n++];
|
|
|
|
}
|
|
|
|
out[32]=0;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void create_test_guid(LPSTR prodcode, LPSTR squashed)
|
|
|
|
{
|
|
|
|
WCHAR guidW[MAX_PATH];
|
|
|
|
WCHAR squashedW[MAX_PATH];
|
|
|
|
GUID guid;
|
|
|
|
HRESULT hr;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
hr = CoCreateGuid(&guid);
|
|
|
|
ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
|
|
|
|
|
|
|
|
size = StringFromGUID2(&guid, (LPOLESTR)guidW, MAX_PATH);
|
|
|
|
ok(size == 39, "Expected 39, got %d\n", hr);
|
|
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL);
|
|
|
|
squash_guid(guidW, squashedW);
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void get_user_sid(LPSTR *usersid)
|
|
|
|
{
|
|
|
|
HANDLE token;
|
|
|
|
BYTE buf[1024];
|
|
|
|
DWORD size;
|
|
|
|
PTOKEN_USER user;
|
|
|
|
|
|
|
|
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
|
|
|
|
size = sizeof(buf);
|
|
|
|
GetTokenInformation(token, TokenUser, (void *)buf, size, &size);
|
|
|
|
user = (PTOKEN_USER)buf;
|
2007-08-10 15:04:57 +02:00
|
|
|
pConvertSidToStringSidA(user->User.Sid, usersid);
|
2007-06-29 23:12:41 +02:00
|
|
|
}
|
|
|
|
|
2008-02-19 07:58:10 +01:00
|
|
|
static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line)
|
|
|
|
{
|
|
|
|
char val[MAX_PATH];
|
|
|
|
DWORD size, type;
|
|
|
|
LONG res;
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
val[0] = '\0';
|
|
|
|
res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
|
|
|
|
|
|
|
|
if (res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ))
|
|
|
|
{
|
|
|
|
ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!expected)
|
|
|
|
ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bcase)
|
|
|
|
ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val);
|
|
|
|
else
|
|
|
|
ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CHECK_REG_STR(prodkey, name, expected) \
|
|
|
|
check_reg_str(prodkey, name, expected, TRUE, __LINE__);
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
static void test_MsiSourceListGetInfo(void)
|
|
|
|
{
|
|
|
|
CHAR prodcode[MAX_PATH];
|
|
|
|
CHAR prod_squashed[MAX_PATH];
|
|
|
|
CHAR keypath[MAX_PATH*2];
|
|
|
|
CHAR value[MAX_PATH];
|
|
|
|
LPSTR usersid;
|
|
|
|
LPCSTR data;
|
|
|
|
LONG res;
|
|
|
|
UINT r;
|
|
|
|
HKEY userkey, hkey;
|
|
|
|
DWORD size;
|
|
|
|
|
2008-01-24 11:56:21 +01:00
|
|
|
if (!pMsiSourceListGetInfoA)
|
|
|
|
{
|
|
|
|
skip("Skipping MsiSourceListGetInfoA tests\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
create_test_guid(prodcode, prod_squashed);
|
|
|
|
get_user_sid(&usersid);
|
|
|
|
|
|
|
|
/* NULL szProductCodeOrPatchCode */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szProductCodeOrPatchCode */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* garbage szProductCodeOrPatchCode */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* szProductCodeOrPatchCode */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* guid without brackets */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* guid with brackets */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* same length as guid, but random */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA("ADKD-2KSDFF2-DKK1KNFJASD9GLKWME-1I3KAD", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* invalid context */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_NONE,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* another invalid context */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALLUSERMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* yet another invalid context */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALL,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* mix two valid contexts */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED | MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* invalid option */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
4, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* NULL property */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, NULL, NULL, NULL);
|
2007-06-29 23:12:44 +02:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
/* empty property */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, "", NULL, NULL);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* value is non-NULL while size is NULL */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, NULL);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* size is non-NULL while value is NULL */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
2007-06-29 23:12:48 +02:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &hkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
2007-06-29 23:12:52 +02:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2007-07-03 05:17:59 +02:00
|
|
|
ok(size == 0, "Expected 0, got %d\n", size);
|
2007-06-29 23:12:41 +02:00
|
|
|
|
|
|
|
data = "msitest.msi";
|
|
|
|
res = RegSetValueExA(hkey, "PackageName", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* PackageName value exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
|
|
|
|
|
|
|
/* read the value, don't change size */
|
|
|
|
lstrcpyA(value, "aaa");
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
|
|
|
|
ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected 'aaa', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
|
|
|
|
|
|
|
/* read the value, fix size */
|
|
|
|
size++;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
|
|
|
|
|
|
|
/* empty property now that product key exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, "", NULL, &size);
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* nonexistent property now that product key exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, "nonexistent", NULL, &size);
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
data = "tester";
|
|
|
|
res = RegSetValueExA(hkey, "nonexistent", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* nonexistent property now that nonexistent value exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PRODUCT, "nonexistent", NULL, &size);
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* invalid option now that product key exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
4, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
|
|
|
|
|
|
|
RegDeleteValueA(hkey, "nonexistent");
|
|
|
|
RegDeleteValueA(hkey, "PackageName");
|
|
|
|
RegDeleteKeyA(hkey, "");
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(hkey);
|
|
|
|
RegCloseKey(userkey);
|
|
|
|
|
|
|
|
/* try a patch */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
2007-07-03 05:18:34 +02:00
|
|
|
ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Patches\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* patch key exists
|
|
|
|
* NOTE: using prodcode guid, but it really doesn't matter
|
|
|
|
*/
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
2007-07-03 05:18:34 +02:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2007-06-29 23:12:41 +02:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &hkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = 0xdeadbeef;
|
2007-08-10 15:04:57 +02:00
|
|
|
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
2007-06-29 23:12:41 +02:00
|
|
|
MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
|
2007-07-03 05:18:34 +02:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(size == 0, "Expected 0, got %d\n", size);
|
|
|
|
|
|
|
|
RegDeleteKeyA(hkey, "");
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(hkey);
|
|
|
|
RegCloseKey(userkey);
|
2007-06-29 23:12:41 +02:00
|
|
|
}
|
|
|
|
|
2007-11-05 10:16:13 +01:00
|
|
|
static void test_MsiSourceListAddSourceEx(void)
|
|
|
|
{
|
|
|
|
CHAR prodcode[MAX_PATH];
|
|
|
|
CHAR prod_squashed[MAX_PATH];
|
|
|
|
CHAR keypath[MAX_PATH*2];
|
|
|
|
CHAR value[MAX_PATH];
|
|
|
|
LPSTR usersid;
|
|
|
|
LONG res;
|
|
|
|
UINT r;
|
|
|
|
HKEY prodkey, userkey, hkey;
|
|
|
|
HKEY url, net;
|
|
|
|
DWORD size;
|
|
|
|
|
|
|
|
if (!pMsiSourceListAddSourceExA)
|
|
|
|
{
|
2008-01-24 11:56:21 +01:00
|
|
|
skip("Skipping MsiSourceListAddSourceExA tests\n");
|
2007-11-05 10:16:13 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
create_test_guid(prodcode, prod_squashed);
|
|
|
|
get_user_sid(&usersid);
|
|
|
|
|
|
|
|
/* GetLastError is not set by the function */
|
|
|
|
|
|
|
|
/* NULL szProductCodeOrPatchCode */
|
|
|
|
r = pMsiSourceListAddSourceExA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szProductCodeOrPatchCode */
|
|
|
|
r = pMsiSourceListAddSourceExA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:26:34 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* garbage szProductCodeOrPatchCode */
|
|
|
|
r = pMsiSourceListAddSourceExA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:26:34 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* guid without brackets */
|
|
|
|
r = pMsiSourceListAddSourceExA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:26:34 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* guid with brackets */
|
|
|
|
r = pMsiSourceListAddSourceExA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERUNMANAGED */
|
|
|
|
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:19:13 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
RegCloseKey(url);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
res = RegOpenKeyA(userkey, "SourceList\\URL", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* add another source, index 0 */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
|
|
|
|
ok(size == 9, "Expected 9, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* add another source, index 1 */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "third/", 1);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
|
|
|
|
ok(size == 7, "Expected 7, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
|
|
|
|
ok(size == 9, "Expected 9, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* add another source, index > N */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "last/", 5);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
|
|
|
|
ok(size == 7, "Expected 7, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
|
|
|
|
ok(size == 9, "Expected 9, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value);
|
|
|
|
ok(size == 6, "Expected 6, got %d\n", size);
|
|
|
|
|
|
|
|
/* just MSISOURCETYPE_NETWORK */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSISOURCETYPE_NETWORK, "source", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
res = RegOpenKeyA(userkey, "SourceList\\Net", &net);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value);
|
|
|
|
ok(size == 8, "Expected 8, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* just MSISOURCETYPE_URL */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSISOURCETYPE_URL, "source", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
|
|
|
|
ok(size == 7, "Expected 7, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:30:38 +01:00
|
|
|
ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
|
|
|
|
ok(size == 9, "Expected 9, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value);
|
|
|
|
ok(size == 6, "Expected 6, got %d\n", size);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "5", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "source/"), "Expected 'source/', got %s\n", value);
|
|
|
|
ok(size == 8, "Expected 8, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* NULL szUserSid */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSISOURCETYPE_NETWORK, "nousersid", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value);
|
|
|
|
ok(size == 8, "Expected 8, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(net, "2", NULL, NULL, (LPBYTE)value, &size);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:20:09 +01:00
|
|
|
ok(!lstrcmpA(value, "nousersid\\"), "Expected 'nousersid\\', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* invalid options, must have source type */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT, "source", 0);
|
2007-11-05 10:29:47 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PATCH, "source", 0);
|
2007-11-05 10:29:47 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* NULL szSource */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSISOURCETYPE_URL, NULL, 1);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szSource */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSISOURCETYPE_URL, "", 1);
|
2007-11-05 10:27:39 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERMANAGED, non-NULL szUserSid */
|
|
|
|
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
|
|
|
|
lstrcatA(keypath, usersid);
|
|
|
|
lstrcatA(keypath, "\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* product key exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(prodkey, "SourceList", &hkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
RegCloseKey(hkey);
|
|
|
|
|
|
|
|
/* SourceList exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
RegCloseKey(url);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERMANAGED, NULL szUserSid */
|
|
|
|
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
|
2007-11-05 10:32:00 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
|
|
|
|
ok(size == 9, "Expected 9, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
RegCloseKey(url);
|
|
|
|
RegCloseKey(prodkey);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_MACHINE */
|
|
|
|
|
|
|
|
/* szUserSid must be NULL for MSIINSTALLCONTEXT_MACHINE */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:32:45 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* product key exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:33:37 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(prodkey, "SourceList", &hkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
RegCloseKey(hkey);
|
|
|
|
|
|
|
|
/* SourceList exists */
|
|
|
|
r = pMsiSourceListAddSourceExA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
|
2007-11-05 10:33:37 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
|
2007-11-05 10:33:37 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
|
2007-11-05 10:33:37 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
|
|
|
|
ok(size == 11, "Expected 11, got %d\n", size);
|
2007-11-05 10:16:13 +01:00
|
|
|
|
|
|
|
RegCloseKey(url);
|
|
|
|
RegCloseKey(prodkey);
|
|
|
|
HeapFree(GetProcessHeap(), 0, usersid);
|
|
|
|
}
|
|
|
|
|
2008-02-18 07:59:38 +01:00
|
|
|
static void test_MsiSourceListEnumSources(void)
|
|
|
|
{
|
|
|
|
CHAR prodcode[MAX_PATH];
|
|
|
|
CHAR prod_squashed[MAX_PATH];
|
|
|
|
CHAR keypath[MAX_PATH*2];
|
|
|
|
CHAR value[MAX_PATH];
|
|
|
|
LPSTR usersid;
|
|
|
|
LONG res;
|
|
|
|
UINT r;
|
|
|
|
HKEY prodkey, userkey;
|
|
|
|
HKEY url, net, source;
|
|
|
|
DWORD size;
|
|
|
|
|
|
|
|
create_test_guid(prodcode, prod_squashed);
|
|
|
|
get_user_sid(&usersid);
|
|
|
|
|
|
|
|
/* GetLastError is not set by the function */
|
|
|
|
|
|
|
|
/* NULL szProductCodeOrPatchCode */
|
|
|
|
size = 0xdeadbeef;
|
|
|
|
r = MsiSourceListEnumSourcesA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* empty szProductCodeOrPatchCode */
|
|
|
|
size = 0xdeadbeef;
|
|
|
|
r = MsiSourceListEnumSourcesA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* garbage szProductCodeOrPatchCode */
|
|
|
|
size = 0xdeadbeef;
|
|
|
|
r = MsiSourceListEnumSourcesA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* guid without brackets */
|
|
|
|
size = 0xdeadbeef;
|
|
|
|
r = MsiSourceListEnumSourcesA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA",
|
|
|
|
usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* guid with brackets */
|
|
|
|
size = 0xdeadbeef;
|
|
|
|
r = MsiSourceListEnumSourcesA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}",
|
|
|
|
usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERUNMANAGED */
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "URL", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* URL key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
res = RegSetValueExA(url, "2", 0, REG_SZ, (LPBYTE)"second", 7);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
res = RegSetValueExA(url, "4", 0, REG_SZ, (LPBYTE)"fourth", 7);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* try index 0 again */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
|
|
|
|
2008-02-21 07:03:25 +01:00
|
|
|
/* both szSource and pcchSource are NULL, index 0 */
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, NULL);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
/* both szSource and pcchSource are NULL, index 1 */
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, NULL, NULL);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
2008-02-21 07:02:08 +01:00
|
|
|
/* size is exactly 5 */
|
|
|
|
size = 5;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
|
|
|
ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
|
|
|
|
|
|
|
/* szSource is non-NULL while pcchSource is NULL */
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, NULL);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value);
|
|
|
|
|
|
|
|
/* try index 1 after failure */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* reset the enumeration */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* try index 1 */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "second"), "Expected \"second\", got %s\n", value);
|
|
|
|
ok(size == 6, "Expected 6, got %d\n", size);
|
|
|
|
|
|
|
|
/* try index 1 again */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* try index 2 */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 2, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* try index < 0 */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, -1, value, &size);
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* NULL szUserSid */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PATCH, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL,
|
|
|
|
0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_SUCCESS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
|
|
|
|
0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
RegDeleteValueA(url, "1");
|
|
|
|
RegDeleteValueA(url, "2");
|
|
|
|
RegDeleteValueA(url, "4");
|
|
|
|
RegDeleteKeyA(url, "");
|
|
|
|
RegCloseKey(url);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "Net", &net);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* Net key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(net, "1");
|
|
|
|
RegDeleteKeyA(net, "");
|
|
|
|
RegCloseKey(net);
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(userkey);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERMANAGED */
|
|
|
|
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
|
|
|
|
lstrcatA(keypath, usersid);
|
|
|
|
lstrcatA(keypath, "\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "URL", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* URL key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* NULL szUserSid */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(url, "1");
|
|
|
|
RegDeleteKeyA(url, "");
|
|
|
|
RegCloseKey(url);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "Net", &net);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* Net key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(net, "1");
|
|
|
|
RegDeleteKeyA(net, "");
|
|
|
|
RegCloseKey(net);
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(userkey);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_MACHINE */
|
|
|
|
|
|
|
|
/* szUserSid is non-NULL */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
/* szUserSid is non-NULL */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(prodkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "URL", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* URL key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
/* NULL szUserSid */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(url, "1");
|
|
|
|
RegDeleteKeyA(url, "");
|
|
|
|
RegCloseKey(url);
|
|
|
|
|
|
|
|
/* SourceList key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(source, "Net", &net);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* Net key exists */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
2008-02-18 07:59:38 +01:00
|
|
|
ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
|
|
|
|
ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
|
|
|
|
|
|
|
|
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* sources exist */
|
|
|
|
size = MAX_PATH;
|
|
|
|
lstrcpyA(value, "aaa");
|
|
|
|
r = MsiSourceListEnumSourcesA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
|
2008-02-21 07:02:08 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
|
|
|
|
ok(size == 5, "Expected 5, got %d\n", size);
|
2008-02-18 07:59:38 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(net, "1");
|
|
|
|
RegDeleteKeyA(net, "");
|
|
|
|
RegCloseKey(net);
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(prodkey, "");
|
|
|
|
RegCloseKey(prodkey);
|
|
|
|
}
|
|
|
|
|
2008-02-19 07:58:10 +01:00
|
|
|
static void test_MsiSourceListSetInfo(void)
|
|
|
|
{
|
|
|
|
CHAR prodcode[MAX_PATH];
|
|
|
|
CHAR prod_squashed[MAX_PATH];
|
|
|
|
CHAR keypath[MAX_PATH*2];
|
|
|
|
HKEY prodkey, userkey;
|
|
|
|
HKEY net, url, media, source;
|
|
|
|
LPSTR usersid;
|
|
|
|
LONG res;
|
|
|
|
UINT r;
|
|
|
|
|
|
|
|
create_test_guid(prodcode, prod_squashed);
|
|
|
|
get_user_sid(&usersid);
|
|
|
|
|
|
|
|
/* GetLastError is not set by the function */
|
|
|
|
|
|
|
|
/* NULL szProductCodeOrPatchCode */
|
|
|
|
r = MsiSourceListSetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szProductCodeOrPatchCode */
|
|
|
|
r = MsiSourceListSetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:08:11 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* garbage szProductCodeOrPatchCode */
|
|
|
|
r = MsiSourceListSetInfoA("garbage", usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:08:11 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* guid without brackets */
|
|
|
|
r = MsiSourceListSetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA",
|
|
|
|
usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:08:11 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* guid with brackets */
|
|
|
|
r = MsiSourceListSetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}",
|
|
|
|
usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT,
|
|
|
|
"Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* dwOptions is MSICODE_PRODUCT */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT,
|
|
|
|
"Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* dwOptions is MSICODE_PATCH */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* dwOptions is both MSICODE_PRODUCT and MSICODE_PATCH */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
|
|
|
|
|
2008-02-19 07:58:10 +01:00
|
|
|
/* dwOptions has both MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT,
|
|
|
|
"Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* LastUsedSource and dwOptions has both
|
|
|
|
* MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL
|
|
|
|
*/
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT,
|
|
|
|
"Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* LastUsedSource and dwOptions has no source type */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PRODUCT,
|
|
|
|
"Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERUNMANAGED */
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:09:33 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION,
|
|
|
|
"Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists, no source type */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* Media key is created by MsiSourceListSetInfo */
|
|
|
|
res = RegOpenKeyA(source, "Media", &media);
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
CHECK_REG_STR(media, "MediaPackage", "path");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* set the info again */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path2");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
CHECK_REG_STR(media, "MediaPackage", "path2");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* NULL szProperty */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
NULL, "path");
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szProperty */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
"", "path");
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY,
|
|
|
|
"Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
|
|
|
|
/* NULL szValue */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, NULL);
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY,
|
|
|
|
"Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
|
|
|
|
/* empty szValue */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
CHECK_REG_STR(media, "MediaPackage", "");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_NETWORK */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_URL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_DISKPROMPT */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_DISKPROMPT, "prompt");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
CHECK_REG_STR(media, "DiskPrompt", "prompt");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_NETWORK */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_DISKPROMPT, "prompt");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_URL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_DISKPROMPT, "prompt");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_LASTUSEDSOURCE */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source");
|
2008-02-21 07:04:04 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_NETWORK */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source");
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
/* Net key is created by MsiSourceListSetInfo */
|
|
|
|
res = RegOpenKeyA(source, "Net", &net);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
CHECK_REG_STR(net, "1", "source\\")
|
2008-02-21 07:04:04 +01:00
|
|
|
CHECK_REG_STR(source, "LastUsedSource", "n;1;source");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* source has forward slash */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source/");
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2008-02-21 07:04:04 +01:00
|
|
|
CHECK_REG_STR(net, "1", "source\\");
|
|
|
|
CHECK_REG_STR(net, "2", "source/\\");
|
|
|
|
CHECK_REG_STR(source, "LastUsedSource", "n;2;source/");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_URL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source");
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
|
|
|
|
/* URL key is created by MsiSourceListSetInfo */
|
|
|
|
res = RegOpenKeyA(source, "URL", &url);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
CHECK_REG_STR(url, "1", "source/");
|
2008-02-21 07:04:04 +01:00
|
|
|
CHECK_REG_STR(source, "LastUsedSource", "u;1;source");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* source has backslash */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source\\");
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
CHECK_REG_STR(url, "1", "source/");
|
2008-02-21 07:04:04 +01:00
|
|
|
CHECK_REG_STR(url, "2", "source\\/");
|
|
|
|
CHECK_REG_STR(source, "LastUsedSource", "u;2;source\\");
|
|
|
|
|
|
|
|
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_MEDIA */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_MEDIA,
|
|
|
|
INSTALLPROPERTY_LASTUSEDSOURCE, "source");
|
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_PACKAGENAME */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_PACKAGENAME, "name");
|
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
|
|
|
CHECK_REG_STR(source, "PackageName", "name");
|
|
|
|
|
|
|
|
/* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_NETWORK */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
|
|
|
|
INSTALLPROPERTY_PACKAGENAME, "name");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_URL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED,
|
|
|
|
MSICODE_PRODUCT | MSISOURCETYPE_URL,
|
|
|
|
INSTALLPROPERTY_PACKAGENAME, "name");
|
2008-02-19 09:11:42 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* INSTALLPROPERTY_LASTUSEDTYPE */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_LASTUSEDTYPE, "type");
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY,
|
|
|
|
"Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
|
|
|
|
/* definitely unknown property */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
|
|
|
|
"unknown", "val");
|
|
|
|
ok(r == ERROR_UNKNOWN_PROPERTY,
|
|
|
|
"Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
|
|
|
|
|
|
|
|
RegDeleteValueA(net, "1");
|
|
|
|
RegDeleteKeyA(net, "");
|
|
|
|
RegCloseKey(net);
|
|
|
|
RegDeleteValueA(url, "1");
|
|
|
|
RegDeleteKeyA(url, "");
|
|
|
|
RegCloseKey(url);
|
|
|
|
RegDeleteValueA(media, "MediaPackage");
|
|
|
|
RegDeleteValueA(media, "DiskPrompt");
|
|
|
|
RegDeleteKeyA(media, "");
|
|
|
|
RegCloseKey(media);
|
|
|
|
RegDeleteValueA(source, "PackageName");
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(userkey);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_USERMANAGED */
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
|
|
|
|
lstrcatA(keypath, usersid);
|
|
|
|
lstrcatA(keypath, "\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:09:33 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION,
|
|
|
|
"Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(userkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists, no source type */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* Media key is created by MsiSourceListSetInfo */
|
|
|
|
res = RegOpenKeyA(source, "Media", &media);
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
CHECK_REG_STR(media, "MediaPackage", "path");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(media, "MediaPackage");
|
|
|
|
RegDeleteKeyA(media, "");
|
|
|
|
RegCloseKey(media);
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(userkey, "");
|
|
|
|
RegCloseKey(userkey);
|
|
|
|
|
|
|
|
/* MSIINSTALLCONTEXT_MACHINE */
|
|
|
|
|
|
|
|
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
|
|
|
|
lstrcatA(keypath, prod_squashed);
|
|
|
|
|
|
|
|
res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* user product key exists */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:09:33 +01:00
|
|
|
ok(r == ERROR_BAD_CONFIGURATION,
|
|
|
|
"Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
res = RegCreateKeyA(prodkey, "SourceList", &source);
|
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
|
|
|
|
/* SourceList key exists, no source type */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, NULL,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* Media key is created by MsiSourceListSetInfo */
|
|
|
|
res = RegOpenKeyA(source, "Media", &media);
|
2008-02-19 08:49:04 +01:00
|
|
|
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
|
|
|
CHECK_REG_STR(media, "MediaPackage", "path");
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
/* szUserSid is non-NULL */
|
|
|
|
r = MsiSourceListSetInfoA(prodcode, usersid,
|
|
|
|
MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
|
|
|
|
INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
|
2008-02-19 09:12:30 +01:00
|
|
|
ok(r == ERROR_INVALID_PARAMETER,
|
|
|
|
"Expected ERROR_INVALID_PARAMETER, got %d\n", r);
|
2008-02-19 07:58:10 +01:00
|
|
|
|
|
|
|
RegDeleteValueA(media, "MediaPackage");
|
|
|
|
RegDeleteKeyA(media, "");
|
|
|
|
RegCloseKey(media);
|
|
|
|
RegDeleteKeyA(source, "");
|
|
|
|
RegCloseKey(source);
|
|
|
|
RegDeleteKeyA(prodkey, "");
|
|
|
|
RegCloseKey(prodkey);
|
|
|
|
}
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
START_TEST(source)
|
|
|
|
{
|
2007-08-10 15:04:57 +02:00
|
|
|
init_functionpointers();
|
|
|
|
|
2007-06-29 23:12:41 +02:00
|
|
|
test_MsiSourceListGetInfo();
|
2007-11-05 10:16:13 +01:00
|
|
|
test_MsiSourceListAddSourceEx();
|
2008-02-18 07:59:38 +01:00
|
|
|
test_MsiSourceListEnumSources();
|
2008-02-19 07:58:10 +01:00
|
|
|
test_MsiSourceListSetInfo();
|
2007-06-29 23:12:41 +02:00
|
|
|
}
|