msi: Return ERROR_INVALID_PARAMETER if the context is machine and szUserSid is non...
[wine.git] / dlls / msi / tests / source.c
blob6f704df386cfb7627b86082e7ac72c665165c212
1 /*
2 * Tests for MSI Source functions
4 * Copyright (C) 2006 James Hawkins
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define _WIN32_MSI 300
23 #include <stdio.h>
25 #include <windows.h>
26 #include <msiquery.h>
27 #include <msidefs.h>
28 #include <msi.h>
29 #include <sddl.h>
31 #include "wine/test.h"
33 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
34 static UINT (WINAPI *pMsiSourceListGetInfoA)
35 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
36 static UINT (WINAPI *pMsiSourceListAddSourceExA)
37 (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, DWORD);
39 static void init_functionpointers(void)
41 HMODULE hmsi = GetModuleHandleA("msi.dll");
42 HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
44 #define GET_PROC(dll, func) \
45 p ## func = (void *)GetProcAddress(dll, #func); \
46 if(!p ## func) \
47 trace("GetProcAddress(%s) failed\n", #func);
49 GET_PROC(hmsi, MsiSourceListAddSourceExA)
50 GET_PROC(hmsi, MsiSourceListGetInfoA)
52 GET_PROC(hadvapi32, ConvertSidToStringSidA)
54 #undef GET_PROC
57 /* copied from dlls/msi/registry.c */
58 static BOOL squash_guid(LPCWSTR in, LPWSTR out)
60 DWORD i,n=1;
61 GUID guid;
63 if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
64 return FALSE;
66 for(i=0; i<8; i++)
67 out[7-i] = in[n++];
68 n++;
69 for(i=0; i<4; i++)
70 out[11-i] = in[n++];
71 n++;
72 for(i=0; i<4; i++)
73 out[15-i] = in[n++];
74 n++;
75 for(i=0; i<2; i++)
77 out[17+i*2] = in[n++];
78 out[16+i*2] = in[n++];
80 n++;
81 for( ; i<8; i++)
83 out[17+i*2] = in[n++];
84 out[16+i*2] = in[n++];
86 out[32]=0;
87 return TRUE;
90 static void create_test_guid(LPSTR prodcode, LPSTR squashed)
92 WCHAR guidW[MAX_PATH];
93 WCHAR squashedW[MAX_PATH];
94 GUID guid;
95 HRESULT hr;
96 int size;
98 hr = CoCreateGuid(&guid);
99 ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
101 size = StringFromGUID2(&guid, (LPOLESTR)guidW, MAX_PATH);
102 ok(size == 39, "Expected 39, got %d\n", hr);
104 WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL);
105 squash_guid(guidW, squashedW);
106 WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
109 static void get_user_sid(LPSTR *usersid)
111 HANDLE token;
112 BYTE buf[1024];
113 DWORD size;
114 PTOKEN_USER user;
116 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
117 size = sizeof(buf);
118 GetTokenInformation(token, TokenUser, (void *)buf, size, &size);
119 user = (PTOKEN_USER)buf;
120 pConvertSidToStringSidA(user->User.Sid, usersid);
123 static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line)
125 char val[MAX_PATH];
126 DWORD size, type;
127 LONG res;
129 size = MAX_PATH;
130 val[0] = '\0';
131 res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
133 if (res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ))
135 ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
136 return;
139 if (!expected)
140 ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
141 else
143 if (bcase)
144 ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val);
145 else
146 ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val);
150 #define CHECK_REG_STR(prodkey, name, expected) \
151 check_reg_str(prodkey, name, expected, TRUE, __LINE__);
153 static void test_MsiSourceListGetInfo(void)
155 CHAR prodcode[MAX_PATH];
156 CHAR prod_squashed[MAX_PATH];
157 CHAR keypath[MAX_PATH*2];
158 CHAR value[MAX_PATH];
159 LPSTR usersid;
160 LPCSTR data;
161 LONG res;
162 UINT r;
163 HKEY userkey, hkey;
164 DWORD size;
166 if (!pMsiSourceListGetInfoA)
168 skip("Skipping MsiSourceListGetInfoA tests\n");
169 return;
172 create_test_guid(prodcode, prod_squashed);
173 get_user_sid(&usersid);
175 /* NULL szProductCodeOrPatchCode */
176 r = pMsiSourceListGetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
177 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
178 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
180 /* empty szProductCodeOrPatchCode */
181 r = pMsiSourceListGetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
182 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
183 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
185 /* garbage szProductCodeOrPatchCode */
186 r = pMsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
187 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
188 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
190 /* szProductCodeOrPatchCode */
191 r = pMsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
192 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
193 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
195 /* guid without brackets */
196 r = pMsiSourceListGetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
197 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
198 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
200 /* guid with brackets */
201 r = pMsiSourceListGetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
202 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
203 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
205 /* same length as guid, but random */
206 r = pMsiSourceListGetInfoA("ADKD-2KSDFF2-DKK1KNFJASD9GLKWME-1I3KAD", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
207 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
208 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
210 /* invalid context */
211 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_NONE,
212 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
213 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
215 /* another invalid context */
216 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALLUSERMANAGED,
217 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
218 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
220 /* yet another invalid context */
221 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALL,
222 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
223 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
225 /* mix two valid contexts */
226 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED | MSIINSTALLCONTEXT_USERUNMANAGED,
227 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
228 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
230 /* invalid option */
231 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
232 4, INSTALLPROPERTY_PACKAGENAME, NULL, NULL);
233 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
235 /* NULL property */
236 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
237 MSICODE_PRODUCT, NULL, NULL, NULL);
238 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
240 /* empty property */
241 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
242 MSICODE_PRODUCT, "", NULL, NULL);
243 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
245 /* value is non-NULL while size is NULL */
246 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
247 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, NULL);
248 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
250 /* size is non-NULL while value is NULL */
251 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
252 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
253 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
255 lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
256 lstrcatA(keypath, prod_squashed);
258 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
259 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
261 /* user product key exists */
262 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
263 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
264 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
266 res = RegCreateKeyA(userkey, "SourceList", &hkey);
267 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
269 /* SourceList key exists */
270 size = 0xdeadbeef;
271 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
272 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
273 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
274 ok(size == 0, "Expected 0, got %d\n", size);
276 data = "msitest.msi";
277 res = RegSetValueExA(hkey, "PackageName", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1);
278 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
280 /* PackageName value exists */
281 size = 0xdeadbeef;
282 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
283 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
284 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
285 ok(size == 11, "Expected 11, got %d\n", size);
287 /* read the value, don't change size */
288 lstrcpyA(value, "aaa");
289 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
290 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
291 ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
292 ok(!lstrcmpA(value, "aaa"), "Expected 'aaa', got %s\n", value);
293 ok(size == 11, "Expected 11, got %d\n", size);
295 /* read the value, fix size */
296 size++;
297 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
298 MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size);
299 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
300 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
301 ok(size == 11, "Expected 11, got %d\n", size);
303 /* empty property now that product key exists */
304 size = 0xdeadbeef;
305 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
306 MSICODE_PRODUCT, "", NULL, &size);
307 ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
308 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
310 /* nonexistent property now that product key exists */
311 size = 0xdeadbeef;
312 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
313 MSICODE_PRODUCT, "nonexistent", NULL, &size);
314 ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
315 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
317 data = "tester";
318 res = RegSetValueExA(hkey, "nonexistent", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1);
319 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
321 /* nonexistent property now that nonexistent value exists */
322 size = 0xdeadbeef;
323 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
324 MSICODE_PRODUCT, "nonexistent", NULL, &size);
325 ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
326 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
328 /* invalid option now that product key exists */
329 size = 0xdeadbeef;
330 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
331 4, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
332 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
333 ok(size == 11, "Expected 11, got %d\n", size);
335 RegDeleteValueA(hkey, "nonexistent");
336 RegDeleteValueA(hkey, "PackageName");
337 RegDeleteKeyA(hkey, "");
338 RegDeleteKeyA(userkey, "");
339 RegCloseKey(hkey);
340 RegCloseKey(userkey);
342 /* try a patch */
343 size = 0xdeadbeef;
344 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
345 MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
346 ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
347 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
349 lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Patches\\");
350 lstrcatA(keypath, prod_squashed);
352 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
353 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
355 /* patch key exists
356 * NOTE: using prodcode guid, but it really doesn't matter
358 size = 0xdeadbeef;
359 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
360 MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
361 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
362 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
364 res = RegCreateKeyA(userkey, "SourceList", &hkey);
365 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
367 /* SourceList key exists */
368 size = 0xdeadbeef;
369 r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
370 MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAME, NULL, &size);
371 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
372 ok(size == 0, "Expected 0, got %d\n", size);
374 RegDeleteKeyA(hkey, "");
375 RegDeleteKeyA(userkey, "");
376 RegCloseKey(hkey);
377 RegCloseKey(userkey);
380 static void test_MsiSourceListAddSourceEx(void)
382 CHAR prodcode[MAX_PATH];
383 CHAR prod_squashed[MAX_PATH];
384 CHAR keypath[MAX_PATH*2];
385 CHAR value[MAX_PATH];
386 LPSTR usersid;
387 LONG res;
388 UINT r;
389 HKEY prodkey, userkey, hkey;
390 HKEY url, net;
391 DWORD size;
393 if (!pMsiSourceListAddSourceExA)
395 skip("Skipping MsiSourceListAddSourceExA tests\n");
396 return;
399 create_test_guid(prodcode, prod_squashed);
400 get_user_sid(&usersid);
402 /* GetLastError is not set by the function */
404 /* NULL szProductCodeOrPatchCode */
405 r = pMsiSourceListAddSourceExA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
406 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
407 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
409 /* empty szProductCodeOrPatchCode */
410 r = pMsiSourceListAddSourceExA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
411 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
412 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
414 /* garbage szProductCodeOrPatchCode */
415 r = pMsiSourceListAddSourceExA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
416 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
417 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
419 /* guid without brackets */
420 r = pMsiSourceListAddSourceExA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid,
421 MSIINSTALLCONTEXT_USERUNMANAGED,
422 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
423 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
425 /* guid with brackets */
426 r = pMsiSourceListAddSourceExA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid,
427 MSIINSTALLCONTEXT_USERUNMANAGED,
428 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
429 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
431 /* MSIINSTALLCONTEXT_USERUNMANAGED */
433 r = pMsiSourceListAddSourceExA(prodcode, usersid,
434 MSIINSTALLCONTEXT_USERUNMANAGED,
435 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
436 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
438 lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
439 lstrcatA(keypath, prod_squashed);
441 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
442 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
444 /* user product key exists */
445 r = pMsiSourceListAddSourceExA(prodcode, usersid,
446 MSIINSTALLCONTEXT_USERUNMANAGED,
447 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
448 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
450 res = RegCreateKeyA(userkey, "SourceList", &url);
451 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
452 RegCloseKey(url);
454 /* SourceList key exists */
455 r = pMsiSourceListAddSourceExA(prodcode, usersid,
456 MSIINSTALLCONTEXT_USERUNMANAGED,
457 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
458 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
460 res = RegOpenKeyA(userkey, "SourceList\\URL", &url);
461 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
463 size = MAX_PATH;
464 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
465 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
466 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
467 ok(size == 11, "Expected 11, got %d\n", size);
469 /* add another source, index 0 */
470 r = pMsiSourceListAddSourceExA(prodcode, usersid,
471 MSIINSTALLCONTEXT_USERUNMANAGED,
472 MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0);
473 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
475 size = MAX_PATH;
476 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
477 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
478 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
479 ok(size == 11, "Expected 11, got %d\n", size);
481 size = MAX_PATH;
482 res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
483 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
484 ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
485 ok(size == 9, "Expected 9, got %d\n", size);
487 /* add another source, index 1 */
488 r = pMsiSourceListAddSourceExA(prodcode, usersid,
489 MSIINSTALLCONTEXT_USERUNMANAGED,
490 MSICODE_PRODUCT | MSISOURCETYPE_URL, "third/", 1);
491 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
493 size = MAX_PATH;
494 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
495 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
496 ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
497 ok(size == 7, "Expected 7, got %d\n", size);
499 size = MAX_PATH;
500 res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
501 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
502 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
503 ok(size == 11, "Expected 11, got %d\n", size);
505 size = MAX_PATH;
506 res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
507 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
508 ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
509 ok(size == 9, "Expected 9, got %d\n", size);
511 /* add another source, index > N */
512 r = pMsiSourceListAddSourceExA(prodcode, usersid,
513 MSIINSTALLCONTEXT_USERUNMANAGED,
514 MSICODE_PRODUCT | MSISOURCETYPE_URL, "last/", 5);
515 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
517 size = MAX_PATH;
518 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
519 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
520 ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
521 ok(size == 7, "Expected 7, got %d\n", size);
523 size = MAX_PATH;
524 res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
525 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
526 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
527 ok(size == 11, "Expected 11, got %d\n", size);
529 size = MAX_PATH;
530 res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
531 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
532 ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
533 ok(size == 9, "Expected 9, got %d\n", size);
535 size = MAX_PATH;
536 res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size);
537 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
538 ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value);
539 ok(size == 6, "Expected 6, got %d\n", size);
541 /* just MSISOURCETYPE_NETWORK */
542 r = pMsiSourceListAddSourceExA(prodcode, usersid,
543 MSIINSTALLCONTEXT_USERUNMANAGED,
544 MSISOURCETYPE_NETWORK, "source", 0);
545 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
547 res = RegOpenKeyA(userkey, "SourceList\\Net", &net);
548 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
550 size = MAX_PATH;
551 res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size);
552 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
553 ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value);
554 ok(size == 8, "Expected 8, got %d\n", size);
556 /* just MSISOURCETYPE_URL */
557 r = pMsiSourceListAddSourceExA(prodcode, usersid,
558 MSIINSTALLCONTEXT_USERUNMANAGED,
559 MSISOURCETYPE_URL, "source", 0);
560 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
562 size = MAX_PATH;
563 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
564 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
565 ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value);
566 ok(size == 7, "Expected 7, got %d\n", size);
568 size = MAX_PATH;
569 res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
570 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
571 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
572 ok(size == 11, "Expected 11, got %d\n", size);
574 size = MAX_PATH;
575 res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size);
576 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
577 ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
578 ok(size == 9, "Expected 9, got %d\n", size);
580 size = MAX_PATH;
581 res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size);
582 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
583 ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value);
584 ok(size == 6, "Expected 6, got %d\n", size);
586 size = MAX_PATH;
587 res = RegQueryValueExA(url, "5", NULL, NULL, (LPBYTE)value, &size);
588 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
589 ok(!lstrcmpA(value, "source/"), "Expected 'source/', got %s\n", value);
590 ok(size == 8, "Expected 8, got %d\n", size);
592 /* NULL szUserSid */
593 r = pMsiSourceListAddSourceExA(prodcode, NULL,
594 MSIINSTALLCONTEXT_USERUNMANAGED,
595 MSISOURCETYPE_NETWORK, "nousersid", 0);
596 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
598 size = MAX_PATH;
599 res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size);
600 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
601 ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value);
602 ok(size == 8, "Expected 8, got %d\n", size);
604 size = MAX_PATH;
605 res = RegQueryValueExA(net, "2", NULL, NULL, (LPBYTE)value, &size);
606 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
607 ok(!lstrcmpA(value, "nousersid\\"), "Expected 'nousersid\\', got %s\n", value);
608 ok(size == 11, "Expected 11, got %d\n", size);
610 /* invalid options, must have source type */
611 r = pMsiSourceListAddSourceExA(prodcode, usersid,
612 MSIINSTALLCONTEXT_USERUNMANAGED,
613 MSICODE_PRODUCT, "source", 0);
614 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
616 r = pMsiSourceListAddSourceExA(prodcode, usersid,
617 MSIINSTALLCONTEXT_USERUNMANAGED,
618 MSICODE_PATCH, "source", 0);
619 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
621 /* NULL szSource */
622 r = pMsiSourceListAddSourceExA(prodcode, usersid,
623 MSIINSTALLCONTEXT_USERUNMANAGED,
624 MSISOURCETYPE_URL, NULL, 1);
625 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
627 /* empty szSource */
628 r = pMsiSourceListAddSourceExA(prodcode, usersid,
629 MSIINSTALLCONTEXT_USERUNMANAGED,
630 MSISOURCETYPE_URL, "", 1);
631 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
633 /* MSIINSTALLCONTEXT_USERMANAGED, non-NULL szUserSid */
635 r = pMsiSourceListAddSourceExA(prodcode, usersid,
636 MSIINSTALLCONTEXT_USERMANAGED,
637 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
638 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
640 lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
641 lstrcatA(keypath, usersid);
642 lstrcatA(keypath, "\\Installer\\Products\\");
643 lstrcatA(keypath, prod_squashed);
645 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
646 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
648 /* product key exists */
649 r = pMsiSourceListAddSourceExA(prodcode, usersid,
650 MSIINSTALLCONTEXT_USERMANAGED,
651 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
652 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
654 res = RegCreateKeyA(prodkey, "SourceList", &hkey);
655 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
656 RegCloseKey(hkey);
658 /* SourceList exists */
659 r = pMsiSourceListAddSourceExA(prodcode, usersid,
660 MSIINSTALLCONTEXT_USERMANAGED,
661 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
662 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
664 res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
665 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
667 size = MAX_PATH;
668 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
669 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
670 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
671 ok(size == 11, "Expected 11, got %d\n", size);
673 RegCloseKey(url);
675 /* MSIINSTALLCONTEXT_USERMANAGED, NULL szUserSid */
677 r = pMsiSourceListAddSourceExA(prodcode, NULL,
678 MSIINSTALLCONTEXT_USERMANAGED,
679 MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0);
680 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
682 res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
683 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
685 size = MAX_PATH;
686 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
687 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
688 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
689 ok(size == 11, "Expected 11, got %d\n", size);
691 size = MAX_PATH;
692 res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size);
693 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
694 ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value);
695 ok(size == 9, "Expected 9, got %d\n", size);
697 RegCloseKey(url);
698 RegCloseKey(prodkey);
700 /* MSIINSTALLCONTEXT_MACHINE */
702 /* szUserSid must be NULL for MSIINSTALLCONTEXT_MACHINE */
703 r = pMsiSourceListAddSourceExA(prodcode, usersid,
704 MSIINSTALLCONTEXT_MACHINE,
705 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
706 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
708 r = pMsiSourceListAddSourceExA(prodcode, NULL,
709 MSIINSTALLCONTEXT_MACHINE,
710 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
711 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
713 lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
714 lstrcatA(keypath, prod_squashed);
716 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
717 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
719 /* product key exists */
720 r = pMsiSourceListAddSourceExA(prodcode, NULL,
721 MSIINSTALLCONTEXT_MACHINE,
722 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
723 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
725 res = RegCreateKeyA(prodkey, "SourceList", &hkey);
726 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
727 RegCloseKey(hkey);
729 /* SourceList exists */
730 r = pMsiSourceListAddSourceExA(prodcode, NULL,
731 MSIINSTALLCONTEXT_MACHINE,
732 MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0);
733 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
735 res = RegOpenKeyA(prodkey, "SourceList\\URL", &url);
736 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
738 size = MAX_PATH;
739 res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size);
740 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
741 ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value);
742 ok(size == 11, "Expected 11, got %d\n", size);
744 RegCloseKey(url);
745 RegCloseKey(prodkey);
746 HeapFree(GetProcessHeap(), 0, usersid);
749 static void test_MsiSourceListEnumSources(void)
751 CHAR prodcode[MAX_PATH];
752 CHAR prod_squashed[MAX_PATH];
753 CHAR keypath[MAX_PATH*2];
754 CHAR value[MAX_PATH];
755 LPSTR usersid;
756 LONG res;
757 UINT r;
758 HKEY prodkey, userkey;
759 HKEY url, net, source;
760 DWORD size;
762 create_test_guid(prodcode, prod_squashed);
763 get_user_sid(&usersid);
765 /* GetLastError is not set by the function */
767 /* NULL szProductCodeOrPatchCode */
768 size = 0xdeadbeef;
769 r = MsiSourceListEnumSourcesA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
770 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
771 todo_wine
773 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
775 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
777 /* empty szProductCodeOrPatchCode */
778 size = 0xdeadbeef;
779 r = MsiSourceListEnumSourcesA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
780 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
781 todo_wine
783 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
785 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
787 /* garbage szProductCodeOrPatchCode */
788 size = 0xdeadbeef;
789 r = MsiSourceListEnumSourcesA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
790 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
791 todo_wine
793 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
795 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
797 /* guid without brackets */
798 size = 0xdeadbeef;
799 r = MsiSourceListEnumSourcesA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA",
800 usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
801 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
802 todo_wine
804 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
806 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
808 /* guid with brackets */
809 size = 0xdeadbeef;
810 r = MsiSourceListEnumSourcesA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}",
811 usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
812 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
813 todo_wine
815 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
817 ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", size);
819 /* MSIINSTALLCONTEXT_USERUNMANAGED */
821 size = MAX_PATH;
822 lstrcpyA(value, "aaa");
823 r = MsiSourceListEnumSourcesA(prodcode, usersid,
824 MSIINSTALLCONTEXT_USERUNMANAGED,
825 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
826 todo_wine
828 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
830 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
831 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
833 lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
834 lstrcatA(keypath, prod_squashed);
836 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
837 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
839 /* user product key exists */
840 size = MAX_PATH;
841 lstrcpyA(value, "aaa");
842 r = MsiSourceListEnumSourcesA(prodcode, usersid,
843 MSIINSTALLCONTEXT_USERUNMANAGED,
844 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
845 todo_wine
847 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
849 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
850 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
852 res = RegCreateKeyA(userkey, "SourceList", &source);
853 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
855 /* SourceList key exists */
856 size = MAX_PATH;
857 lstrcpyA(value, "aaa");
858 r = MsiSourceListEnumSourcesA(prodcode, usersid,
859 MSIINSTALLCONTEXT_USERUNMANAGED,
860 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
861 todo_wine
863 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
865 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
866 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
868 res = RegCreateKeyA(source, "URL", &url);
869 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
871 /* URL key exists */
872 size = MAX_PATH;
873 lstrcpyA(value, "aaa");
874 r = MsiSourceListEnumSourcesA(prodcode, usersid,
875 MSIINSTALLCONTEXT_USERUNMANAGED,
876 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
877 todo_wine
879 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
881 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
882 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
884 res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
885 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
887 res = RegSetValueExA(url, "2", 0, REG_SZ, (LPBYTE)"second", 7);
888 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
890 res = RegSetValueExA(url, "4", 0, REG_SZ, (LPBYTE)"fourth", 7);
891 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
893 /* sources exist */
894 size = MAX_PATH;
895 lstrcpyA(value, "aaa");
896 r = MsiSourceListEnumSourcesA(prodcode, usersid,
897 MSIINSTALLCONTEXT_USERUNMANAGED,
898 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
899 todo_wine
901 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
902 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
903 ok(size == 5, "Expected 5, got %d\n", size);
906 /* try index 0 again */
907 size = MAX_PATH;
908 lstrcpyA(value, "aaa");
909 r = MsiSourceListEnumSourcesA(prodcode, usersid,
910 MSIINSTALLCONTEXT_USERUNMANAGED,
911 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
912 todo_wine
914 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
915 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
916 ok(size == 5, "Expected 5, got %d\n", size);
919 /* try index 1 */
920 size = MAX_PATH;
921 lstrcpyA(value, "aaa");
922 r = MsiSourceListEnumSourcesA(prodcode, usersid,
923 MSIINSTALLCONTEXT_USERUNMANAGED,
924 MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size);
925 todo_wine
927 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
928 ok(!lstrcmpA(value, "second"), "Expected \"second\", got %s\n", value);
929 ok(size == 6, "Expected 6, got %d\n", size);
932 /* try index 2 */
933 size = MAX_PATH;
934 lstrcpyA(value, "aaa");
935 r = MsiSourceListEnumSourcesA(prodcode, usersid,
936 MSIINSTALLCONTEXT_USERUNMANAGED,
937 MSICODE_PRODUCT | MSISOURCETYPE_URL, 2, value, &size);
938 todo_wine
940 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
942 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
943 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
945 /* NULL szUserSid */
946 size = MAX_PATH;
947 lstrcpyA(value, "aaa");
948 r = MsiSourceListEnumSourcesA(prodcode, NULL,
949 MSIINSTALLCONTEXT_USERUNMANAGED,
950 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
951 todo_wine
953 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
954 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
955 ok(size == 5, "Expected 5, got %d\n", size);
958 /* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
959 size = MAX_PATH;
960 lstrcpyA(value, "aaa");
961 r = MsiSourceListEnumSourcesA(prodcode, NULL,
962 MSIINSTALLCONTEXT_USERUNMANAGED,
963 MSICODE_PRODUCT, 0, value, &size);
964 todo_wine
966 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
968 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
969 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
971 /* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
972 size = MAX_PATH;
973 lstrcpyA(value, "aaa");
974 r = MsiSourceListEnumSourcesA(prodcode, NULL,
975 MSIINSTALLCONTEXT_USERUNMANAGED,
976 MSICODE_PATCH, 0, value, &size);
977 todo_wine
979 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
981 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
982 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
984 /* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
985 size = MAX_PATH;
986 lstrcpyA(value, "aaa");
987 r = MsiSourceListEnumSourcesA(prodcode, NULL,
988 MSIINSTALLCONTEXT_USERUNMANAGED,
989 MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL,
990 0, value, &size);
991 todo_wine
993 ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_SUCCESS, got %d\n", r);
995 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
996 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
998 /* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */
999 size = MAX_PATH;
1000 lstrcpyA(value, "aaa");
1001 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1002 MSIINSTALLCONTEXT_USERUNMANAGED,
1003 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
1004 0, value, &size);
1005 todo_wine
1007 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1009 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1010 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1012 RegDeleteValueA(url, "1");
1013 RegDeleteValueA(url, "2");
1014 RegDeleteValueA(url, "4");
1015 RegDeleteKeyA(url, "");
1016 RegCloseKey(url);
1018 /* SourceList key exists */
1019 size = MAX_PATH;
1020 lstrcpyA(value, "aaa");
1021 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1022 MSIINSTALLCONTEXT_USERUNMANAGED,
1023 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1024 todo_wine
1026 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1028 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1029 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1031 res = RegCreateKeyA(source, "Net", &net);
1032 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1034 /* Net key exists */
1035 size = MAX_PATH;
1036 lstrcpyA(value, "aaa");
1037 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1038 MSIINSTALLCONTEXT_USERUNMANAGED,
1039 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1040 todo_wine
1042 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1044 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1045 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1047 res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
1048 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1050 /* sources exist */
1051 size = MAX_PATH;
1052 lstrcpyA(value, "aaa");
1053 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1054 MSIINSTALLCONTEXT_USERUNMANAGED,
1055 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1056 todo_wine
1058 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1059 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1060 ok(size == 5, "Expected 5, got %d\n", size);
1063 RegDeleteValueA(net, "1");
1064 RegDeleteKeyA(net, "");
1065 RegCloseKey(net);
1066 RegDeleteKeyA(source, "");
1067 RegCloseKey(source);
1068 RegDeleteKeyA(userkey, "");
1069 RegCloseKey(userkey);
1071 /* MSIINSTALLCONTEXT_USERMANAGED */
1073 size = MAX_PATH;
1074 lstrcpyA(value, "aaa");
1075 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1076 MSIINSTALLCONTEXT_USERMANAGED,
1077 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1078 todo_wine
1080 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1082 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1083 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1085 lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
1086 lstrcatA(keypath, usersid);
1087 lstrcatA(keypath, "\\Installer\\Products\\");
1088 lstrcatA(keypath, prod_squashed);
1090 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
1091 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1093 /* user product key exists */
1094 size = MAX_PATH;
1095 lstrcpyA(value, "aaa");
1096 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1097 MSIINSTALLCONTEXT_USERMANAGED,
1098 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1099 todo_wine
1101 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
1103 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1104 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1106 res = RegCreateKeyA(userkey, "SourceList", &source);
1107 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1109 /* SourceList key exists */
1110 size = MAX_PATH;
1111 lstrcpyA(value, "aaa");
1112 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1113 MSIINSTALLCONTEXT_USERMANAGED,
1114 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1115 todo_wine
1117 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1119 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1120 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1122 res = RegCreateKeyA(source, "URL", &url);
1123 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1125 /* URL key exists */
1126 size = MAX_PATH;
1127 lstrcpyA(value, "aaa");
1128 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1129 MSIINSTALLCONTEXT_USERMANAGED,
1130 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1131 todo_wine
1133 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1135 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1136 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1138 res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
1139 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1141 /* sources exist */
1142 size = MAX_PATH;
1143 lstrcpyA(value, "aaa");
1144 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1145 MSIINSTALLCONTEXT_USERMANAGED,
1146 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1147 todo_wine
1149 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1150 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1151 ok(size == 5, "Expected 5, got %d\n", size);
1154 /* NULL szUserSid */
1155 size = MAX_PATH;
1156 lstrcpyA(value, "aaa");
1157 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1158 MSIINSTALLCONTEXT_USERMANAGED,
1159 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1160 todo_wine
1162 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1163 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1164 ok(size == 5, "Expected 5, got %d\n", size);
1167 RegDeleteValueA(url, "1");
1168 RegDeleteKeyA(url, "");
1169 RegCloseKey(url);
1171 /* SourceList key exists */
1172 size = MAX_PATH;
1173 lstrcpyA(value, "aaa");
1174 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1175 MSIINSTALLCONTEXT_USERMANAGED,
1176 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1177 todo_wine
1179 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1181 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1182 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1184 res = RegCreateKeyA(source, "Net", &net);
1185 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1187 /* Net key exists */
1188 size = MAX_PATH;
1189 lstrcpyA(value, "aaa");
1190 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1191 MSIINSTALLCONTEXT_USERMANAGED,
1192 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1193 todo_wine
1195 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1197 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1198 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1200 res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
1201 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1203 /* sources exist */
1204 size = MAX_PATH;
1205 lstrcpyA(value, "aaa");
1206 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1207 MSIINSTALLCONTEXT_USERMANAGED,
1208 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1209 todo_wine
1211 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1212 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1213 ok(size == 5, "Expected 5, got %d\n", size);
1216 RegDeleteValueA(net, "1");
1217 RegDeleteKeyA(net, "");
1218 RegCloseKey(net);
1219 RegDeleteKeyA(source, "");
1220 RegCloseKey(source);
1221 RegDeleteKeyA(userkey, "");
1222 RegCloseKey(userkey);
1224 /* MSIINSTALLCONTEXT_MACHINE */
1226 /* szUserSid is non-NULL */
1227 size = MAX_PATH;
1228 lstrcpyA(value, "aaa");
1229 r = MsiSourceListEnumSourcesA(prodcode, usersid,
1230 MSIINSTALLCONTEXT_MACHINE,
1231 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1232 todo_wine
1234 ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1236 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1237 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1239 /* szUserSid is non-NULL */
1240 size = MAX_PATH;
1241 lstrcpyA(value, "aaa");
1242 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1243 MSIINSTALLCONTEXT_MACHINE,
1244 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1245 todo_wine
1247 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1249 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1250 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1252 lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
1253 lstrcatA(keypath, prod_squashed);
1255 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
1256 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1258 /* user product key exists */
1259 size = MAX_PATH;
1260 lstrcpyA(value, "aaa");
1261 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1262 MSIINSTALLCONTEXT_MACHINE,
1263 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1264 todo_wine
1266 ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
1268 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1269 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1271 res = RegCreateKeyA(prodkey, "SourceList", &source);
1272 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1274 /* SourceList key exists */
1275 size = MAX_PATH;
1276 lstrcpyA(value, "aaa");
1277 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1278 MSIINSTALLCONTEXT_MACHINE,
1279 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1280 todo_wine
1282 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1284 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1285 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1287 res = RegCreateKeyA(source, "URL", &url);
1288 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1290 /* URL key exists */
1291 size = MAX_PATH;
1292 lstrcpyA(value, "aaa");
1293 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1294 MSIINSTALLCONTEXT_MACHINE,
1295 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1296 todo_wine
1298 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1300 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1301 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1303 res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6);
1304 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1306 /* sources exist */
1307 size = MAX_PATH;
1308 lstrcpyA(value, "aaa");
1309 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1310 MSIINSTALLCONTEXT_MACHINE,
1311 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1312 todo_wine
1314 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1315 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1316 ok(size == 5, "Expected 5, got %d\n", size);
1319 /* NULL szUserSid */
1320 size = MAX_PATH;
1321 lstrcpyA(value, "aaa");
1322 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1323 MSIINSTALLCONTEXT_MACHINE,
1324 MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size);
1325 todo_wine
1327 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1328 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1329 ok(size == 5, "Expected 5, got %d\n", size);
1332 RegDeleteValueA(url, "1");
1333 RegDeleteKeyA(url, "");
1334 RegCloseKey(url);
1336 /* SourceList key exists */
1337 size = MAX_PATH;
1338 lstrcpyA(value, "aaa");
1339 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1340 MSIINSTALLCONTEXT_MACHINE,
1341 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1342 todo_wine
1344 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1346 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1347 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1349 res = RegCreateKeyA(source, "Net", &net);
1350 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1352 /* Net key exists */
1353 size = MAX_PATH;
1354 lstrcpyA(value, "aaa");
1355 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1356 MSIINSTALLCONTEXT_MACHINE,
1357 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1358 todo_wine
1360 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
1362 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
1363 ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size);
1365 res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6);
1366 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1368 /* sources exist */
1369 size = MAX_PATH;
1370 lstrcpyA(value, "aaa");
1371 r = MsiSourceListEnumSourcesA(prodcode, NULL,
1372 MSIINSTALLCONTEXT_MACHINE,
1373 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size);
1374 todo_wine
1376 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1377 ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value);
1378 ok(size == 5, "Expected 5, got %d\n", size);
1381 RegDeleteValueA(net, "1");
1382 RegDeleteKeyA(net, "");
1383 RegCloseKey(net);
1384 RegDeleteKeyA(source, "");
1385 RegCloseKey(source);
1386 RegDeleteKeyA(prodkey, "");
1387 RegCloseKey(prodkey);
1390 static void test_MsiSourceListSetInfo(void)
1392 CHAR prodcode[MAX_PATH];
1393 CHAR prod_squashed[MAX_PATH];
1394 CHAR keypath[MAX_PATH*2];
1395 HKEY prodkey, userkey;
1396 HKEY net, url, media, source;
1397 LPSTR usersid;
1398 LONG res;
1399 UINT r;
1401 create_test_guid(prodcode, prod_squashed);
1402 get_user_sid(&usersid);
1404 /* GetLastError is not set by the function */
1406 /* NULL szProductCodeOrPatchCode */
1407 r = MsiSourceListSetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
1408 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1409 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1410 ok(r == ERROR_INVALID_PARAMETER,
1411 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1413 /* empty szProductCodeOrPatchCode */
1414 r = MsiSourceListSetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
1415 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1416 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1417 ok(r == ERROR_INVALID_PARAMETER,
1418 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1420 /* garbage szProductCodeOrPatchCode */
1421 r = MsiSourceListSetInfoA("garbage", usersid,
1422 MSIINSTALLCONTEXT_USERUNMANAGED,
1423 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1424 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1425 ok(r == ERROR_INVALID_PARAMETER,
1426 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1428 /* guid without brackets */
1429 r = MsiSourceListSetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA",
1430 usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
1431 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1432 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1433 ok(r == ERROR_INVALID_PARAMETER,
1434 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1436 /* guid with brackets */
1437 r = MsiSourceListSetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}",
1438 usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
1439 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1440 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1441 ok(r == ERROR_UNKNOWN_PRODUCT,
1442 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1444 /* dwOptions is MSICODE_PRODUCT */
1445 r = MsiSourceListSetInfoA(prodcode, usersid,
1446 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1447 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1448 ok(r == ERROR_UNKNOWN_PRODUCT,
1449 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1451 /* dwOptions is MSICODE_PATCH */
1452 r = MsiSourceListSetInfoA(prodcode, usersid,
1453 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH,
1454 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1455 ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
1457 /* dwOptions is both MSICODE_PRODUCT and MSICODE_PATCH */
1458 r = MsiSourceListSetInfoA(prodcode, usersid,
1459 MSIINSTALLCONTEXT_USERUNMANAGED,
1460 MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL,
1461 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1462 ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
1464 /* dwOptions has both MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL */
1465 r = MsiSourceListSetInfoA(prodcode, NULL,
1466 MSIINSTALLCONTEXT_USERUNMANAGED,
1467 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
1468 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1469 ok(r == ERROR_UNKNOWN_PRODUCT,
1470 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1472 /* LastUsedSource and dwOptions has both
1473 * MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL
1475 r = MsiSourceListSetInfoA(prodcode, NULL,
1476 MSIINSTALLCONTEXT_USERUNMANAGED,
1477 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL,
1478 INSTALLPROPERTY_LASTUSEDSOURCE, "path");
1479 ok(r == ERROR_UNKNOWN_PRODUCT,
1480 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1482 /* LastUsedSource and dwOptions has no source type */
1483 r = MsiSourceListSetInfoA(prodcode, NULL,
1484 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1485 INSTALLPROPERTY_LASTUSEDSOURCE, "path");
1486 ok(r == ERROR_UNKNOWN_PRODUCT,
1487 "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
1489 /* MSIINSTALLCONTEXT_USERUNMANAGED */
1491 lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\");
1492 lstrcatA(keypath, prod_squashed);
1494 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey);
1495 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1497 /* user product key exists */
1498 r = MsiSourceListSetInfoA(prodcode, NULL,
1499 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1500 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1501 ok(r == ERROR_BAD_CONFIGURATION,
1502 "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
1504 res = RegCreateKeyA(userkey, "SourceList", &source);
1505 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1507 /* SourceList key exists, no source type */
1508 r = MsiSourceListSetInfoA(prodcode, NULL,
1509 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1510 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1511 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1513 /* Media key is created by MsiSourceListSetInfo */
1514 res = RegOpenKeyA(source, "Media", &media);
1515 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1516 CHECK_REG_STR(media, "MediaPackage", "path");
1518 /* set the info again */
1519 r = MsiSourceListSetInfoA(prodcode, NULL,
1520 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1521 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path2");
1522 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1523 CHECK_REG_STR(media, "MediaPackage", "path2");
1525 /* NULL szProperty */
1526 r = MsiSourceListSetInfoA(prodcode, NULL,
1527 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1528 NULL, "path");
1529 ok(r == ERROR_INVALID_PARAMETER,
1530 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1532 /* empty szProperty */
1533 r = MsiSourceListSetInfoA(prodcode, NULL,
1534 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1535 "", "path");
1536 ok(r == ERROR_UNKNOWN_PROPERTY,
1537 "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
1539 /* NULL szValue */
1540 r = MsiSourceListSetInfoA(prodcode, NULL,
1541 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1542 INSTALLPROPERTY_MEDIAPACKAGEPATH, NULL);
1543 ok(r == ERROR_UNKNOWN_PROPERTY,
1544 "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
1546 /* empty szValue */
1547 r = MsiSourceListSetInfoA(prodcode, NULL,
1548 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1549 INSTALLPROPERTY_MEDIAPACKAGEPATH, "");
1550 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1551 CHECK_REG_STR(media, "MediaPackage", "");
1553 /* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_NETWORK */
1554 r = MsiSourceListSetInfoA(prodcode, NULL,
1555 MSIINSTALLCONTEXT_USERUNMANAGED,
1556 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1557 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1558 ok(r == ERROR_INVALID_PARAMETER,
1559 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1561 /* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_URL */
1562 r = MsiSourceListSetInfoA(prodcode, NULL,
1563 MSIINSTALLCONTEXT_USERUNMANAGED,
1564 MSICODE_PRODUCT | MSISOURCETYPE_URL,
1565 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1566 ok(r == ERROR_INVALID_PARAMETER,
1567 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1569 /* INSTALLPROPERTY_DISKPROMPT */
1570 r = MsiSourceListSetInfoA(prodcode, NULL,
1571 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1572 INSTALLPROPERTY_DISKPROMPT, "prompt");
1573 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1574 CHECK_REG_STR(media, "DiskPrompt", "prompt");
1576 /* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_NETWORK */
1577 r = MsiSourceListSetInfoA(prodcode, NULL,
1578 MSIINSTALLCONTEXT_USERUNMANAGED,
1579 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1580 INSTALLPROPERTY_DISKPROMPT, "prompt");
1581 ok(r == ERROR_INVALID_PARAMETER,
1582 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1584 /* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_URL */
1585 r = MsiSourceListSetInfoA(prodcode, NULL,
1586 MSIINSTALLCONTEXT_USERUNMANAGED,
1587 MSICODE_PRODUCT | MSISOURCETYPE_URL,
1588 INSTALLPROPERTY_DISKPROMPT, "prompt");
1589 ok(r == ERROR_INVALID_PARAMETER,
1590 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1592 /* INSTALLPROPERTY_LASTUSEDSOURCE */
1593 r = MsiSourceListSetInfoA(prodcode, NULL,
1594 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1595 INSTALLPROPERTY_LASTUSEDSOURCE, "source");
1596 todo_wine
1598 ok(r == ERROR_INVALID_PARAMETER,
1599 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1602 /* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_NETWORK */
1603 r = MsiSourceListSetInfoA(prodcode, NULL,
1604 MSIINSTALLCONTEXT_USERUNMANAGED,
1605 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1606 INSTALLPROPERTY_LASTUSEDSOURCE, "source");
1607 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1609 /* Net key is created by MsiSourceListSetInfo */
1610 res = RegOpenKeyA(source, "Net", &net);
1611 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1612 CHECK_REG_STR(net, "1", "source\\")
1614 /* source has forward slash */
1615 r = MsiSourceListSetInfoA(prodcode, NULL,
1616 MSIINSTALLCONTEXT_USERUNMANAGED,
1617 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1618 INSTALLPROPERTY_LASTUSEDSOURCE, "source/");
1619 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1620 CHECK_REG_STR(net, "1", "source\\")
1622 /* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_URL */
1623 r = MsiSourceListSetInfoA(prodcode, NULL,
1624 MSIINSTALLCONTEXT_USERUNMANAGED,
1625 MSICODE_PRODUCT | MSISOURCETYPE_URL,
1626 INSTALLPROPERTY_LASTUSEDSOURCE, "source");
1627 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1629 /* URL key is created by MsiSourceListSetInfo */
1630 res = RegOpenKeyA(source, "URL", &url);
1631 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1632 CHECK_REG_STR(url, "1", "source/");
1634 /* source has backslash */
1635 r = MsiSourceListSetInfoA(prodcode, NULL,
1636 MSIINSTALLCONTEXT_USERUNMANAGED,
1637 MSICODE_PRODUCT | MSISOURCETYPE_URL,
1638 INSTALLPROPERTY_LASTUSEDSOURCE, "source\\");
1639 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1640 CHECK_REG_STR(url, "1", "source/");
1642 /* INSTALLPROPERTY_PACKAGENAME */
1643 r = MsiSourceListSetInfoA(prodcode, NULL,
1644 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1645 INSTALLPROPERTY_PACKAGENAME, "name");
1646 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1647 CHECK_REG_STR(source, "PackageName", "name");
1649 /* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_NETWORK */
1650 r = MsiSourceListSetInfoA(prodcode, NULL,
1651 MSIINSTALLCONTEXT_USERUNMANAGED,
1652 MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
1653 INSTALLPROPERTY_PACKAGENAME, "name");
1654 ok(r == ERROR_INVALID_PARAMETER,
1655 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1657 /* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_URL */
1658 r = MsiSourceListSetInfoA(prodcode, NULL,
1659 MSIINSTALLCONTEXT_USERUNMANAGED,
1660 MSICODE_PRODUCT | MSISOURCETYPE_URL,
1661 INSTALLPROPERTY_PACKAGENAME, "name");
1662 ok(r == ERROR_INVALID_PARAMETER,
1663 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1665 /* INSTALLPROPERTY_LASTUSEDTYPE */
1666 r = MsiSourceListSetInfoA(prodcode, NULL,
1667 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1668 INSTALLPROPERTY_LASTUSEDTYPE, "type");
1669 ok(r == ERROR_UNKNOWN_PROPERTY,
1670 "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
1672 /* definitely unknown property */
1673 r = MsiSourceListSetInfoA(prodcode, NULL,
1674 MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
1675 "unknown", "val");
1676 ok(r == ERROR_UNKNOWN_PROPERTY,
1677 "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
1679 RegDeleteValueA(net, "1");
1680 RegDeleteKeyA(net, "");
1681 RegCloseKey(net);
1682 RegDeleteValueA(url, "1");
1683 RegDeleteKeyA(url, "");
1684 RegCloseKey(url);
1685 RegDeleteValueA(media, "MediaPackage");
1686 RegDeleteValueA(media, "DiskPrompt");
1687 RegDeleteKeyA(media, "");
1688 RegCloseKey(media);
1689 RegDeleteValueA(source, "PackageName");
1690 RegDeleteKeyA(source, "");
1691 RegCloseKey(source);
1692 RegDeleteKeyA(userkey, "");
1693 RegCloseKey(userkey);
1695 /* MSIINSTALLCONTEXT_USERMANAGED */
1697 lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\");
1698 lstrcatA(keypath, usersid);
1699 lstrcatA(keypath, "\\Installer\\Products\\");
1700 lstrcatA(keypath, prod_squashed);
1702 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
1703 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1705 /* user product key exists */
1706 r = MsiSourceListSetInfoA(prodcode, NULL,
1707 MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
1708 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1709 ok(r == ERROR_BAD_CONFIGURATION,
1710 "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
1712 res = RegCreateKeyA(userkey, "SourceList", &source);
1713 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1715 /* SourceList key exists, no source type */
1716 r = MsiSourceListSetInfoA(prodcode, NULL,
1717 MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
1718 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1719 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1721 /* Media key is created by MsiSourceListSetInfo */
1722 res = RegOpenKeyA(source, "Media", &media);
1723 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1724 CHECK_REG_STR(media, "MediaPackage", "path");
1726 RegDeleteValueA(media, "MediaPackage");
1727 RegDeleteKeyA(media, "");
1728 RegCloseKey(media);
1729 RegDeleteKeyA(source, "");
1730 RegCloseKey(source);
1731 RegDeleteKeyA(userkey, "");
1732 RegCloseKey(userkey);
1734 /* MSIINSTALLCONTEXT_MACHINE */
1736 lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
1737 lstrcatA(keypath, prod_squashed);
1739 res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
1740 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1742 /* user product key exists */
1743 r = MsiSourceListSetInfoA(prodcode, NULL,
1744 MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
1745 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1746 ok(r == ERROR_BAD_CONFIGURATION,
1747 "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
1749 res = RegCreateKeyA(prodkey, "SourceList", &source);
1750 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1752 /* SourceList key exists, no source type */
1753 r = MsiSourceListSetInfoA(prodcode, NULL,
1754 MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
1755 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1756 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1758 /* Media key is created by MsiSourceListSetInfo */
1759 res = RegOpenKeyA(source, "Media", &media);
1760 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
1761 CHECK_REG_STR(media, "MediaPackage", "path");
1763 /* szUserSid is non-NULL */
1764 r = MsiSourceListSetInfoA(prodcode, usersid,
1765 MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT,
1766 INSTALLPROPERTY_MEDIAPACKAGEPATH, "path");
1767 ok(r == ERROR_INVALID_PARAMETER,
1768 "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
1770 RegDeleteValueA(media, "MediaPackage");
1771 RegDeleteKeyA(media, "");
1772 RegCloseKey(media);
1773 RegDeleteKeyA(source, "");
1774 RegCloseKey(source);
1775 RegDeleteKeyA(prodkey, "");
1776 RegCloseKey(prodkey);
1779 START_TEST(source)
1781 init_functionpointers();
1783 test_MsiSourceListGetInfo();
1784 test_MsiSourceListAddSourceEx();
1785 test_MsiSourceListEnumSources();
1786 test_MsiSourceListSetInfo();