user32/tests: Fix the listbox delete test on NT4.
[wine] / dlls / msi / tests / package.c
1 /*
2  * tests for Microsoft Installer functionality
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  * Copyright 2005 Aric Stewart for CodeWeavers
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #define COBJMACROS
23
24 #include <stdio.h>
25 #include <windows.h>
26 #include <msidefs.h>
27 #include <msi.h>
28 #include <msiquery.h>
29
30 #include "wine/test.h"
31
32 static const char msifile[] = "winetest.msi";
33 char CURR_DIR[MAX_PATH];
34
35 static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR);
36
37 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
38
39 static void init_functionpointers(void)
40 {
41     HMODULE hmsi = GetModuleHandleA("msi.dll");
42     HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
43
44 #define GET_PROC(mod, func) \
45     p ## func = (void*)GetProcAddress(mod, #func);
46
47     GET_PROC(hmsi, MsiApplyMultiplePatchesA);
48
49     GET_PROC(hadvapi32, ConvertSidToStringSidA);
50
51 #undef GET_PROC
52 }
53
54
55 static LPSTR get_user_sid(LPSTR *usersid)
56 {
57     HANDLE token;
58     BYTE buf[1024];
59     DWORD size;
60     PTOKEN_USER user;
61
62     if (!pConvertSidToStringSidA)
63     {
64         win_skip("ConvertSidToStringSidA is not available\n");
65         return NULL;
66     }
67
68     *usersid = NULL;
69     OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
70     size = sizeof(buf);
71     GetTokenInformation(token, TokenUser, buf, size, &size);
72     user = (PTOKEN_USER)buf;
73     pConvertSidToStringSidA(user->User.Sid, usersid);
74     ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError());
75     CloseHandle(token);
76     return *usersid;
77 }
78
79 /* RegDeleteTreeW from dlls/advapi32/registry.c */
80 static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
81 {
82     LONG ret;
83     DWORD dwMaxSubkeyLen, dwMaxValueLen;
84     DWORD dwMaxLen, dwSize;
85     WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
86     HKEY hSubKey = hKey;
87
88     if(lpszSubKey)
89     {
90         ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
91         if (ret) return ret;
92     }
93
94     ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
95             &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
96     if (ret) goto cleanup;
97
98     dwMaxSubkeyLen++;
99     dwMaxValueLen++;
100     dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
101     if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
102     {
103         /* Name too big: alloc a buffer for it */
104         if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
105         {
106             ret = ERROR_NOT_ENOUGH_MEMORY;
107             goto cleanup;
108         }
109     }
110
111     /* Recursively delete all the subkeys */
112     while (TRUE)
113     {
114         dwSize = dwMaxLen;
115         if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
116                           NULL, NULL, NULL)) break;
117
118         ret = package_RegDeleteTreeW(hSubKey, lpszName);
119         if (ret) goto cleanup;
120     }
121
122     if (lpszSubKey)
123         ret = RegDeleteKeyW(hKey, lpszSubKey);
124     else
125         while (TRUE)
126         {
127             dwSize = dwMaxLen;
128             if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
129                   NULL, NULL, NULL, NULL)) break;
130
131             ret = RegDeleteValueW(hKey, lpszName);
132             if (ret) goto cleanup;
133         }
134
135 cleanup:
136     if (lpszName != szNameBuf)
137         HeapFree(GetProcessHeap(), 0, lpszName);
138     if(lpszSubKey)
139         RegCloseKey(hSubKey);
140     return ret;
141 }
142
143 static BOOL squash_guid(LPCWSTR in, LPWSTR out)
144 {
145     DWORD i,n=1;
146     GUID guid;
147
148     if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
149         return FALSE;
150
151     for(i=0; i<8; i++)
152         out[7-i] = in[n++];
153     n++;
154     for(i=0; i<4; i++)
155         out[11-i] = in[n++];
156     n++;
157     for(i=0; i<4; i++)
158         out[15-i] = in[n++];
159     n++;
160     for(i=0; i<2; i++)
161     {
162         out[17+i*2] = in[n++];
163         out[16+i*2] = in[n++];
164     }
165     n++;
166     for( ; i<8; i++)
167     {
168         out[17+i*2] = in[n++];
169         out[16+i*2] = in[n++];
170     }
171     out[32]=0;
172     return TRUE;
173 }
174
175 static void create_test_guid(LPSTR prodcode, LPSTR squashed)
176 {
177     WCHAR guidW[MAX_PATH];
178     WCHAR squashedW[MAX_PATH];
179     GUID guid;
180     HRESULT hr;
181     int size;
182
183     hr = CoCreateGuid(&guid);
184     ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
185
186     size = StringFromGUID2(&guid, guidW, MAX_PATH);
187     ok(size == 39, "Expected 39, got %d\n", hr);
188
189     WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL);
190     squash_guid(guidW, squashedW);
191     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
192 }
193
194 static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context,
195                                LPCSTR guid, LPSTR usersid, BOOL dir)
196 {
197     WCHAR guidW[MAX_PATH];
198     WCHAR squashedW[MAX_PATH];
199     CHAR squashed[MAX_PATH];
200     CHAR comppath[MAX_PATH];
201     CHAR prodpath[MAX_PATH];
202     CHAR path[MAX_PATH];
203     LPCSTR prod = NULL;
204     HKEY hkey;
205
206     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
207     squash_guid(guidW, squashedW);
208     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
209
210     if (context == MSIINSTALLCONTEXT_MACHINE)
211     {
212         prod = "3D0DAE300FACA1300AD792060BCDAA92";
213         sprintf(comppath,
214                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
215                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
216         lstrcpyA(prodpath,
217                  "SOFTWARE\\Classes\\Installer\\"
218                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
219     }
220     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
221     {
222         prod = "7D2F387510109040002000060BECB6AB";
223         sprintf(comppath,
224                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
225                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
226         sprintf(prodpath,
227                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
228                 "Installer\\%s\\Installer\\Products\\"
229                 "7D2F387510109040002000060BECB6AB", usersid);
230     }
231     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
232     {
233         prod = "7D2F387510109040002000060BECB6AB";
234         sprintf(comppath,
235                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
236                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
237         sprintf(prodpath,
238                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
239                 "Installer\\Managed\\%s\\Installer\\Products\\"
240                 "7D2F387510109040002000060BECB6AB", usersid);
241     }
242
243     RegCreateKeyA(HKEY_LOCAL_MACHINE, comppath, &hkey);
244
245     lstrcpyA(path, CURR_DIR);
246     lstrcatA(path, "\\");
247     if (!dir) lstrcatA(path, filename);
248
249     RegSetValueExA(hkey, prod, 0, REG_SZ, (LPBYTE)path, lstrlenA(path));
250     RegCloseKey(hkey);
251
252     RegCreateKeyA(HKEY_LOCAL_MACHINE, prodpath, &hkey);
253     RegCloseKey(hkey);
254 }
255
256 static void delete_component_path(LPCSTR guid, MSIINSTALLCONTEXT context, LPSTR usersid)
257 {
258     WCHAR guidW[MAX_PATH];
259     WCHAR squashedW[MAX_PATH];
260     WCHAR substrW[MAX_PATH];
261     CHAR squashed[MAX_PATH];
262     CHAR comppath[MAX_PATH];
263     CHAR prodpath[MAX_PATH];
264
265     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
266     squash_guid(guidW, squashedW);
267     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
268
269     if (context == MSIINSTALLCONTEXT_MACHINE)
270     {
271         sprintf(comppath,
272                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
273                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
274         lstrcpyA(prodpath,
275                  "SOFTWARE\\Classes\\Installer\\"
276                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
277     }
278     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
279     {
280         sprintf(comppath,
281                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
282                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
283         sprintf(prodpath,
284                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
285                 "Installer\\%s\\Installer\\Products\\"
286                 "7D2F387510109040002000060BECB6AB", usersid);
287     }
288     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
289     {
290         sprintf(comppath,
291                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
292                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
293         sprintf(prodpath,
294                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
295                 "Installer\\Managed\\%s\\Installer\\Products\\"
296                 "7D2F387510109040002000060BECB6AB", usersid);
297     }
298
299     MultiByteToWideChar(CP_ACP, 0, comppath, -1, substrW, MAX_PATH);
300     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
301
302     MultiByteToWideChar(CP_ACP, 0, prodpath, -1, substrW, MAX_PATH);
303     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
304 }
305
306 static UINT do_query(MSIHANDLE hdb, const char *query, MSIHANDLE *phrec)
307 {
308     MSIHANDLE hview = 0;
309     UINT r, ret;
310
311     /* open a select query */
312     r = MsiDatabaseOpenView(hdb, query, &hview);
313     if (r != ERROR_SUCCESS)
314         return r;
315     r = MsiViewExecute(hview, 0);
316     if (r != ERROR_SUCCESS)
317         return r;
318     ret = MsiViewFetch(hview, phrec);
319     r = MsiViewClose(hview);
320     if (r != ERROR_SUCCESS)
321         return r;
322     r = MsiCloseHandle(hview);
323     if (r != ERROR_SUCCESS)
324         return r;
325     return ret;
326 }
327
328 static UINT run_query( MSIHANDLE hdb, const char *query )
329 {
330     MSIHANDLE hview = 0;
331     UINT r;
332
333     r = MsiDatabaseOpenView(hdb, query, &hview);
334     if( r != ERROR_SUCCESS )
335         return r;
336
337     r = MsiViewExecute(hview, 0);
338     if( r == ERROR_SUCCESS )
339         r = MsiViewClose(hview);
340     MsiCloseHandle(hview);
341     return r;
342 }
343
344 static UINT create_component_table( MSIHANDLE hdb )
345 {
346     return run_query( hdb,
347             "CREATE TABLE `Component` ( "
348             "`Component` CHAR(72) NOT NULL, "
349             "`ComponentId` CHAR(38), "
350             "`Directory_` CHAR(72) NOT NULL, "
351             "`Attributes` SHORT NOT NULL, "
352             "`Condition` CHAR(255), "
353             "`KeyPath` CHAR(72) "
354             "PRIMARY KEY `Component`)" );
355 }
356
357 static UINT create_feature_table( MSIHANDLE hdb )
358 {
359     return run_query( hdb,
360             "CREATE TABLE `Feature` ( "
361             "`Feature` CHAR(38) NOT NULL, "
362             "`Feature_Parent` CHAR(38), "
363             "`Title` CHAR(64), "
364             "`Description` CHAR(255), "
365             "`Display` SHORT NOT NULL, "
366             "`Level` SHORT NOT NULL, "
367             "`Directory_` CHAR(72), "
368             "`Attributes` SHORT NOT NULL "
369             "PRIMARY KEY `Feature`)" );
370 }
371
372 static UINT create_feature_components_table( MSIHANDLE hdb )
373 {
374     return run_query( hdb,
375             "CREATE TABLE `FeatureComponents` ( "
376             "`Feature_` CHAR(38) NOT NULL, "
377             "`Component_` CHAR(72) NOT NULL "
378             "PRIMARY KEY `Feature_`, `Component_` )" );
379 }
380
381 static UINT create_file_table( MSIHANDLE hdb )
382 {
383     return run_query( hdb,
384             "CREATE TABLE `File` ("
385             "`File` CHAR(72) NOT NULL, "
386             "`Component_` CHAR(72) NOT NULL, "
387             "`FileName` CHAR(255) NOT NULL, "
388             "`FileSize` LONG NOT NULL, "
389             "`Version` CHAR(72), "
390             "`Language` CHAR(20), "
391             "`Attributes` SHORT, "
392             "`Sequence` SHORT NOT NULL "
393             "PRIMARY KEY `File`)" );
394 }
395
396 static UINT create_remove_file_table( MSIHANDLE hdb )
397 {
398     return run_query( hdb,
399             "CREATE TABLE `RemoveFile` ("
400             "`FileKey` CHAR(72) NOT NULL, "
401             "`Component_` CHAR(72) NOT NULL, "
402             "`FileName` CHAR(255) LOCALIZABLE, "
403             "`DirProperty` CHAR(72) NOT NULL, "
404             "`InstallMode` SHORT NOT NULL "
405             "PRIMARY KEY `FileKey`)" );
406 }
407
408 static UINT create_appsearch_table( MSIHANDLE hdb )
409 {
410     return run_query( hdb,
411             "CREATE TABLE `AppSearch` ("
412             "`Property` CHAR(72) NOT NULL, "
413             "`Signature_` CHAR(72) NOT NULL "
414             "PRIMARY KEY `Property`, `Signature_`)" );
415 }
416
417 static UINT create_reglocator_table( MSIHANDLE hdb )
418 {
419     return run_query( hdb,
420             "CREATE TABLE `RegLocator` ("
421             "`Signature_` CHAR(72) NOT NULL, "
422             "`Root` SHORT NOT NULL, "
423             "`Key` CHAR(255) NOT NULL, "
424             "`Name` CHAR(255), "
425             "`Type` SHORT "
426             "PRIMARY KEY `Signature_`)" );
427 }
428
429 static UINT create_signature_table( MSIHANDLE hdb )
430 {
431     return run_query( hdb,
432             "CREATE TABLE `Signature` ("
433             "`Signature` CHAR(72) NOT NULL, "
434             "`FileName` CHAR(255) NOT NULL, "
435             "`MinVersion` CHAR(20), "
436             "`MaxVersion` CHAR(20), "
437             "`MinSize` LONG, "
438             "`MaxSize` LONG, "
439             "`MinDate` LONG, "
440             "`MaxDate` LONG, "
441             "`Languages` CHAR(255) "
442             "PRIMARY KEY `Signature`)" );
443 }
444
445 static UINT create_launchcondition_table( MSIHANDLE hdb )
446 {
447     return run_query( hdb,
448             "CREATE TABLE `LaunchCondition` ("
449             "`Condition` CHAR(255) NOT NULL, "
450             "`Description` CHAR(255) NOT NULL "
451             "PRIMARY KEY `Condition`)" );
452 }
453
454 static UINT create_property_table( MSIHANDLE hdb )
455 {
456     return run_query( hdb,
457             "CREATE TABLE `Property` ("
458             "`Property` CHAR(72) NOT NULL, "
459             "`Value` CHAR(0) "
460             "PRIMARY KEY `Property`)" );
461 }
462
463 static UINT create_install_execute_sequence_table( MSIHANDLE hdb )
464 {
465     return run_query( hdb,
466             "CREATE TABLE `InstallExecuteSequence` ("
467             "`Action` CHAR(72) NOT NULL, "
468             "`Condition` CHAR(255), "
469             "`Sequence` SHORT "
470             "PRIMARY KEY `Action`)" );
471 }
472
473 static UINT create_media_table( MSIHANDLE hdb )
474 {
475     return run_query( hdb,
476             "CREATE TABLE `Media` ("
477             "`DiskId` SHORT NOT NULL, "
478             "`LastSequence` SHORT NOT NULL, "
479             "`DiskPrompt` CHAR(64), "
480             "`Cabinet` CHAR(255), "
481             "`VolumeLabel` CHAR(32), "
482             "`Source` CHAR(72) "
483             "PRIMARY KEY `DiskId`)" );
484 }
485
486 static UINT create_ccpsearch_table( MSIHANDLE hdb )
487 {
488     return run_query( hdb,
489             "CREATE TABLE `CCPSearch` ("
490             "`Signature_` CHAR(72) NOT NULL "
491             "PRIMARY KEY `Signature_`)" );
492 }
493
494 static UINT create_drlocator_table( MSIHANDLE hdb )
495 {
496     return run_query( hdb,
497             "CREATE TABLE `DrLocator` ("
498             "`Signature_` CHAR(72) NOT NULL, "
499             "`Parent` CHAR(72), "
500             "`Path` CHAR(255), "
501             "`Depth` SHORT "
502             "PRIMARY KEY `Signature_`, `Parent`, `Path`)" );
503 }
504
505 static UINT create_complocator_table( MSIHANDLE hdb )
506 {
507     return run_query( hdb,
508             "CREATE TABLE `CompLocator` ("
509             "`Signature_` CHAR(72) NOT NULL, "
510             "`ComponentId` CHAR(38) NOT NULL, "
511             "`Type` SHORT "
512             "PRIMARY KEY `Signature_`)" );
513 }
514
515 static UINT create_inilocator_table( MSIHANDLE hdb )
516 {
517     return run_query( hdb,
518             "CREATE TABLE `IniLocator` ("
519             "`Signature_` CHAR(72) NOT NULL, "
520             "`FileName` CHAR(255) NOT NULL, "
521             "`Section` CHAR(96)NOT NULL, "
522             "`Key` CHAR(128)NOT NULL, "
523             "`Field` SHORT, "
524             "`Type` SHORT "
525             "PRIMARY KEY `Signature_`)" );
526 }
527
528 #define make_add_entry(type, qtext) \
529     static UINT add##_##type##_##entry( MSIHANDLE hdb, const char *values ) \
530     { \
531         char insert[] = qtext; \
532         char *query; \
533         UINT sz, r; \
534         sz = strlen(values) + sizeof insert; \
535         query = HeapAlloc(GetProcessHeap(),0,sz); \
536         sprintf(query,insert,values); \
537         r = run_query( hdb, query ); \
538         HeapFree(GetProcessHeap(), 0, query); \
539         return r; \
540     }
541
542 make_add_entry(component,
543                "INSERT INTO `Component`  "
544                "(`Component`, `ComponentId`, `Directory_`, "
545                "`Attributes`, `Condition`, `KeyPath`) VALUES( %s )")
546
547 make_add_entry(directory,
548                "INSERT INTO `Directory` "
549                "(`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )")
550
551 make_add_entry(feature,
552                "INSERT INTO `Feature` "
553                "(`Feature`, `Feature_Parent`, `Title`, `Description`, "
554                "`Display`, `Level`, `Directory_`, `Attributes`) VALUES( %s )")
555
556 make_add_entry(feature_components,
557                "INSERT INTO `FeatureComponents` "
558                "(`Feature_`, `Component_`) VALUES( %s )")
559
560 make_add_entry(file,
561                "INSERT INTO `File` "
562                "(`File`, `Component_`, `FileName`, `FileSize`, "
563                "`Version`, `Language`, `Attributes`, `Sequence`) VALUES( %s )")
564
565 make_add_entry(appsearch,
566                "INSERT INTO `AppSearch` "
567                "(`Property`, `Signature_`) VALUES( %s )")
568
569 make_add_entry(reglocator,
570                "INSERT INTO `RegLocator` "
571                "(`Signature_`, `Root`, `Key`, `Name`, `Type`) VALUES( %s )")
572
573 make_add_entry(signature,
574                "INSERT INTO `Signature` "
575                "(`Signature`, `FileName`, `MinVersion`, `MaxVersion`,"
576                " `MinSize`, `MaxSize`, `MinDate`, `MaxDate`, `Languages`) "
577                "VALUES( %s )")
578
579 make_add_entry(launchcondition,
580                "INSERT INTO `LaunchCondition` "
581                "(`Condition`, `Description`) VALUES( %s )")
582
583 make_add_entry(property,
584                "INSERT INTO `Property` (`Property`, `Value`) VALUES( %s )")
585
586 make_add_entry(install_execute_sequence,
587                "INSERT INTO `InstallExecuteSequence` "
588                "(`Action`, `Condition`, `Sequence`) VALUES( %s )")
589
590 make_add_entry(media,
591                "INSERT INTO `Media` "
592                "(`DiskId`, `LastSequence`, `DiskPrompt`, "
593                "`Cabinet`, `VolumeLabel`, `Source`) VALUES( %s )")
594
595 make_add_entry(ccpsearch,
596                "INSERT INTO `CCPSearch` (`Signature_`) VALUES( %s )")
597
598 make_add_entry(drlocator,
599                "INSERT INTO `DrLocator` "
600                "(`Signature_`, `Parent`, `Path`, `Depth`) VALUES( %s )")
601
602 make_add_entry(complocator,
603                "INSERT INTO `CompLocator` "
604                "(`Signature_`, `ComponentId`, `Type`) VALUES( %s )")
605
606 make_add_entry(inilocator,
607                "INSERT INTO `IniLocator` "
608                "(`Signature_`, `FileName`, `Section`, `Key`, `Field`, `Type`) "
609                "VALUES( %s )")
610
611 static UINT set_summary_info(MSIHANDLE hdb)
612 {
613     UINT res;
614     MSIHANDLE suminfo;
615
616     /* build summary info */
617     res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo);
618     ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
619
620     res = MsiSummaryInfoSetProperty(suminfo,2, VT_LPSTR, 0,NULL,
621                         "Installation Database");
622     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
623
624     res = MsiSummaryInfoSetProperty(suminfo,3, VT_LPSTR, 0,NULL,
625                         "Installation Database");
626     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
627
628     res = MsiSummaryInfoSetProperty(suminfo,4, VT_LPSTR, 0,NULL,
629                         "Wine Hackers");
630     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
631
632     res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL,
633                     ";1033");
634     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
635
636     res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL,
637                     "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
638     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
639
640     res = MsiSummaryInfoSetProperty(suminfo, 14, VT_I4, 100, NULL, NULL);
641     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
642
643     res = MsiSummaryInfoSetProperty(suminfo, 15, VT_I4, 0, NULL, NULL);
644     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
645
646     res = MsiSummaryInfoPersist(suminfo);
647     ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
648
649     res = MsiCloseHandle( suminfo);
650     ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
651
652     return res;
653 }
654
655
656 static MSIHANDLE create_package_db(void)
657 {
658     MSIHANDLE hdb = 0;
659     UINT res;
660
661     DeleteFile(msifile);
662
663     /* create an empty database */
664     res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb );
665     ok( res == ERROR_SUCCESS , "Failed to create database\n" );
666     if( res != ERROR_SUCCESS )
667         return hdb;
668
669     res = MsiDatabaseCommit( hdb );
670     ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
671
672     res = set_summary_info(hdb);
673
674     res = run_query( hdb,
675             "CREATE TABLE `Directory` ( "
676             "`Directory` CHAR(255) NOT NULL, "
677             "`Directory_Parent` CHAR(255), "
678             "`DefaultDir` CHAR(255) NOT NULL "
679             "PRIMARY KEY `Directory`)" );
680     ok( res == ERROR_SUCCESS , "Failed to create directory table\n" );
681
682     return hdb;
683 }
684
685 static MSIHANDLE package_from_db(MSIHANDLE hdb)
686 {
687     UINT res;
688     CHAR szPackage[10];
689     MSIHANDLE hPackage;
690
691     sprintf(szPackage,"#%i",hdb);
692     res = MsiOpenPackage(szPackage,&hPackage);
693     if (res != ERROR_SUCCESS)
694         return 0;
695
696     res = MsiCloseHandle(hdb);
697     if (res != ERROR_SUCCESS)
698         return 0;
699
700     return hPackage;
701 }
702
703 static void create_test_file(const CHAR *name)
704 {
705     HANDLE file;
706     DWORD written;
707
708     file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
709     ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
710     WriteFile(file, name, strlen(name), &written, NULL);
711     WriteFile(file, "\n", strlen("\n"), &written, NULL);
712     CloseHandle(file);
713 }
714
715 typedef struct _tagVS_VERSIONINFO
716 {
717     WORD wLength;
718     WORD wValueLength;
719     WORD wType;
720     WCHAR szKey[1];
721     WORD wPadding1[1];
722     VS_FIXEDFILEINFO Value;
723     WORD wPadding2[1];
724     WORD wChildren[1];
725 } VS_VERSIONINFO;
726
727 #define roundoffs(a, b, r) (((BYTE *)(b) - (BYTE *)(a) + ((r) - 1)) & ~((r) - 1))
728 #define roundpos(a, b, r) (((BYTE *)(a)) + roundoffs(a, b, r))
729
730 static BOOL create_file_with_version(const CHAR *name, LONG ms, LONG ls)
731 {
732     VS_VERSIONINFO *pVerInfo;
733     VS_FIXEDFILEINFO *pFixedInfo;
734     LPBYTE buffer, ofs;
735     CHAR path[MAX_PATH];
736     DWORD handle, size;
737     HANDLE resource;
738     BOOL ret = FALSE;
739
740     GetSystemDirectory(path, MAX_PATH);
741     lstrcatA(path, "\\kernel32.dll");
742
743     CopyFileA(path, name, FALSE);
744
745     size = GetFileVersionInfoSize(path, &handle);
746     buffer = HeapAlloc(GetProcessHeap(), 0, size);
747
748     GetFileVersionInfoA(path, 0, size, buffer);
749
750     pVerInfo = (VS_VERSIONINFO *)buffer;
751     ofs = (BYTE *)&pVerInfo->szKey[lstrlenW(pVerInfo->szKey) + 1];
752     pFixedInfo = (VS_FIXEDFILEINFO *)roundpos(pVerInfo, ofs, 4);
753
754     pFixedInfo->dwFileVersionMS = ms;
755     pFixedInfo->dwFileVersionLS = ls;
756     pFixedInfo->dwProductVersionMS = ms;
757     pFixedInfo->dwProductVersionLS = ls;
758
759     resource = BeginUpdateResource(name, FALSE);
760     if (!resource)
761         goto done;
762
763     if (!UpdateResource(resource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO),
764                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), buffer, size))
765         goto done;
766
767     if (!EndUpdateResource(resource, FALSE))
768         goto done;
769
770     ret = TRUE;
771
772 done:
773     HeapFree(GetProcessHeap(), 0, buffer);
774     return ret;
775 }
776
777 static void test_createpackage(void)
778 {
779     MSIHANDLE hPackage = 0;
780     UINT res;
781
782     hPackage = package_from_db(create_package_db());
783     ok( hPackage != 0, " Failed to create package\n");
784
785     res = MsiCloseHandle( hPackage);
786     ok( res == ERROR_SUCCESS , "Failed to close package\n" );
787     DeleteFile(msifile);
788 }
789
790 static void test_doaction( void )
791 {
792     MSIHANDLE hpkg;
793     UINT r;
794
795     r = MsiDoAction( -1, NULL );
796     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
797
798     hpkg = package_from_db(create_package_db());
799     ok( hpkg, "failed to create package\n");
800
801     r = MsiDoAction(hpkg, NULL);
802     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
803
804     r = MsiDoAction(0, "boo");
805     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
806
807     r = MsiDoAction(hpkg, "boo");
808     ok( r == ERROR_FUNCTION_NOT_CALLED, "wrong return val\n");
809
810     MsiCloseHandle( hpkg );
811     DeleteFile(msifile);
812 }
813
814 static void test_gettargetpath_bad(void)
815 {
816     char buffer[0x80];
817     MSIHANDLE hpkg;
818     DWORD sz;
819     UINT r;
820
821     hpkg = package_from_db(create_package_db());
822     ok( hpkg, "failed to create package\n");
823
824     r = MsiGetTargetPath( 0, NULL, NULL, NULL );
825     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
826
827     r = MsiGetTargetPath( 0, NULL, NULL, &sz );
828     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
829
830     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
831     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
832
833     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
834     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
835
836     r = MsiGetTargetPath( hpkg, "boo", NULL, NULL );
837     ok( r == ERROR_DIRECTORY, "wrong return val\n");
838
839     r = MsiGetTargetPath( hpkg, "boo", buffer, NULL );
840     ok( r == ERROR_DIRECTORY, "wrong return val\n");
841
842     MsiCloseHandle( hpkg );
843     DeleteFile(msifile);
844 }
845
846 static void query_file_path(MSIHANDLE hpkg, LPCSTR file, LPSTR buff)
847 {
848     UINT r;
849     DWORD size;
850     MSIHANDLE rec;
851
852     rec = MsiCreateRecord( 1 );
853     ok(rec, "MsiCreate record failed\n");
854
855     r = MsiRecordSetString( rec, 0, file );
856     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
857
858     size = MAX_PATH;
859     r = MsiFormatRecord( hpkg, rec, buff, &size );
860     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
861
862     MsiCloseHandle( rec );
863 }
864
865 static void test_settargetpath(void)
866 {
867     char tempdir[MAX_PATH+8], buffer[MAX_PATH], file[MAX_PATH];
868     DWORD sz;
869     MSIHANDLE hpkg;
870     UINT r;
871     MSIHANDLE hdb;
872
873     hdb = create_package_db();
874     ok ( hdb, "failed to create package database\n" );
875
876     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" );
877     ok( r == S_OK, "failed to add directory entry: %d\n" , r );
878
879     r = create_component_table( hdb );
880     ok( r == S_OK, "cannot create Component table: %d\n", r );
881
882     r = add_component_entry( hdb, "'RootComp', '{83e2694d-0864-4124-9323-6d37630912a1}', 'TARGETDIR', 8, '', 'RootFile'" );
883     ok( r == S_OK, "cannot add dummy component: %d\n", r );
884
885     r = add_component_entry( hdb, "'TestComp', '{A3FB59C8-C293-4F7E-B8C5-F0E1D8EEE4E5}', 'TestDir', 0, '', 'TestFile'" );
886     ok( r == S_OK, "cannot add test component: %d\n", r );
887
888     r = create_feature_table( hdb );
889     ok( r == S_OK, "cannot create Feature table: %d\n", r );
890
891     r = add_feature_entry( hdb, "'TestFeature', '', '', '', 0, 1, '', 0" );
892     ok( r == ERROR_SUCCESS, "cannot add TestFeature to Feature table: %d\n", r );
893
894     r = create_feature_components_table( hdb );
895     ok( r == S_OK, "cannot create FeatureComponents table: %d\n", r );
896
897     r = add_feature_components_entry( hdb, "'TestFeature', 'RootComp'" );
898     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
899
900     r = add_feature_components_entry( hdb, "'TestFeature', 'TestComp'" );
901     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
902
903     add_directory_entry( hdb, "'TestParent', 'TARGETDIR', 'TestParent'" );
904     add_directory_entry( hdb, "'TestDir', 'TestParent', 'TestDir'" );
905
906     r = create_file_table( hdb );
907     ok( r == S_OK, "cannot create File table: %d\n", r );
908
909     r = add_file_entry( hdb, "'RootFile', 'RootComp', 'rootfile.txt', 0, '', '1033', 8192, 1" );
910     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
911
912     r = add_file_entry( hdb, "'TestFile', 'TestComp', 'testfile.txt', 0, '', '1033', 8192, 1" );
913     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
914
915     hpkg = package_from_db( hdb );
916     ok( hpkg, "failed to create package\n");
917
918     r = MsiDoAction( hpkg, "CostInitialize");
919     ok( r == ERROR_SUCCESS, "cost init failed\n");
920
921     r = MsiDoAction( hpkg, "FileCost");
922     ok( r == ERROR_SUCCESS, "file cost failed\n");
923
924     r = MsiDoAction( hpkg, "CostFinalize");
925     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
926
927     r = MsiSetTargetPath( 0, NULL, NULL );
928     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
929
930     r = MsiSetTargetPath( 0, "boo", "C:\\bogusx" );
931     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
932
933     r = MsiSetTargetPath( hpkg, "boo", NULL );
934     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
935
936     r = MsiSetTargetPath( hpkg, "boo", "c:\\bogusx" );
937     ok( r == ERROR_DIRECTORY, "wrong return val\n");
938
939     sz = sizeof tempdir - 1;
940     r = MsiGetTargetPath( hpkg, "TARGETDIR", tempdir, &sz );
941     sprintf( file, "%srootfile.txt", tempdir );
942     query_file_path( hpkg, "[#RootFile]", buffer );
943     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
944     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer );
945
946     GetTempFileName( tempdir, "_wt", 0, buffer );
947     sprintf( tempdir, "%s\\subdir", buffer );
948
949     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
950     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
951         "MsiSetTargetPath on file returned %d\n", r );
952
953     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
954     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
955         "MsiSetTargetPath on 'subdir' of file returned %d\n", r );
956
957     DeleteFile( buffer );
958
959     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
960     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
961
962     r = GetFileAttributes( buffer );
963     ok ( r == INVALID_FILE_ATTRIBUTES, "file/directory exists after MsiSetTargetPath. Attributes: %08X\n", r );
964
965     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
966     ok( r == ERROR_SUCCESS, "MsiSetTargetPath on subsubdir returned %d\n", r );
967
968     sz = sizeof buffer - 1;
969     lstrcat( tempdir, "\\" );
970     r = MsiGetTargetPath( hpkg, "TARGETDIR", buffer, &sz );
971     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
972     ok( !lstrcmp(buffer, tempdir), "Expected %s, got %s\n", tempdir, buffer);
973
974     sprintf( file, "%srootfile.txt", tempdir );
975     query_file_path( hpkg, "[#RootFile]", buffer );
976     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer);
977
978     r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two" );
979     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
980
981     query_file_path( hpkg, "[#TestFile]", buffer );
982     ok( !lstrcmp(buffer, "C:\\one\\two\\TestDir\\testfile.txt"),
983         "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer );
984
985     sz = sizeof buffer - 1;
986     r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz );
987     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
988     ok( !lstrcmp(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer);
989
990     MsiCloseHandle( hpkg );
991 }
992
993 static void test_condition(void)
994 {
995     MSICONDITION r;
996     MSIHANDLE hpkg;
997
998     hpkg = package_from_db(create_package_db());
999     ok( hpkg, "failed to create package\n");
1000
1001     r = MsiEvaluateCondition(0, NULL);
1002     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1003
1004     r = MsiEvaluateCondition(hpkg, NULL);
1005     ok( r == MSICONDITION_NONE, "wrong return val\n");
1006
1007     r = MsiEvaluateCondition(hpkg, "");
1008     ok( r == MSICONDITION_NONE, "wrong return val\n");
1009
1010     r = MsiEvaluateCondition(hpkg, "1");
1011     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1012
1013     r = MsiEvaluateCondition(hpkg, "0");
1014     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1015
1016     r = MsiEvaluateCondition(hpkg, "-1");
1017     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1018
1019     r = MsiEvaluateCondition(hpkg, "0 = 0");
1020     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1021
1022     r = MsiEvaluateCondition(hpkg, "0 <> 0");
1023     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1024
1025     r = MsiEvaluateCondition(hpkg, "0 = 1");
1026     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1027
1028     r = MsiEvaluateCondition(hpkg, "0 > 1");
1029     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1030
1031     r = MsiEvaluateCondition(hpkg, "0 ~> 1");
1032     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1033
1034     r = MsiEvaluateCondition(hpkg, "1 > 1");
1035     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1036
1037     r = MsiEvaluateCondition(hpkg, "1 ~> 1");
1038     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1039
1040     r = MsiEvaluateCondition(hpkg, "0 >= 1");
1041     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1042
1043     r = MsiEvaluateCondition(hpkg, "0 ~>= 1");
1044     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1045
1046     r = MsiEvaluateCondition(hpkg, "1 >= 1");
1047     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1048
1049     r = MsiEvaluateCondition(hpkg, "1 ~>= 1");
1050     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1051
1052     r = MsiEvaluateCondition(hpkg, "0 < 1");
1053     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1054
1055     r = MsiEvaluateCondition(hpkg, "0 ~< 1");
1056     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1057
1058     r = MsiEvaluateCondition(hpkg, "1 < 1");
1059     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1060
1061     r = MsiEvaluateCondition(hpkg, "1 ~< 1");
1062     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1063
1064     r = MsiEvaluateCondition(hpkg, "0 <= 1");
1065     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1066
1067     r = MsiEvaluateCondition(hpkg, "0 ~<= 1");
1068     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1069
1070     r = MsiEvaluateCondition(hpkg, "1 <= 1");
1071     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1072
1073     r = MsiEvaluateCondition(hpkg, "1 ~<= 1");
1074     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1075
1076     r = MsiEvaluateCondition(hpkg, "0 >=");
1077     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1078
1079     r = MsiEvaluateCondition(hpkg, " ");
1080     ok( r == MSICONDITION_NONE, "wrong return val\n");
1081
1082     r = MsiEvaluateCondition(hpkg, "LicView <> \"1\"");
1083     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1084
1085     r = MsiEvaluateCondition(hpkg, "LicView <> \"0\"");
1086     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1087
1088     r = MsiEvaluateCondition(hpkg, "LicView <> LicView");
1089     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1090
1091     r = MsiEvaluateCondition(hpkg, "not 0");
1092     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1093
1094     r = MsiEvaluateCondition(hpkg, "not LicView");
1095     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1096
1097     r = MsiEvaluateCondition(hpkg, "\"Testing\" ~<< \"Testing\"");
1098     ok (r == MSICONDITION_TRUE, "wrong return val\n");
1099
1100     r = MsiEvaluateCondition(hpkg, "LicView ~<< \"Testing\"");
1101     ok (r == MSICONDITION_FALSE, "wrong return val\n");
1102
1103     r = MsiEvaluateCondition(hpkg, "Not LicView ~<< \"Testing\"");
1104     ok (r == MSICONDITION_TRUE, "wrong return val\n");
1105
1106     r = MsiEvaluateCondition(hpkg, "not \"A\"");
1107     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1108
1109     r = MsiEvaluateCondition(hpkg, "~not \"A\"");
1110     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1111
1112     r = MsiEvaluateCondition(hpkg, "\"0\"");
1113     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1114
1115     r = MsiEvaluateCondition(hpkg, "1 and 2");
1116     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1117
1118     r = MsiEvaluateCondition(hpkg, "not 0 and 3");
1119     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1120
1121     r = MsiEvaluateCondition(hpkg, "not 0 and 0");
1122     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1123
1124     r = MsiEvaluateCondition(hpkg, "not 0 or 1");
1125     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1126
1127     r = MsiEvaluateCondition(hpkg, "(0)");
1128     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1129
1130     r = MsiEvaluateCondition(hpkg, "(((((1))))))");
1131     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1132
1133     r = MsiEvaluateCondition(hpkg, "(((((1)))))");
1134     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1135
1136     r = MsiEvaluateCondition(hpkg, " \"A\" < \"B\" ");
1137     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1138
1139     r = MsiEvaluateCondition(hpkg, " \"A\" > \"B\" ");
1140     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1141
1142     r = MsiEvaluateCondition(hpkg, " \"1\" > \"12\" ");
1143     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1144
1145     r = MsiEvaluateCondition(hpkg, " \"100\" < \"21\" ");
1146     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1147
1148     r = MsiEvaluateCondition(hpkg, "0 < > 0");
1149     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1150
1151     r = MsiEvaluateCondition(hpkg, "(1<<1) == 2");
1152     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1153
1154     r = MsiEvaluateCondition(hpkg, " \"A\" = \"a\" ");
1155     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1156
1157     r = MsiEvaluateCondition(hpkg, " \"A\" ~ = \"a\" ");
1158     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1159
1160     r = MsiEvaluateCondition(hpkg, " \"A\" ~= \"a\" ");
1161     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1162
1163     r = MsiEvaluateCondition(hpkg, " \"A\" ~= 1 ");
1164     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1165
1166     r = MsiEvaluateCondition(hpkg, " \"A\" = 1 ");
1167     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1168
1169     r = MsiEvaluateCondition(hpkg, " 1 ~= 1 ");
1170     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1171
1172     r = MsiEvaluateCondition(hpkg, " 1 ~= \"1\" ");
1173     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1174
1175     r = MsiEvaluateCondition(hpkg, " 1 = \"1\" ");
1176     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1177
1178     r = MsiEvaluateCondition(hpkg, " 0 = \"1\" ");
1179     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1180
1181     r = MsiEvaluateCondition(hpkg, " 0 < \"100\" ");
1182     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1183
1184     r = MsiEvaluateCondition(hpkg, " 100 > \"0\" ");
1185     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1186
1187     r = MsiEvaluateCondition(hpkg, "1 XOR 1");
1188     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1189
1190     r = MsiEvaluateCondition(hpkg, "1 IMP 1");
1191     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1192
1193     r = MsiEvaluateCondition(hpkg, "1 IMP 0");
1194     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1195
1196     r = MsiEvaluateCondition(hpkg, "0 IMP 0");
1197     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1198
1199     r = MsiEvaluateCondition(hpkg, "0 EQV 0");
1200     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1201
1202     r = MsiEvaluateCondition(hpkg, "0 EQV 1");
1203     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1204
1205     r = MsiEvaluateCondition(hpkg, "1 IMP 1 OR 0");
1206     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1207
1208     r = MsiEvaluateCondition(hpkg, "1 IMPL 1");
1209     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1210
1211     r = MsiEvaluateCondition(hpkg, "\"ASFD\" >< \"S\" ");
1212     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1213
1214     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"s\" ");
1215     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1216
1217     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"\" ");
1218     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1219
1220     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"sss\" ");
1221     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1222
1223     MsiSetProperty(hpkg, "mm", "5" );
1224
1225     r = MsiEvaluateCondition(hpkg, "mm = 5");
1226     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1227
1228     r = MsiEvaluateCondition(hpkg, "mm < 6");
1229     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1230
1231     r = MsiEvaluateCondition(hpkg, "mm <= 5");
1232     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1233
1234     r = MsiEvaluateCondition(hpkg, "mm > 4");
1235     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1236
1237     r = MsiEvaluateCondition(hpkg, "mm < 12");
1238     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1239
1240     r = MsiEvaluateCondition(hpkg, "mm = \"5\"");
1241     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1242
1243     r = MsiEvaluateCondition(hpkg, "0 = \"\"");
1244     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1245
1246     r = MsiEvaluateCondition(hpkg, "0 AND \"\"");
1247     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1248
1249     r = MsiEvaluateCondition(hpkg, "1 AND \"\"");
1250     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1251
1252     r = MsiEvaluateCondition(hpkg, "1 AND \"1\"");
1253     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1254
1255     r = MsiEvaluateCondition(hpkg, "3 >< 1");
1256     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1257
1258     r = MsiEvaluateCondition(hpkg, "3 >< 4");
1259     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1260
1261     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 0");
1262     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1263
1264     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1");
1265     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1266
1267     r = MsiEvaluateCondition(hpkg, "NOT 1 OR 0");
1268     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1269
1270     r = MsiEvaluateCondition(hpkg, "0 AND 1 OR 1");
1271     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1272
1273     r = MsiEvaluateCondition(hpkg, "0 AND 0 OR 1");
1274     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1275
1276     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1 OR 0");
1277     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1278
1279     r = MsiEvaluateCondition(hpkg, "_1 = _1");
1280     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1281
1282     r = MsiEvaluateCondition(hpkg, "( 1 AND 1 ) = 2");
1283     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1284
1285     r = MsiEvaluateCondition(hpkg, "NOT ( 1 AND 1 )");
1286     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1287
1288     r = MsiEvaluateCondition(hpkg, "NOT A AND (BBBBBBBBBB=2 OR CCC=1) AND Ddddddddd");
1289     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1290
1291     r = MsiEvaluateCondition(hpkg, "Installed<>\"\"");
1292     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1293
1294     r = MsiEvaluateCondition(hpkg, "NOT 1 AND 0");
1295     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1296
1297     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1298     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1299
1300     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1301     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1302
1303     r = MsiEvaluateCondition(hpkg, "bandalmael<0");
1304     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1305
1306     r = MsiEvaluateCondition(hpkg, "bandalmael>0");
1307     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1308
1309     r = MsiEvaluateCondition(hpkg, "bandalmael>=0");
1310     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1311
1312     r = MsiEvaluateCondition(hpkg, "bandalmael<=0");
1313     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1314
1315     r = MsiEvaluateCondition(hpkg, "bandalmael~<>0");
1316     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1317
1318     MsiSetProperty(hpkg, "bandalmael", "0" );
1319     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1320     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1321
1322     MsiSetProperty(hpkg, "bandalmael", "" );
1323     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1324     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1325
1326     MsiSetProperty(hpkg, "bandalmael", "asdf" );
1327     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1328     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1329
1330     MsiSetProperty(hpkg, "bandalmael", "0asdf" );
1331     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1332     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1333
1334     MsiSetProperty(hpkg, "bandalmael", "0 " );
1335     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1336     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1337
1338     MsiSetProperty(hpkg, "bandalmael", "-0" );
1339     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1340     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1341
1342     MsiSetProperty(hpkg, "bandalmael", "0000000000000" );
1343     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1344     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1345
1346     MsiSetProperty(hpkg, "bandalmael", "--0" );
1347     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1348     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1349
1350     MsiSetProperty(hpkg, "bandalmael", "0x00" );
1351     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1352     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1353
1354     MsiSetProperty(hpkg, "bandalmael", "-" );
1355     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1356     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1357
1358     MsiSetProperty(hpkg, "bandalmael", "+0" );
1359     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1360     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1361
1362     MsiSetProperty(hpkg, "bandalmael", "0.0" );
1363     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1364     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1365     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1366     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1367
1368     MsiSetProperty(hpkg, "one", "hi");
1369     MsiSetProperty(hpkg, "two", "hithere");
1370     r = MsiEvaluateCondition(hpkg, "one >< two");
1371     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1372
1373     MsiSetProperty(hpkg, "one", "hithere");
1374     MsiSetProperty(hpkg, "two", "hi");
1375     r = MsiEvaluateCondition(hpkg, "one >< two");
1376     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1377
1378     MsiSetProperty(hpkg, "one", "hello");
1379     MsiSetProperty(hpkg, "two", "hi");
1380     r = MsiEvaluateCondition(hpkg, "one >< two");
1381     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1382
1383     MsiSetProperty(hpkg, "one", "hellohithere");
1384     MsiSetProperty(hpkg, "two", "hi");
1385     r = MsiEvaluateCondition(hpkg, "one >< two");
1386     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1387
1388     MsiSetProperty(hpkg, "one", "");
1389     MsiSetProperty(hpkg, "two", "hi");
1390     r = MsiEvaluateCondition(hpkg, "one >< two");
1391     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1392
1393     MsiSetProperty(hpkg, "one", "hi");
1394     MsiSetProperty(hpkg, "two", "");
1395     r = MsiEvaluateCondition(hpkg, "one >< two");
1396     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1397
1398     MsiSetProperty(hpkg, "one", "");
1399     MsiSetProperty(hpkg, "two", "");
1400     r = MsiEvaluateCondition(hpkg, "one >< two");
1401     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1402
1403     MsiSetProperty(hpkg, "one", "1234");
1404     MsiSetProperty(hpkg, "two", "1");
1405     r = MsiEvaluateCondition(hpkg, "one >< two");
1406     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1407
1408     MsiSetProperty(hpkg, "one", "one 1234");
1409     MsiSetProperty(hpkg, "two", "1");
1410     r = MsiEvaluateCondition(hpkg, "one >< two");
1411     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1412
1413     MsiSetProperty(hpkg, "one", "hithere");
1414     MsiSetProperty(hpkg, "two", "hi");
1415     r = MsiEvaluateCondition(hpkg, "one << two");
1416     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1417
1418     MsiSetProperty(hpkg, "one", "hi");
1419     MsiSetProperty(hpkg, "two", "hithere");
1420     r = MsiEvaluateCondition(hpkg, "one << two");
1421     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1422
1423     MsiSetProperty(hpkg, "one", "hi");
1424     MsiSetProperty(hpkg, "two", "hi");
1425     r = MsiEvaluateCondition(hpkg, "one << two");
1426     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1427
1428     MsiSetProperty(hpkg, "one", "abcdhithere");
1429     MsiSetProperty(hpkg, "two", "hi");
1430     r = MsiEvaluateCondition(hpkg, "one << two");
1431     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1432
1433     MsiSetProperty(hpkg, "one", "");
1434     MsiSetProperty(hpkg, "two", "hi");
1435     r = MsiEvaluateCondition(hpkg, "one << two");
1436     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1437
1438     MsiSetProperty(hpkg, "one", "hithere");
1439     MsiSetProperty(hpkg, "two", "");
1440     r = MsiEvaluateCondition(hpkg, "one << two");
1441     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1442
1443     MsiSetProperty(hpkg, "one", "");
1444     MsiSetProperty(hpkg, "two", "");
1445     r = MsiEvaluateCondition(hpkg, "one << two");
1446     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1447
1448     MsiSetProperty(hpkg, "one", "1234");
1449     MsiSetProperty(hpkg, "two", "1");
1450     r = MsiEvaluateCondition(hpkg, "one << two");
1451     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1452
1453     MsiSetProperty(hpkg, "one", "1234 one");
1454     MsiSetProperty(hpkg, "two", "1");
1455     r = MsiEvaluateCondition(hpkg, "one << two");
1456     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1457
1458     MsiSetProperty(hpkg, "one", "hithere");
1459     MsiSetProperty(hpkg, "two", "there");
1460     r = MsiEvaluateCondition(hpkg, "one >> two");
1461     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1462
1463     MsiSetProperty(hpkg, "one", "hithere");
1464     MsiSetProperty(hpkg, "two", "hi");
1465     r = MsiEvaluateCondition(hpkg, "one >> two");
1466     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1467
1468     MsiSetProperty(hpkg, "one", "there");
1469     MsiSetProperty(hpkg, "two", "hithere");
1470     r = MsiEvaluateCondition(hpkg, "one >> two");
1471     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1472
1473     MsiSetProperty(hpkg, "one", "there");
1474     MsiSetProperty(hpkg, "two", "there");
1475     r = MsiEvaluateCondition(hpkg, "one >> two");
1476     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1477
1478     MsiSetProperty(hpkg, "one", "abcdhithere");
1479     MsiSetProperty(hpkg, "two", "hi");
1480     r = MsiEvaluateCondition(hpkg, "one >> two");
1481     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1482
1483     MsiSetProperty(hpkg, "one", "");
1484     MsiSetProperty(hpkg, "two", "there");
1485     r = MsiEvaluateCondition(hpkg, "one >> two");
1486     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1487
1488     MsiSetProperty(hpkg, "one", "there");
1489     MsiSetProperty(hpkg, "two", "");
1490     r = MsiEvaluateCondition(hpkg, "one >> two");
1491     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1492
1493     MsiSetProperty(hpkg, "one", "");
1494     MsiSetProperty(hpkg, "two", "");
1495     r = MsiEvaluateCondition(hpkg, "one >> two");
1496     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1497
1498     MsiSetProperty(hpkg, "one", "1234");
1499     MsiSetProperty(hpkg, "two", "4");
1500     r = MsiEvaluateCondition(hpkg, "one >> two");
1501     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1502
1503     MsiSetProperty(hpkg, "one", "one 1234");
1504     MsiSetProperty(hpkg, "two", "4");
1505     r = MsiEvaluateCondition(hpkg, "one >> two");
1506     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1507
1508     MsiSetProperty(hpkg, "MsiNetAssemblySupport", NULL);  /* make sure it's empty */
1509
1510     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1511     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1512
1513     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport > \"1.1.4322\"");
1514     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1515
1516     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport >= \"1.1.4322\"");
1517     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1518
1519     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <= \"1.1.4322\"");
1520     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1521
1522     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <> \"1.1.4322\"");
1523     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1524
1525     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport ~< \"1.1.4322\"");
1526     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1527
1528     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"abcd\"");
1529     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1530
1531     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a1.1.4322\"");
1532     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1533
1534     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322a\"");
1535     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1536
1537     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0000001.1.4322\"");
1538     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1539
1540     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1\"");
1541     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1542
1543     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1.1\"");
1544     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1545
1546     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1");
1547     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1548
1549     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1\"");
1550     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1551
1552     r = MsiEvaluateCondition(hpkg, "\"2\" < \"12.1\"");
1553     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1554
1555     r = MsiEvaluateCondition(hpkg, "\"02.1\" < \"2.11\"");
1556     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1557
1558     r = MsiEvaluateCondition(hpkg, "\"02.1.1\" < \"2.1\"");
1559     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1560
1561     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1562     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1563
1564     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1565     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1566
1567     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0\"");
1568     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1569
1570     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"-1\"");
1571     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1572
1573     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a\"");
1574     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1575
1576     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1577     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1578
1579     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1580     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1581
1582     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"/\"");
1583     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1584
1585     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \" \"");
1586     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1587
1588     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"azAZ_\"");
1589     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1590
1591     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]\"");
1592     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1593
1594     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]a\"");
1595     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1596
1597     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]\"");
1598     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1599
1600     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]a\"");
1601     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1602
1603     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a}\"");
1604     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1605
1606     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a\"");
1607     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1608
1609     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a\"");
1610     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1611
1612     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a{\"");
1613     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1614
1615     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a]\"");
1616     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1617
1618     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"A\"");
1619     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1620
1621     MsiSetProperty(hpkg, "MsiNetAssemblySupport", "1.1.4322");
1622     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1623     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1624
1625     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.14322\"");
1626     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1627
1628     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.5\"");
1629     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1630
1631     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1632     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1633
1634     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1635     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1636
1637     MsiSetProperty(hpkg, "one", "1");
1638     r = MsiEvaluateCondition(hpkg, "one < \"1\"");
1639     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1640
1641     MsiSetProperty(hpkg, "X", "5.0");
1642
1643     r = MsiEvaluateCondition(hpkg, "X != \"\"");
1644     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1645
1646     r = MsiEvaluateCondition(hpkg, "X =\"5.0\"");
1647     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1648
1649     r = MsiEvaluateCondition(hpkg, "X =\"5.1\"");
1650     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1651
1652     r = MsiEvaluateCondition(hpkg, "X =\"6.0\"");
1653     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1654
1655     r = MsiEvaluateCondition(hpkg, "X =\"5.0\" or X =\"5.1\" or X =\"6.0\"");
1656     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1657
1658     r = MsiEvaluateCondition(hpkg, "(X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1659     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1660
1661     r = MsiEvaluateCondition(hpkg, "X !=\"\" and (X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1662     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1663
1664     /* feature doesn't exist */
1665     r = MsiEvaluateCondition(hpkg, "&nofeature");
1666     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1667
1668     MsiSetProperty(hpkg, "A", "2");
1669     MsiSetProperty(hpkg, "X", "50");
1670
1671     r = MsiEvaluateCondition(hpkg, "2 <= X");
1672     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1673
1674     r = MsiEvaluateCondition(hpkg, "A <= X");
1675     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1676
1677     r = MsiEvaluateCondition(hpkg, "A <= 50");
1678     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1679
1680     MsiSetProperty(hpkg, "X", "50val");
1681
1682     r = MsiEvaluateCondition(hpkg, "2 <= X");
1683     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1684
1685     r = MsiEvaluateCondition(hpkg, "A <= X");
1686     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1687
1688     MsiSetProperty(hpkg, "A", "7");
1689     MsiSetProperty(hpkg, "X", "50");
1690
1691     r = MsiEvaluateCondition(hpkg, "7 <= X");
1692     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1693
1694     r = MsiEvaluateCondition(hpkg, "A <= X");
1695     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1696
1697     r = MsiEvaluateCondition(hpkg, "A <= 50");
1698     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1699
1700     MsiSetProperty(hpkg, "X", "50val");
1701
1702     r = MsiEvaluateCondition(hpkg, "2 <= X");
1703     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1704
1705     r = MsiEvaluateCondition(hpkg, "A <= X");
1706     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1707
1708     MsiCloseHandle( hpkg );
1709     DeleteFile(msifile);
1710 }
1711
1712 static BOOL check_prop_empty( MSIHANDLE hpkg, const char * prop)
1713 {
1714     UINT r;
1715     DWORD sz;
1716     char buffer[2];
1717
1718     sz = sizeof buffer;
1719     strcpy(buffer,"x");
1720     r = MsiGetProperty( hpkg, prop, buffer, &sz );
1721     return r == ERROR_SUCCESS && buffer[0] == 0 && sz == 0;
1722 }
1723
1724 static void test_props(void)
1725 {
1726     MSIHANDLE hpkg, hdb;
1727     UINT r;
1728     DWORD sz;
1729     char buffer[0x100];
1730
1731     hdb = create_package_db();
1732     r = run_query( hdb,
1733             "CREATE TABLE `Property` ( "
1734             "`Property` CHAR(255) NOT NULL, "
1735             "`Value` CHAR(255) "
1736             "PRIMARY KEY `Property`)" );
1737     ok( r == ERROR_SUCCESS , "Failed\n" );
1738
1739     r = run_query(hdb,
1740             "INSERT INTO `Property` "
1741             "(`Property`, `Value`) "
1742             "VALUES( 'MetadataCompName', 'Photoshop.dll' )");
1743     ok( r == ERROR_SUCCESS , "Failed\n" );
1744
1745     hpkg = package_from_db( hdb );
1746     ok( hpkg, "failed to create package\n");
1747
1748     /* test invalid values */
1749     r = MsiGetProperty( 0, NULL, NULL, NULL );
1750     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1751
1752     r = MsiGetProperty( hpkg, NULL, NULL, NULL );
1753     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1754
1755     r = MsiGetProperty( hpkg, "boo", NULL, NULL );
1756     ok( r == ERROR_SUCCESS, "wrong return val\n");
1757
1758     r = MsiGetProperty( hpkg, "boo", buffer, NULL );
1759     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1760
1761     /* test retrieving an empty/nonexistent property */
1762     sz = sizeof buffer;
1763     r = MsiGetProperty( hpkg, "boo", NULL, &sz );
1764     ok( r == ERROR_SUCCESS, "wrong return val\n");
1765     ok( sz == 0, "wrong size returned\n");
1766
1767     check_prop_empty( hpkg, "boo");
1768     sz = 0;
1769     strcpy(buffer,"x");
1770     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1771     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1772     ok( !strcmp(buffer,"x"), "buffer was changed\n");
1773     ok( sz == 0, "wrong size returned\n");
1774
1775     sz = 1;
1776     strcpy(buffer,"x");
1777     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1778     ok( r == ERROR_SUCCESS, "wrong return val\n");
1779     ok( buffer[0] == 0, "buffer was not changed\n");
1780     ok( sz == 0, "wrong size returned\n");
1781
1782     /* set the property to something */
1783     r = MsiSetProperty( 0, NULL, NULL );
1784     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
1785
1786     r = MsiSetProperty( hpkg, NULL, NULL );
1787     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1788
1789     r = MsiSetProperty( hpkg, "", NULL );
1790     ok( r == ERROR_SUCCESS, "wrong return val\n");
1791
1792     /* try set and get some illegal property identifiers */
1793     r = MsiSetProperty( hpkg, "", "asdf" );
1794     ok( r == ERROR_FUNCTION_FAILED, "wrong return val\n");
1795
1796     r = MsiSetProperty( hpkg, "=", "asdf" );
1797     ok( r == ERROR_SUCCESS, "wrong return val\n");
1798
1799     r = MsiSetProperty( hpkg, " ", "asdf" );
1800     ok( r == ERROR_SUCCESS, "wrong return val\n");
1801
1802     r = MsiSetProperty( hpkg, "'", "asdf" );
1803     ok( r == ERROR_SUCCESS, "wrong return val\n");
1804
1805     sz = sizeof buffer;
1806     buffer[0]=0;
1807     r = MsiGetProperty( hpkg, "'", buffer, &sz );
1808     ok( r == ERROR_SUCCESS, "wrong return val\n");
1809     ok( !strcmp(buffer,"asdf"), "buffer was not changed\n");
1810
1811     /* set empty values */
1812     r = MsiSetProperty( hpkg, "boo", NULL );
1813     ok( r == ERROR_SUCCESS, "wrong return val\n");
1814     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1815
1816     r = MsiSetProperty( hpkg, "boo", "" );
1817     ok( r == ERROR_SUCCESS, "wrong return val\n");
1818     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1819
1820     /* set a non-empty value */
1821     r = MsiSetProperty( hpkg, "boo", "xyz" );
1822     ok( r == ERROR_SUCCESS, "wrong return val\n");
1823
1824     sz = 1;
1825     strcpy(buffer,"x");
1826     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1827     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1828     ok( buffer[0] == 0, "buffer was not changed\n");
1829     ok( sz == 3, "wrong size returned\n");
1830
1831     sz = 4;
1832     strcpy(buffer,"x");
1833     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1834     ok( r == ERROR_SUCCESS, "wrong return val\n");
1835     ok( !strcmp(buffer,"xyz"), "buffer was not changed\n");
1836     ok( sz == 3, "wrong size returned\n");
1837
1838     sz = 3;
1839     strcpy(buffer,"x");
1840     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1841     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1842     ok( !strcmp(buffer,"xy"), "buffer was not changed\n");
1843     ok( sz == 3, "wrong size returned\n");
1844
1845     r = MsiSetProperty(hpkg, "SourceDir", "foo");
1846     ok( r == ERROR_SUCCESS, "wrong return val\n");
1847
1848     sz = 4;
1849     r = MsiGetProperty(hpkg, "SOURCEDIR", buffer, &sz);
1850     ok( r == ERROR_SUCCESS, "wrong return val\n");
1851     ok( !strcmp(buffer,""), "buffer wrong\n");
1852     ok( sz == 0, "wrong size returned\n");
1853
1854     sz = 4;
1855     r = MsiGetProperty(hpkg, "SOMERANDOMNAME", buffer, &sz);
1856     ok( r == ERROR_SUCCESS, "wrong return val\n");
1857     ok( !strcmp(buffer,""), "buffer wrong\n");
1858     ok( sz == 0, "wrong size returned\n");
1859
1860     sz = 4;
1861     r = MsiGetProperty(hpkg, "SourceDir", buffer, &sz);
1862     ok( r == ERROR_SUCCESS, "wrong return val\n");
1863     ok( !strcmp(buffer,"foo"), "buffer wrong\n");
1864     ok( sz == 3, "wrong size returned\n");
1865
1866     r = MsiSetProperty(hpkg, "MetadataCompName", "Photoshop.dll");
1867     ok( r == ERROR_SUCCESS, "wrong return val\n");
1868
1869     sz = 0;
1870     r = MsiGetProperty(hpkg, "MetadataCompName", NULL, &sz );
1871     ok( r == ERROR_SUCCESS, "return wrong\n");
1872     ok( sz == 13, "size wrong (%d)\n", sz);
1873
1874     sz = 13;
1875     r = MsiGetProperty(hpkg, "MetadataCompName", buffer, &sz );
1876     ok( r == ERROR_MORE_DATA, "return wrong\n");
1877     ok( !strcmp(buffer,"Photoshop.dl"), "buffer wrong\n");
1878
1879     r = MsiSetProperty(hpkg, "property", "value");
1880     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1881
1882     sz = 6;
1883     r = MsiGetProperty(hpkg, "property", buffer, &sz);
1884     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1885     ok( !strcmp(buffer, "value"), "Expected value, got %s\n", buffer);
1886
1887     r = MsiSetProperty(hpkg, "property", NULL);
1888     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1889
1890     sz = 6;
1891     r = MsiGetProperty(hpkg, "property", buffer, &sz);
1892     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1893     ok( !strlen(buffer), "Expected empty string, got %s\n", buffer);
1894
1895     MsiCloseHandle( hpkg );
1896     DeleteFile(msifile);
1897 }
1898
1899 static BOOL find_prop_in_property(MSIHANDLE hdb, LPCSTR prop, LPCSTR val)
1900 {
1901     MSIHANDLE hview, hrec;
1902     BOOL found;
1903     CHAR buffer[MAX_PATH];
1904     DWORD sz;
1905     UINT r;
1906
1907     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
1908     ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
1909     r = MsiViewExecute(hview, 0);
1910     ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
1911
1912     found = FALSE;
1913     while (r == ERROR_SUCCESS && !found)
1914     {
1915         r = MsiViewFetch(hview, &hrec);
1916         if (r != ERROR_SUCCESS) break;
1917
1918         sz = MAX_PATH;
1919         r = MsiRecordGetString(hrec, 1, buffer, &sz);
1920         if (r == ERROR_SUCCESS && !lstrcmpA(buffer, prop))
1921         {
1922             sz = MAX_PATH;
1923             r = MsiRecordGetString(hrec, 2, buffer, &sz);
1924             if (r == ERROR_SUCCESS && !lstrcmpA(buffer, val))
1925                 found = TRUE;
1926         }
1927
1928         MsiCloseHandle(hrec);
1929     }
1930
1931     MsiViewClose(hview);
1932     MsiCloseHandle(hview);
1933
1934     return found;
1935 }
1936
1937 static void test_property_table(void)
1938 {
1939     const char *query;
1940     UINT r;
1941     MSIHANDLE hpkg, hdb, hrec;
1942     char buffer[MAX_PATH];
1943     DWORD sz;
1944     BOOL found;
1945
1946     hdb = create_package_db();
1947     ok( hdb, "failed to create package\n");
1948
1949     hpkg = package_from_db(hdb);
1950     ok( hpkg, "failed to create package\n");
1951
1952     MsiCloseHandle(hdb);
1953
1954     hdb = MsiGetActiveDatabase(hpkg);
1955
1956     query = "CREATE TABLE `_Property` ( "
1957         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
1958     r = run_query(hdb, query);
1959     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
1960
1961     MsiCloseHandle(hdb);
1962     MsiCloseHandle(hpkg);
1963     DeleteFile(msifile);
1964
1965     hdb = create_package_db();
1966     ok( hdb, "failed to create package\n");
1967
1968     query = "CREATE TABLE `_Property` ( "
1969         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
1970     r = run_query(hdb, query);
1971     ok(r == ERROR_SUCCESS, "failed to create table\n");
1972
1973     query = "ALTER `_Property` ADD `foo` INTEGER";
1974     r = run_query(hdb, query);
1975     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
1976
1977     query = "ALTER TABLE `_Property` ADD `foo` INTEGER";
1978     r = run_query(hdb, query);
1979     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
1980
1981     query = "ALTER TABLE `_Property` ADD `extra` INTEGER";
1982     r = run_query(hdb, query);
1983     ok(r == ERROR_SUCCESS, "failed to add column\n");
1984
1985     hpkg = package_from_db(hdb);
1986     todo_wine
1987     {
1988         ok(!hpkg, "package should not be created\n");
1989     }
1990
1991     MsiCloseHandle(hdb);
1992     MsiCloseHandle(hpkg);
1993     DeleteFile(msifile);
1994
1995     hdb = create_package_db();
1996     ok (hdb, "failed to create package database\n");
1997
1998     r = create_property_table(hdb);
1999     ok(r == ERROR_SUCCESS, "cannot create Property table: %d\n", r);
2000
2001     r = add_property_entry(hdb, "'prop', 'val'");
2002     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2003
2004     hpkg = package_from_db(hdb);
2005     ok(hpkg, "failed to create package\n");
2006
2007     MsiCloseHandle(hdb);
2008
2009     sz = MAX_PATH;
2010     r = MsiGetProperty(hpkg, "prop", buffer, &sz);
2011     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2012     ok(!lstrcmp(buffer, "val"), "Expected val, got %s\n", buffer);
2013
2014     hdb = MsiGetActiveDatabase(hpkg);
2015
2016     found = find_prop_in_property(hdb, "prop", "val");
2017     ok(found, "prop should be in the _Property table\n");
2018
2019     r = add_property_entry(hdb, "'dantes', 'mercedes'");
2020     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2021
2022     query = "SELECT * FROM `_Property` WHERE `Property` = 'dantes'";
2023     r = do_query(hdb, query, &hrec);
2024     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
2025
2026     found = find_prop_in_property(hdb, "dantes", "mercedes");
2027     ok(found == FALSE, "dantes should not be in the _Property table\n");
2028
2029     sz = MAX_PATH;
2030     lstrcpy(buffer, "aaa");
2031     r = MsiGetProperty(hpkg, "dantes", buffer, &sz);
2032     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2033     ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer);
2034
2035     r = MsiSetProperty(hpkg, "dantes", "mercedes");
2036     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2037
2038     found = find_prop_in_property(hdb, "dantes", "mercedes");
2039     ok(found == TRUE, "dantes should be in the _Property table\n");
2040
2041     MsiCloseHandle(hdb);
2042     MsiCloseHandle(hpkg);
2043     DeleteFile(msifile);
2044 }
2045
2046 static UINT try_query_param( MSIHANDLE hdb, LPCSTR szQuery, MSIHANDLE hrec )
2047 {
2048     MSIHANDLE htab = 0;
2049     UINT res;
2050
2051     res = MsiDatabaseOpenView( hdb, szQuery, &htab );
2052     if( res == ERROR_SUCCESS )
2053     {
2054         UINT r;
2055
2056         r = MsiViewExecute( htab, hrec );
2057         if( r != ERROR_SUCCESS )
2058         {
2059             res = r;
2060             fprintf(stderr,"MsiViewExecute failed %08x\n", res);
2061         }
2062
2063         r = MsiViewClose( htab );
2064         if( r != ERROR_SUCCESS )
2065             res = r;
2066
2067         r = MsiCloseHandle( htab );
2068         if( r != ERROR_SUCCESS )
2069             res = r;
2070     }
2071     return res;
2072 }
2073
2074 static UINT try_query( MSIHANDLE hdb, LPCSTR szQuery )
2075 {
2076     return try_query_param( hdb, szQuery, 0 );
2077 }
2078
2079 static void set_summary_str(MSIHANDLE hdb, DWORD pid, LPCSTR value)
2080 {
2081     MSIHANDLE summary;
2082     UINT r;
2083
2084     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2085     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2086
2087     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_LPSTR, 0, NULL, value);
2088     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2089
2090     r = MsiSummaryInfoPersist(summary);
2091     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2092
2093     MsiCloseHandle(summary);
2094 }
2095
2096 static void set_summary_dword(MSIHANDLE hdb, DWORD pid, DWORD value)
2097 {
2098     MSIHANDLE summary;
2099     UINT r;
2100
2101     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2102     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2103
2104     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_I4, value, NULL, NULL);
2105     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2106
2107     r = MsiSummaryInfoPersist(summary);
2108     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2109
2110     MsiCloseHandle(summary);
2111 }
2112
2113 static void test_msipackage(void)
2114 {
2115     MSIHANDLE hdb = 0, hpack = 100;
2116     UINT r;
2117     const char *query;
2118     char name[10];
2119
2120     /* NULL szPackagePath */
2121     r = MsiOpenPackage(NULL, &hpack);
2122     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2123
2124     /* empty szPackagePath */
2125     r = MsiOpenPackage("", &hpack);
2126     todo_wine
2127     {
2128         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2129     }
2130
2131     if (r == ERROR_SUCCESS)
2132         MsiCloseHandle(hpack);
2133
2134     /* nonexistent szPackagePath */
2135     r = MsiOpenPackage("nonexistent", &hpack);
2136     ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r);
2137
2138     /* NULL hProduct */
2139     r = MsiOpenPackage(msifile, NULL);
2140     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2141
2142     name[0]='#';
2143     name[1]=0;
2144     r = MsiOpenPackage(name, &hpack);
2145     ok(r == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", r);
2146
2147     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2148     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2149
2150     /* database exists, but is emtpy */
2151     sprintf(name, "#%d", hdb);
2152     r = MsiOpenPackage(name, &hpack);
2153     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2154        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2155
2156     query = "CREATE TABLE `Property` ( "
2157             "`Property` CHAR(72), `Value` CHAR(0) "
2158             "PRIMARY KEY `Property`)";
2159     r = try_query(hdb, query);
2160     ok(r == ERROR_SUCCESS, "failed to create Properties table\n");
2161
2162     query = "CREATE TABLE `InstallExecuteSequence` ("
2163             "`Action` CHAR(72), `Condition` CHAR(0), `Sequence` INTEGER "
2164             "PRIMARY KEY `Action`)";
2165     r = try_query(hdb, query);
2166     ok(r == ERROR_SUCCESS, "failed to create InstallExecuteSequence table\n");
2167
2168     /* a few key tables exist */
2169     sprintf(name, "#%d", hdb);
2170     r = MsiOpenPackage(name, &hpack);
2171     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2172        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2173
2174     MsiCloseHandle(hdb);
2175     DeleteFile(msifile);
2176
2177     /* start with a clean database to show what constitutes a valid package */
2178     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2179     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2180
2181     sprintf(name, "#%d", hdb);
2182
2183     /* The following summary information props must exist:
2184      *  - PID_REVNUMBER
2185      *  - PID_PAGECOUNT
2186      */
2187
2188     set_summary_dword(hdb, PID_PAGECOUNT, 100);
2189     r = MsiOpenPackage(name, &hpack);
2190     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2191        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2192
2193     set_summary_str(hdb, PID_REVNUMBER, "{004757CD-5092-49c2-AD20-28E1CE0DF5F2}");
2194     r = MsiOpenPackage(name, &hpack);
2195     ok(r == ERROR_SUCCESS,
2196        "Expected ERROR_SUCCESS, got %d\n", r);
2197
2198     MsiCloseHandle(hpack);
2199     MsiCloseHandle(hdb);
2200     DeleteFile(msifile);
2201 }
2202
2203 static void test_formatrecord2(void)
2204 {
2205     MSIHANDLE hpkg, hrec ;
2206     char buffer[0x100];
2207     DWORD sz;
2208     UINT r;
2209
2210     hpkg = package_from_db(create_package_db());
2211     ok( hpkg, "failed to create package\n");
2212
2213     r = MsiSetProperty(hpkg, "Manufacturer", " " );
2214     ok( r == ERROR_SUCCESS, "set property failed\n");
2215
2216     hrec = MsiCreateRecord(2);
2217     ok(hrec, "create record failed\n");
2218
2219     r = MsiRecordSetString( hrec, 0, "[ProgramFilesFolder][Manufacturer]\\asdf");
2220     ok( r == ERROR_SUCCESS, "format record failed\n");
2221
2222     buffer[0] = 0;
2223     sz = sizeof buffer;
2224     r = MsiFormatRecord( hpkg, hrec, buffer, &sz );
2225
2226     r = MsiRecordSetString(hrec, 0, "[foo][1]");
2227     r = MsiRecordSetString(hrec, 1, "hoo");
2228     sz = sizeof buffer;
2229     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2230     ok( sz == 3, "size wrong\n");
2231     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2232     ok( r == ERROR_SUCCESS, "format failed\n");
2233
2234     r = MsiRecordSetString(hrec, 0, "x[~]x");
2235     sz = sizeof buffer;
2236     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2237     ok( sz == 3, "size wrong\n");
2238     ok( 0 == strcmp(buffer,"x"), "wrong output %s\n",buffer);
2239     ok( r == ERROR_SUCCESS, "format failed\n");
2240
2241     r = MsiRecordSetString(hrec, 0, "[foo.$%}][1]");
2242     r = MsiRecordSetString(hrec, 1, "hoo");
2243     sz = sizeof buffer;
2244     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2245     ok( sz == 3, "size wrong\n");
2246     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2247     ok( r == ERROR_SUCCESS, "format failed\n");
2248
2249     r = MsiRecordSetString(hrec, 0, "[\\[]");
2250     sz = sizeof buffer;
2251     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2252     ok( sz == 1, "size wrong\n");
2253     ok( 0 == strcmp(buffer,"["), "wrong output %s\n",buffer);
2254     ok( r == ERROR_SUCCESS, "format failed\n");
2255
2256     SetEnvironmentVariable("FOO", "BAR");
2257     r = MsiRecordSetString(hrec, 0, "[%FOO]");
2258     sz = sizeof buffer;
2259     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2260     ok( sz == 3, "size wrong\n");
2261     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2262     ok( r == ERROR_SUCCESS, "format failed\n");
2263
2264     r = MsiRecordSetString(hrec, 0, "[[1]]");
2265     r = MsiRecordSetString(hrec, 1, "%FOO");
2266     sz = sizeof buffer;
2267     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2268     ok( sz == 3, "size wrong\n");
2269     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2270     ok( r == ERROR_SUCCESS, "format failed\n");
2271
2272     MsiCloseHandle( hrec );
2273     MsiCloseHandle( hpkg );
2274     DeleteFile(msifile);
2275 }
2276
2277 static void test_states(void)
2278 {
2279     MSIHANDLE hpkg;
2280     UINT r;
2281     MSIHANDLE hdb;
2282     INSTALLSTATE state, action;
2283
2284     static const CHAR msifile2[] = "winetest2.msi";
2285     static const CHAR msifile3[] = "winetest3.msi";
2286     static const CHAR msifile4[] = "winetest4.msi";
2287
2288     hdb = create_package_db();
2289     ok ( hdb, "failed to create package database\n" );
2290
2291     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
2292     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
2293
2294     r = create_property_table( hdb );
2295     ok( r == ERROR_SUCCESS, "cannot create Property table: %d\n", r );
2296
2297     r = add_property_entry( hdb, "'ProductCode', '{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}'" );
2298     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2299
2300     r = add_property_entry( hdb, "'ProductLanguage', '1033'" );
2301     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2302
2303     r = add_property_entry( hdb, "'ProductName', 'MSITEST'" );
2304     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2305
2306     r = add_property_entry( hdb, "'ProductVersion', '1.1.1'" );
2307     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2308
2309     r = create_install_execute_sequence_table( hdb );
2310     ok( r == ERROR_SUCCESS, "cannot create InstallExecuteSequence table: %d\n", r );
2311
2312     r = add_install_execute_sequence_entry( hdb, "'CostInitialize', '', '800'" );
2313     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2314
2315     r = add_install_execute_sequence_entry( hdb, "'FileCost', '', '900'" );
2316     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2317
2318     r = add_install_execute_sequence_entry( hdb, "'CostFinalize', '', '1000'" );
2319     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2320
2321     r = add_install_execute_sequence_entry( hdb, "'InstallValidate', '', '1400'" );
2322     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2323
2324     r = add_install_execute_sequence_entry( hdb, "'InstallInitialize', '', '1500'" );
2325     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2326
2327     r = add_install_execute_sequence_entry( hdb, "'ProcessComponents', '', '1600'" );
2328     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2329
2330     r = add_install_execute_sequence_entry( hdb, "'UnpublishFeatures', '', '1800'" );
2331     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2332
2333     r = add_install_execute_sequence_entry( hdb, "'RegisterProduct', '', '6100'" );
2334     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2335
2336     r = add_install_execute_sequence_entry( hdb, "'PublishFeatures', '', '6300'" );
2337     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2338
2339     r = add_install_execute_sequence_entry( hdb, "'PublishProduct', '', '6400'" );
2340     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2341
2342     r = add_install_execute_sequence_entry( hdb, "'InstallFinalize', '', '6600'" );
2343     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2344
2345     r = create_media_table( hdb );
2346     ok( r == ERROR_SUCCESS, "cannot create media table: %d\n", r );
2347
2348     r = add_media_entry( hdb, "'1', '3', '', '', 'DISK1', ''");
2349     ok( r == ERROR_SUCCESS, "cannot add media entry: %d\n", r );
2350
2351     r = create_feature_table( hdb );
2352     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
2353
2354     r = create_component_table( hdb );
2355     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
2356
2357     /* msidbFeatureAttributesFavorLocal */
2358     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
2359     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2360
2361     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
2362     r = add_component_entry( hdb, "'alpha', '{467EC132-739D-4784-A37B-677AA43DBC94}', 'TARGETDIR', 0, '', 'alpha_file'" );
2363     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2364
2365     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
2366     r = add_component_entry( hdb, "'beta', '{2C1F189C-24A6-4C34-B26B-994A6C026506}', 'TARGETDIR', 1, '', 'beta_file'" );
2367     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2368
2369     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
2370     r = add_component_entry( hdb, "'gamma', '{C271E2A4-DE2E-4F70-86D1-6984AF7DE2CA}', 'TARGETDIR', 2, '', 'gamma_file'" );
2371     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2372
2373     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSharedDllRefCount */
2374     r = add_component_entry( hdb, "'theta', '{4EB3129D-81A8-48D5-9801-75600FED3DD9}', 'TARGETDIR', 8, '', 'theta_file'" );
2375     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2376
2377     /* msidbFeatureAttributesFavorSource */
2378     r = add_feature_entry( hdb, "'two', '', '', '', 2, 1, '', 1" );
2379     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2380
2381     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
2382     r = add_component_entry( hdb, "'delta', '{938FD4F2-C648-4259-A03C-7AA3B45643F3}', 'TARGETDIR', 0, '', 'delta_file'" );
2383     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2384
2385     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2386     r = add_component_entry( hdb, "'epsilon', '{D59713B6-C11D-47F2-A395-1E5321781190}', 'TARGETDIR', 1, '', 'epsilon_file'" );
2387     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2388
2389     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
2390     r = add_component_entry( hdb, "'zeta', '{377D33AB-2FAA-42B9-A629-0C0DAE9B9C7A}', 'TARGETDIR', 2, '', 'zeta_file'" );
2391     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2392
2393     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSharedDllRefCount */
2394     r = add_component_entry( hdb, "'iota', '{5D36F871-B5ED-4801-9E0F-C46B9E5C9669}', 'TARGETDIR', 8, '', 'iota_file'" );
2395     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2396
2397     /* msidbFeatureAttributesFavorSource */
2398     r = add_feature_entry( hdb, "'three', '', '', '', 2, 1, '', 1" );
2399     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2400
2401     /* msidbFeatureAttributesFavorLocal */
2402     r = add_feature_entry( hdb, "'four', '', '', '', 2, 1, '', 0" );
2403     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2404
2405     /* disabled */
2406     r = add_feature_entry( hdb, "'five', '', '', '', 2, 0, '', 1" );
2407     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2408
2409     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2410     r = add_component_entry( hdb, "'eta', '{DD89003F-0DD4-41B8-81C0-3411A7DA2695}', 'TARGETDIR', 1, '', 'eta_file'" );
2411     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2412
2413     /* no feature parent:msidbComponentAttributesLocalOnly */
2414     r = add_component_entry( hdb, "'kappa', '{D6B93DC3-8DA5-4769-9888-42BFE156BB8B}', 'TARGETDIR', 1, '', 'kappa_file'" );
2415     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2416
2417     /* msidbFeatureAttributesFavorLocal:removed */
2418     r = add_feature_entry( hdb, "'six', '', '', '', 2, 1, '', 0" );
2419     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2420
2421     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesLocalOnly */
2422     r = add_component_entry( hdb, "'lambda', '{6528C5E4-02A4-4636-A214-7A66A6C35B64}', 'TARGETDIR', 0, '', 'lambda_file'" );
2423     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2424
2425     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSourceOnly */
2426     r = add_component_entry( hdb, "'mu', '{97014BAB-6C56-4013-9A63-2BF913B42519}', 'TARGETDIR', 1, '', 'mu_file'" );
2427     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2428
2429     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesOptional */
2430     r = add_component_entry( hdb, "'nu', '{943DD0D8-5808-4954-8526-3B8493FEDDCD}', 'TARGETDIR', 2, '', 'nu_file'" );
2431     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2432
2433     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSharedDllRefCount */
2434     r = add_component_entry( hdb, "'xi', '{D6CF9EF7-6FCF-4930-B34B-F938AEFF9BDB}', 'TARGETDIR', 8, '', 'xi_file'" );
2435     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2436
2437     /* msidbFeatureAttributesFavorSource:removed */
2438     r = add_feature_entry( hdb, "'seven', '', '', '', 2, 1, '', 1" );
2439     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2440
2441     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesLocalOnly */
2442     r = add_component_entry( hdb, "'omicron', '{7B57521D-15DB-4141-9AA6-01D934A4433F}', 'TARGETDIR', 0, '', 'omicron_file'" );
2443     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2444
2445     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSourceOnly */
2446     r = add_component_entry( hdb, "'pi', '{FB85346B-378E-4492-8769-792305471C81}', 'TARGETDIR', 1, '', 'pi_file'" );
2447     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2448
2449     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesOptional */
2450     r = add_component_entry( hdb, "'rho', '{798F2047-7B0C-4783-8BB0-D703E554114B}', 'TARGETDIR', 2, '', 'rho_file'" );
2451     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2452
2453     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSharedDllRefCount */
2454     r = add_component_entry( hdb, "'sigma', '{5CE9DDA8-B67B-4736-9D93-99D61C5B93E7}', 'TARGETDIR', 8, '', 'sigma_file'" );
2455     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2456
2457     /* msidbFeatureAttributesFavorLocal */
2458     r = add_feature_entry( hdb, "'eight', '', '', '', 2, 1, '', 0" );
2459     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2460
2461     r = add_component_entry( hdb, "'tau', '{07DEB510-677C-4A6F-A0A6-7CD8EFEA77ED}', 'TARGETDIR', 1, '', 'tau_file'" );
2462     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2463
2464     /* msidbFeatureAttributesFavorSource */
2465     r = add_feature_entry( hdb, "'nine', '', '', '', 2, 1, '', 1" );
2466     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2467
2468     r = add_component_entry( hdb, "'phi', '{9F0594C5-35AD-43EA-94DD-8DF73FAA664D}', 'TARGETDIR', 1, '', 'phi_file'" );
2469     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2470
2471     /* msidbFeatureAttributesFavorAdvertise */
2472     r = add_feature_entry( hdb, "'ten', '', '', '', 2, 1, '', 4" );
2473     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2474
2475     r = add_component_entry( hdb, "'chi', '{E6B539AB-5DA9-4236-A2D2-E341A50B4C38}', 'TARGETDIR', 1, '', 'chi_file'" );
2476     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2477
2478     r = create_feature_components_table( hdb );
2479     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
2480
2481     r = add_feature_components_entry( hdb, "'one', 'alpha'" );
2482     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2483
2484     r = add_feature_components_entry( hdb, "'one', 'beta'" );
2485     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2486
2487     r = add_feature_components_entry( hdb, "'one', 'gamma'" );
2488     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2489
2490     r = add_feature_components_entry( hdb, "'one', 'theta'" );
2491     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2492
2493     r = add_feature_components_entry( hdb, "'two', 'delta'" );
2494     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2495
2496     r = add_feature_components_entry( hdb, "'two', 'epsilon'" );
2497     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2498
2499     r = add_feature_components_entry( hdb, "'two', 'zeta'" );
2500     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2501
2502     r = add_feature_components_entry( hdb, "'two', 'iota'" );
2503     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2504
2505     r = add_feature_components_entry( hdb, "'three', 'eta'" );
2506     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2507
2508     r = add_feature_components_entry( hdb, "'four', 'eta'" );
2509     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2510
2511     r = add_feature_components_entry( hdb, "'five', 'eta'" );
2512     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2513
2514     r = add_feature_components_entry( hdb, "'six', 'lambda'" );
2515     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2516
2517     r = add_feature_components_entry( hdb, "'six', 'mu'" );
2518     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2519
2520     r = add_feature_components_entry( hdb, "'six', 'nu'" );
2521     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2522
2523     r = add_feature_components_entry( hdb, "'six', 'xi'" );
2524     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2525
2526     r = add_feature_components_entry( hdb, "'seven', 'omicron'" );
2527     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2528
2529     r = add_feature_components_entry( hdb, "'seven', 'pi'" );
2530     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2531
2532     r = add_feature_components_entry( hdb, "'seven', 'rho'" );
2533     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2534
2535     r = add_feature_components_entry( hdb, "'seven', 'sigma'" );
2536     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2537
2538     r = add_feature_components_entry( hdb, "'eight', 'tau'" );
2539     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2540
2541     r = add_feature_components_entry( hdb, "'nine', 'phi'" );
2542     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2543
2544     r = add_feature_components_entry( hdb, "'ten', 'chi'" );
2545     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2546
2547     r = create_file_table( hdb );
2548     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
2549
2550     r = add_file_entry( hdb, "'alpha_file', 'alpha', 'alpha.txt', 100, '', '1033', 8192, 1" );
2551     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2552
2553     r = add_file_entry( hdb, "'beta_file', 'beta', 'beta.txt', 0, '', '1033', 8192, 1" );
2554     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2555
2556     r = add_file_entry( hdb, "'gamma_file', 'gamma', 'gamma.txt', 0, '', '1033', 8192, 1" );
2557     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2558
2559     r = add_file_entry( hdb, "'theta_file', 'theta', 'theta.txt', 0, '', '1033', 8192, 1" );
2560     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2561
2562     r = add_file_entry( hdb, "'delta_file', 'delta', 'delta.txt', 0, '', '1033', 8192, 1" );
2563     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2564
2565     r = add_file_entry( hdb, "'epsilon_file', 'epsilon', 'epsilon.txt', 0, '', '1033', 8192, 1" );
2566     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2567
2568     r = add_file_entry( hdb, "'zeta_file', 'zeta', 'zeta.txt', 0, '', '1033', 8192, 1" );
2569     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2570
2571     r = add_file_entry( hdb, "'iota_file', 'iota', 'iota.txt', 0, '', '1033', 8192, 1" );
2572     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2573
2574     /* compressed file */
2575     r = add_file_entry( hdb, "'eta_file', 'eta', 'eta.txt', 0, '', '1033', 16384, 1" );
2576     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2577
2578     r = add_file_entry( hdb, "'kappa_file', 'kappa', 'kappa.txt', 0, '', '1033', 8192, 1" );
2579     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2580
2581     r = add_file_entry( hdb, "'lambda_file', 'lambda', 'lambda.txt', 100, '', '1033', 8192, 1" );
2582     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2583
2584     r = add_file_entry( hdb, "'mu_file', 'mu', 'mu.txt', 100, '', '1033', 8192, 1" );
2585     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2586
2587     r = add_file_entry( hdb, "'nu_file', 'nu', 'nu.txt', 100, '', '1033', 8192, 1" );
2588     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2589
2590     r = add_file_entry( hdb, "'xi_file', 'xi', 'xi.txt', 100, '', '1033', 8192, 1" );
2591     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2592
2593     r = add_file_entry( hdb, "'omicron_file', 'omicron', 'omicron.txt', 100, '', '1033', 8192, 1" );
2594     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2595
2596     r = add_file_entry( hdb, "'pi_file', 'pi', 'pi.txt', 100, '', '1033', 8192, 1" );
2597     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2598
2599     r = add_file_entry( hdb, "'rho_file', 'rho', 'rho.txt', 100, '', '1033', 8192, 1" );
2600     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2601
2602     r = add_file_entry( hdb, "'sigma_file', 'sigma', 'sigma.txt', 100, '', '1033', 8192, 1" );
2603     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2604
2605     r = add_file_entry( hdb, "'tau_file', 'tau', 'tau.txt', 100, '', '1033', 8192, 1" );
2606     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2607
2608     r = add_file_entry( hdb, "'phi_file', 'phi', 'phi.txt', 100, '', '1033', 8192, 1" );
2609     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2610
2611     r = add_file_entry( hdb, "'chi_file', 'chi', 'chi.txt', 100, '', '1033', 8192, 1" );
2612     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2613
2614     MsiDatabaseCommit(hdb);
2615
2616     /* these properties must not be in the saved msi file */
2617     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
2618     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2619
2620     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
2621     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2622
2623     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
2624     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2625
2626     r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'");
2627     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2628
2629     r = add_property_entry( hdb, "'REINSTALLMODE', 'omus'");
2630     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2631
2632     hpkg = package_from_db( hdb );
2633     ok( hpkg, "failed to create package\n");
2634
2635     MsiCloseHandle(hdb);
2636
2637     CopyFileA(msifile, msifile2, FALSE);
2638     CopyFileA(msifile, msifile3, FALSE);
2639     CopyFileA(msifile, msifile4, FALSE);
2640
2641     state = 0xdeadbee;
2642     action = 0xdeadbee;
2643     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2644     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2645     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2646     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2647
2648     state = 0xdeadbee;
2649     action = 0xdeadbee;
2650     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2651     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2652     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2653     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2654
2655     state = 0xdeadbee;
2656     action = 0xdeadbee;
2657     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2658     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2659     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2660     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2661
2662     state = 0xdeadbee;
2663     action = 0xdeadbee;
2664     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2665     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2666     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2667     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2668
2669     state = 0xdeadbee;
2670     action = 0xdeadbee;
2671     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2672     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2673     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2674     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2675
2676     state = 0xdeadbee;
2677     action = 0xdeadbee;
2678     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2679     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2680     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2681     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2682
2683     state = 0xdeadbee;
2684     action = 0xdeadbee;
2685     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2686     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2687     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2688     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2689
2690     state = 0xdeadbee;
2691     action = 0xdeadbee;
2692     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
2693     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2694     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2695     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2696
2697     state = 0xdeadbee;
2698     action = 0xdeadbee;
2699     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
2700     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2701     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2702     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2703
2704     state = 0xdeadbee;
2705     action = 0xdeadbee;
2706     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
2707     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2708     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2709     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2710
2711     state = 0xdeadbee;
2712     action = 0xdeadbee;
2713     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
2714     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2715     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2716     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2717
2718     state = 0xdeadbee;
2719     action = 0xdeadbee;
2720     r = MsiGetComponentState(hpkg, "beta", &state, &action);
2721     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2722     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2723     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2724
2725     state = 0xdeadbee;
2726     action = 0xdeadbee;
2727     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
2728     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2729     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2730     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2731
2732     state = 0xdeadbee;
2733     action = 0xdeadbee;
2734     r = MsiGetComponentState(hpkg, "theta", &state, &action);
2735     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2736     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2737     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2738
2739     state = 0xdeadbee;
2740     action = 0xdeadbee;
2741     r = MsiGetComponentState(hpkg, "delta", &state, &action);
2742     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2743     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2744     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2745
2746     state = 0xdeadbee;
2747     action = 0xdeadbee;
2748     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
2749     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2750     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2751     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2752
2753     state = 0xdeadbee;
2754     action = 0xdeadbee;
2755     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
2756     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2757     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2758     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2759
2760     state = 0xdeadbee;
2761     action = 0xdeadbee;
2762     r = MsiGetComponentState(hpkg, "iota", &state, &action);
2763     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2764     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2765     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2766
2767     state = 0xdeadbee;
2768     action = 0xdeadbee;
2769     r = MsiGetComponentState(hpkg, "eta", &state, &action);
2770     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2771     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2772     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2773
2774     state = 0xdeadbee;
2775     action = 0xdeadbee;
2776     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
2777     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2778     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2779     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2780
2781     state = 0xdeadbee;
2782     action = 0xdeadbee;
2783     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
2784     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2785     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2786     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2787
2788     state = 0xdeadbee;
2789     action = 0xdeadbee;
2790     r = MsiGetComponentState(hpkg, "mu", &state, &action);
2791     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2792     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2793     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2794
2795     state = 0xdeadbee;
2796     action = 0xdeadbee;
2797     r = MsiGetComponentState(hpkg, "nu", &state, &action);
2798     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2799     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2800     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2801
2802     state = 0xdeadbee;
2803     action = 0xdeadbee;
2804     r = MsiGetComponentState(hpkg, "xi", &state, &action);
2805     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2806     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2807     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2808
2809     state = 0xdeadbee;
2810     action = 0xdeadbee;
2811     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
2812     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2813     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2814     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2815
2816     state = 0xdeadbee;
2817     action = 0xdeadbee;
2818     r = MsiGetComponentState(hpkg, "pi", &state, &action);
2819     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2820     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2821     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2822
2823     state = 0xdeadbee;
2824     action = 0xdeadbee;
2825     r = MsiGetComponentState(hpkg, "rho", &state, &action);
2826     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2827     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2828     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2829
2830     state = 0xdeadbee;
2831     action = 0xdeadbee;
2832     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
2833     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2834     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2835     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2836
2837     state = 0xdeadbee;
2838     action = 0xdeadbee;
2839     r = MsiGetComponentState(hpkg, "tau", &state, &action);
2840     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2841     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2842     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2843
2844     state = 0xdeadbee;
2845     action = 0xdeadbee;
2846     r = MsiGetComponentState(hpkg, "phi", &state, &action);
2847     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2848     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2849     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2850
2851     state = 0xdeadbee;
2852     action = 0xdeadbee;
2853     r = MsiGetComponentState(hpkg, "chi", &state, &action);
2854     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2855     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2856     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2857
2858     r = MsiDoAction( hpkg, "CostInitialize");
2859     ok( r == ERROR_SUCCESS, "cost init failed\n");
2860
2861     state = 0xdeadbee;
2862     action = 0xdeadbee;
2863     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2864     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2865     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2866     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2867
2868     state = 0xdeadbee;
2869     action = 0xdeadbee;
2870     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2871     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2872     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2873     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2874
2875     state = 0xdeadbee;
2876     action = 0xdeadbee;
2877     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2878     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2879     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2880     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2881
2882     state = 0xdeadbee;
2883     action = 0xdeadbee;
2884     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2885     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2886     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2887     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2888
2889     state = 0xdeadbee;
2890     action = 0xdeadbee;
2891     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2892     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2893     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2894     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2895
2896     state = 0xdeadbee;
2897     action = 0xdeadbee;
2898     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2899     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2900     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2901     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2902
2903     state = 0xdeadbee;
2904     action = 0xdeadbee;
2905     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2906     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2907     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2908     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2909
2910     state = 0xdeadbee;
2911     action = 0xdeadbee;
2912     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
2913     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2914     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2915     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2916
2917     state = 0xdeadbee;
2918     action = 0xdeadbee;
2919     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
2920     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2921     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2922     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2923
2924     state = 0xdeadbee;
2925     action = 0xdeadbee;
2926     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
2927     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2928     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2929     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2930
2931     state = 0xdeadbee;
2932     action = 0xdeadbee;
2933     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
2934     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2935     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2936     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2937
2938     state = 0xdeadbee;
2939     action = 0xdeadbee;
2940     r = MsiGetComponentState(hpkg, "beta", &state, &action);
2941     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2942     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2943     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2944
2945     state = 0xdeadbee;
2946     action = 0xdeadbee;
2947     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
2948     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2949     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2950     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2951
2952     state = 0xdeadbee;
2953     action = 0xdeadbee;
2954     r = MsiGetComponentState(hpkg, "theta", &state, &action);
2955     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2956     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2957     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2958
2959     state = 0xdeadbee;
2960     action = 0xdeadbee;
2961     r = MsiGetComponentState(hpkg, "delta", &state, &action);
2962     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2963     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2964     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2965
2966     state = 0xdeadbee;
2967     action = 0xdeadbee;
2968     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
2969     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2970     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2971     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2972
2973     state = 0xdeadbee;
2974     action = 0xdeadbee;
2975     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
2976     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2977     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2978     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2979
2980     state = 0xdeadbee;
2981     action = 0xdeadbee;
2982     r = MsiGetComponentState(hpkg, "iota", &state, &action);
2983     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2984     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2985     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2986
2987     state = 0xdeadbee;
2988     action = 0xdeadbee;
2989     r = MsiGetComponentState(hpkg, "eta", &state, &action);
2990     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2991     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2992     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2993
2994     state = 0xdeadbee;
2995     action = 0xdeadbee;
2996     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
2997     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2998     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2999     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3000
3001     state = 0xdeadbee;
3002     action = 0xdeadbee;
3003     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3004     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3005     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3006     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3007
3008     state = 0xdeadbee;
3009     action = 0xdeadbee;
3010     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3011     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3012     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3013     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3014
3015     state = 0xdeadbee;
3016     action = 0xdeadbee;
3017     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3018     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3019     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3020     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3021
3022     state = 0xdeadbee;
3023     action = 0xdeadbee;
3024     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3025     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3026     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3027     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3028
3029     state = 0xdeadbee;
3030     action = 0xdeadbee;
3031     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3032     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3033     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3034     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3035
3036     state = 0xdeadbee;
3037     action = 0xdeadbee;
3038     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3039     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3040     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3041     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3042
3043     state = 0xdeadbee;
3044     action = 0xdeadbee;
3045     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3046     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3047     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3048     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3049
3050     state = 0xdeadbee;
3051     action = 0xdeadbee;
3052     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3053     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3054     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3055     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3056
3057     state = 0xdeadbee;
3058     action = 0xdeadbee;
3059     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3060     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3061     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3062     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3063
3064     state = 0xdeadbee;
3065     action = 0xdeadbee;
3066     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3067     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3068     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3069     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3070
3071     state = 0xdeadbee;
3072     action = 0xdeadbee;
3073     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3074     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3075     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3076     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3077
3078     r = MsiDoAction( hpkg, "FileCost");
3079     ok( r == ERROR_SUCCESS, "file cost failed\n");
3080
3081     state = 0xdeadbee;
3082     action = 0xdeadbee;
3083     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3084     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3085     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3086     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3087
3088     state = 0xdeadbee;
3089     action = 0xdeadbee;
3090     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3091     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3092     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3093     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3094
3095     state = 0xdeadbee;
3096     action = 0xdeadbee;
3097     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3098     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3099     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3100     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3101
3102     state = 0xdeadbee;
3103     action = 0xdeadbee;
3104     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3105     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3106     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3107     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3108
3109     state = 0xdeadbee;
3110     action = 0xdeadbee;
3111     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3112     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3113     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3114     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3115
3116     state = 0xdeadbee;
3117     action = 0xdeadbee;
3118     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3119     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3120     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3121     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3122
3123     state = 0xdeadbee;
3124     action = 0xdeadbee;
3125     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3126     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3127     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3128     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3129
3130     state = 0xdeadbee;
3131     action = 0xdeadbee;
3132     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3133     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3134     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3135     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3136
3137     state = 0xdeadbee;
3138     action = 0xdeadbee;
3139     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3140     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3141     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3142     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3143
3144     state = 0xdeadbee;
3145     action = 0xdeadbee;
3146     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3147     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3148     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3149     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3150
3151     state = 0xdeadbee;
3152     action = 0xdeadbee;
3153     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3154     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3155     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3156     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3157
3158     state = 0xdeadbee;
3159     action = 0xdeadbee;
3160     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3161     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3162     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3163     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3164
3165     state = 0xdeadbee;
3166     action = 0xdeadbee;
3167     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3168     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3169     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3170     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3171
3172     state = 0xdeadbee;
3173     action = 0xdeadbee;
3174     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3175     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3176     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3177     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3178
3179     state = 0xdeadbee;
3180     action = 0xdeadbee;
3181     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3182     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3183     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3184     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3185
3186     state = 0xdeadbee;
3187     action = 0xdeadbee;
3188     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3189     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3190     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3191     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3192
3193     state = 0xdeadbee;
3194     action = 0xdeadbee;
3195     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3196     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3197     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3198     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3199
3200     state = 0xdeadbee;
3201     action = 0xdeadbee;
3202     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3203     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3204     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3205     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3206
3207     state = 0xdeadbee;
3208     action = 0xdeadbee;
3209     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3210     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3211     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3212     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3213
3214     state = 0xdeadbee;
3215     action = 0xdeadbee;
3216     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3217     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3218     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3219     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3220
3221     state = 0xdeadbee;
3222     action = 0xdeadbee;
3223     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3224     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3225     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3226     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3227
3228     state = 0xdeadbee;
3229     action = 0xdeadbee;
3230     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3231     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3232     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3233     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3234
3235     state = 0xdeadbee;
3236     action = 0xdeadbee;
3237     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3238     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3239     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3240     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3241
3242     state = 0xdeadbee;
3243     action = 0xdeadbee;
3244     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3245     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3246     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3247     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3248
3249     state = 0xdeadbee;
3250     action = 0xdeadbee;
3251     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3252     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3253     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3254     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3255
3256     state = 0xdeadbee;
3257     action = 0xdeadbee;
3258     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3259     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3260     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3261     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3262
3263     state = 0xdeadbee;
3264     action = 0xdeadbee;
3265     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3266     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3267     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3268     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3269
3270     state = 0xdeadbee;
3271     action = 0xdeadbee;
3272     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3273     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3274     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3275     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3276
3277     state = 0xdeadbee;
3278     action = 0xdeadbee;
3279     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3280     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3281     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3282     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3283
3284     state = 0xdeadbee;
3285     action = 0xdeadbee;
3286     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3287     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3288     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3289     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3290
3291     state = 0xdeadbee;
3292     action = 0xdeadbee;
3293     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3294     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3295     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3296     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3297
3298     r = MsiDoAction( hpkg, "CostFinalize");
3299     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
3300
3301     state = 0xdeadbee;
3302     action = 0xdeadbee;
3303     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3304     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3305     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3306     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3307
3308     state = 0xdeadbee;
3309     action = 0xdeadbee;
3310     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3311     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3312     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3313     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3314
3315     state = 0xdeadbee;
3316     action = 0xdeadbee;
3317     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3318     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3319     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3320     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3321
3322     state = 0xdeadbee;
3323     action = 0xdeadbee;
3324     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3325     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3326     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3327     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3328
3329     state = 0xdeadbee;
3330     action = 0xdeadbee;
3331     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3332     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3333     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3334     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3335
3336     state = 0xdeadbee;
3337     action = 0xdeadbee;
3338     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3339     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3340     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3341     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3342
3343     state = 0xdeadbee;
3344     action = 0xdeadbee;
3345     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3346     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3347     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3348     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3349
3350     state = 0xdeadbee;
3351     action = 0xdeadbee;
3352     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3353     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3354     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3355     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3356
3357     state = 0xdeadbee;
3358     action = 0xdeadbee;
3359     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3360     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3361     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3362     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3363
3364     state = 0xdeadbee;
3365     action = 0xdeadbee;
3366     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3367     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3368     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3369     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3370
3371     state = 0xdeadbee;
3372     action = 0xdeadbee;
3373     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3374     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3375     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3376     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3377
3378     state = 0xdeadbee;
3379     action = 0xdeadbee;
3380     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3381     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3382     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3383     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3384
3385     state = 0xdeadbee;
3386     action = 0xdeadbee;
3387     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3388     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3389     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3390     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3391
3392     state = 0xdeadbee;
3393     action = 0xdeadbee;
3394     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3395     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3396     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3397     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3398
3399     state = 0xdeadbee;
3400     action = 0xdeadbee;
3401     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3402     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3403     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3404     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3405
3406     state = 0xdeadbee;
3407     action = 0xdeadbee;
3408     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3409     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3410     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3411     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3412
3413     state = 0xdeadbee;
3414     action = 0xdeadbee;
3415     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3416     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3417     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3418     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3419
3420     state = 0xdeadbee;
3421     action = 0xdeadbee;
3422     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3423     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3424     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3425     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3426
3427     state = 0xdeadbee;
3428     action = 0xdeadbee;
3429     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3430     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3431     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3432     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3433
3434     state = 0xdeadbee;
3435     action = 0xdeadbee;
3436     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3437     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3438     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3439     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3440
3441     state = 0xdeadbee;
3442     action = 0xdeadbee;
3443     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3444     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3445     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3446     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3447
3448     state = 0xdeadbee;
3449     action = 0xdeadbee;
3450     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3451     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3452     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3453     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3454
3455     state = 0xdeadbee;
3456     action = 0xdeadbee;
3457     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3458     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3459     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3460     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3461
3462     state = 0xdeadbee;
3463     action = 0xdeadbee;
3464     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3465     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3466     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3467     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3468
3469     state = 0xdeadbee;
3470     action = 0xdeadbee;
3471     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3472     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3473     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3474     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3475
3476     state = 0xdeadbee;
3477     action = 0xdeadbee;
3478     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3479     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3480     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3481     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3482
3483     state = 0xdeadbee;
3484     action = 0xdeadbee;
3485     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3486     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3487     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3488     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3489
3490     state = 0xdeadbee;
3491     action = 0xdeadbee;
3492     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3493     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3494     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3495     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3496
3497     state = 0xdeadbee;
3498     action = 0xdeadbee;
3499     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3500     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3501     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3502     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3503
3504     state = 0xdeadbee;
3505     action = 0xdeadbee;
3506     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3507     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3508     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3509     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3510
3511     state = 0xdeadbee;
3512     action = 0xdeadbee;
3513     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3514     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3515     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3516     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3517
3518     MsiCloseHandle( hpkg );
3519
3520     /* publish the features and components */
3521     r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven REINSTALL=eight,nine,ten");
3522     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3523
3524     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
3525     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
3526
3527     /* these properties must not be in the saved msi file */
3528     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
3529     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3530
3531     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
3532     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3533
3534     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
3535     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3536
3537     r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'");
3538     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3539
3540     hpkg = package_from_db( hdb );
3541     ok( hpkg, "failed to create package\n");
3542
3543     MsiCloseHandle(hdb);
3544
3545     state = 0xdeadbee;
3546     action = 0xdeadbee;
3547     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3548     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3549     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3550     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3551
3552     state = 0xdeadbee;
3553     action = 0xdeadbee;
3554     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3555     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3556     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3557     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3558
3559     state = 0xdeadbee;
3560     action = 0xdeadbee;
3561     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3562     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3563     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3564     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3565
3566     state = 0xdeadbee;
3567     action = 0xdeadbee;
3568     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3569     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3570     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3571     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3572
3573     state = 0xdeadbee;
3574     action = 0xdeadbee;
3575     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3576     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3577     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3578     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3579
3580     state = 0xdeadbee;
3581     action = 0xdeadbee;
3582     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3583     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3584     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3585     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3586
3587     state = 0xdeadbee;
3588     action = 0xdeadbee;
3589     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3590     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3591     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3592     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3593
3594     state = 0xdeadbee;
3595     action = 0xdeadbee;
3596     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3597     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3598     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3599     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3600
3601     state = 0xdeadbee;
3602     action = 0xdeadbee;
3603     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3604     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3605     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3606     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3607
3608     state = 0xdeadbee;
3609     action = 0xdeadbee;
3610     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3611     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3612     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3613     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3614
3615     state = 0xdeadbee;
3616     action = 0xdeadbee;
3617     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3618     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3619     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3620     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3621
3622     state = 0xdeadbee;
3623     action = 0xdeadbee;
3624     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3625     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3626     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3627     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3628
3629     state = 0xdeadbee;
3630     action = 0xdeadbee;
3631     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3632     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3633     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3634     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3635
3636     state = 0xdeadbee;
3637     action = 0xdeadbee;
3638     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3639     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3640     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3641     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3642
3643     state = 0xdeadbee;
3644     action = 0xdeadbee;
3645     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3646     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3647     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3648     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3649
3650     state = 0xdeadbee;
3651     action = 0xdeadbee;
3652     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3653     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3654     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3655     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3656
3657     state = 0xdeadbee;
3658     action = 0xdeadbee;
3659     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3660     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3661     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3662     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3663
3664     state = 0xdeadbee;
3665     action = 0xdeadbee;
3666     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3667     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3668     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3669     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3670
3671     state = 0xdeadbee;
3672     action = 0xdeadbee;
3673     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3674     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3675     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3676     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3677
3678     state = 0xdeadbee;
3679     action = 0xdeadbee;
3680     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3681     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3682     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3683     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3684
3685     state = 0xdeadbee;
3686     action = 0xdeadbee;
3687     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3688     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3689     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3690     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3691
3692     state = 0xdeadbee;
3693     action = 0xdeadbee;
3694     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3695     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3696     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3697     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3698
3699     state = 0xdeadbee;
3700     action = 0xdeadbee;
3701     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3702     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3703     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3704     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3705
3706     state = 0xdeadbee;
3707     action = 0xdeadbee;
3708     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3709     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3710     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3711     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3712
3713     state = 0xdeadbee;
3714     action = 0xdeadbee;
3715     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3716     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3717     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3718     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3719
3720     state = 0xdeadbee;
3721     action = 0xdeadbee;
3722     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3723     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3724     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3725     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3726
3727     state = 0xdeadbee;
3728     action = 0xdeadbee;
3729     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3730     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3731     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3732     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3733
3734     state = 0xdeadbee;
3735     action = 0xdeadbee;
3736     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3737     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3738     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3739     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3740
3741     state = 0xdeadbee;
3742     action = 0xdeadbee;
3743     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3744     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3745     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3746     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3747
3748     state = 0xdeadbee;
3749     action = 0xdeadbee;
3750     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3751     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3752     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3753     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3754
3755     state = 0xdeadbee;
3756     action = 0xdeadbee;
3757     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3758     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3759     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3760     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3761
3762     r = MsiDoAction( hpkg, "CostInitialize");
3763     ok( r == ERROR_SUCCESS, "cost init failed\n");
3764
3765     state = 0xdeadbee;
3766     action = 0xdeadbee;
3767     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3768     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3769     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3770     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3771
3772     state = 0xdeadbee;
3773     action = 0xdeadbee;
3774     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3775     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3776     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3777     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3778
3779     state = 0xdeadbee;
3780     action = 0xdeadbee;
3781     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3782     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3783     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3784     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3785
3786     state = 0xdeadbee;
3787     action = 0xdeadbee;
3788     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3789     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3790     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3791     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3792
3793     state = 0xdeadbee;
3794     action = 0xdeadbee;
3795     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3796     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3797     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3798     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3799
3800     state = 0xdeadbee;
3801     action = 0xdeadbee;
3802     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3803     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3804     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3805     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3806
3807     state = 0xdeadbee;
3808     action = 0xdeadbee;
3809     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3810     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3811     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3812     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3813
3814     state = 0xdeadbee;
3815     action = 0xdeadbee;
3816     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3817     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3818     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3819     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3820
3821     state = 0xdeadbee;
3822     action = 0xdeadbee;
3823     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3824     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3825     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3826     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3827
3828     state = 0xdeadbee;
3829     action = 0xdeadbee;
3830     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3831     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3832     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3833     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3834
3835     state = 0xdeadbee;
3836     action = 0xdeadbee;
3837     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3838     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3839     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3840     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3841
3842     state = 0xdeadbee;
3843     action = 0xdeadbee;
3844     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3845     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3846     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3847     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3848
3849     state = 0xdeadbee;
3850     action = 0xdeadbee;
3851     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3852     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3853     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3854     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3855
3856     state = 0xdeadbee;
3857     action = 0xdeadbee;
3858     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3859     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3860     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3861     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3862
3863     state = 0xdeadbee;
3864     action = 0xdeadbee;
3865     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3866     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3867     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3868     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3869
3870     state = 0xdeadbee;
3871     action = 0xdeadbee;
3872     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3873     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3874     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3875     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3876
3877     state = 0xdeadbee;
3878     action = 0xdeadbee;
3879     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3880     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3881     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3882     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3883
3884     state = 0xdeadbee;
3885     action = 0xdeadbee;
3886     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3887     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3888     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3889     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3890
3891     state = 0xdeadbee;
3892     action = 0xdeadbee;
3893     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3894     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3895     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3896     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3897
3898     state = 0xdeadbee;
3899     action = 0xdeadbee;
3900     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3901     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3902     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3903     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3904
3905     state = 0xdeadbee;
3906     action = 0xdeadbee;
3907     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3908     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3909     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3910     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3911
3912     state = 0xdeadbee;
3913     action = 0xdeadbee;
3914     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3915     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3916     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3917     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3918
3919     state = 0xdeadbee;
3920     action = 0xdeadbee;
3921     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3922     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3923     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3924     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3925
3926     state = 0xdeadbee;
3927     action = 0xdeadbee;
3928     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3929     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3930     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3931     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3932
3933     state = 0xdeadbee;
3934     action = 0xdeadbee;
3935     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3936     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3937     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3938     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3939
3940     state = 0xdeadbee;
3941     action = 0xdeadbee;
3942     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3943     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3944     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3945     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3946
3947     state = 0xdeadbee;
3948     action = 0xdeadbee;
3949     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3950     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3951     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3952     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3953
3954     state = 0xdeadbee;
3955     action = 0xdeadbee;
3956     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3957     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3958     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3959     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3960
3961     state = 0xdeadbee;
3962     action = 0xdeadbee;
3963     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3964     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3965     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3966     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3967
3968     state = 0xdeadbee;
3969     action = 0xdeadbee;
3970     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3971     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3972     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3973     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3974
3975     state = 0xdeadbee;
3976     action = 0xdeadbee;
3977     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3978     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3979     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3980     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3981
3982     r = MsiDoAction( hpkg, "FileCost");
3983     ok( r == ERROR_SUCCESS, "file cost failed\n");
3984
3985     state = 0xdeadbee;
3986     action = 0xdeadbee;
3987     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3988     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3989     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3990     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3991
3992     state = 0xdeadbee;
3993     action = 0xdeadbee;
3994     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3995     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3996     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3997     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3998
3999     state = 0xdeadbee;
4000     action = 0xdeadbee;
4001     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4002     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4003     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4004     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4005
4006     state = 0xdeadbee;
4007     action = 0xdeadbee;
4008     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4009     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4010     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4011     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4012
4013     state = 0xdeadbee;
4014     action = 0xdeadbee;
4015     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4016     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4017     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4018     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4019
4020     state = 0xdeadbee;
4021     action = 0xdeadbee;
4022     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4023     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4024     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4025     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4026
4027     state = 0xdeadbee;
4028     action = 0xdeadbee;
4029     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4030     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4031     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4032     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4033
4034     state = 0xdeadbee;
4035     action = 0xdeadbee;
4036     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4037     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4038     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4039     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4040
4041     state = 0xdeadbee;
4042     action = 0xdeadbee;
4043     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4044     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4045     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4046     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4047
4048     state = 0xdeadbee;
4049     action = 0xdeadbee;
4050     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4051     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4052     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4053     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4054
4055     state = 0xdeadbee;
4056     action = 0xdeadbee;
4057     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4058     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4059     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4060     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4061
4062     state = 0xdeadbee;
4063     action = 0xdeadbee;
4064     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4065     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4066     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4067     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4068
4069     state = 0xdeadbee;
4070     action = 0xdeadbee;
4071     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4072     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4073     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4074     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4075
4076     state = 0xdeadbee;
4077     action = 0xdeadbee;
4078     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4079     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4080     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4081     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4082
4083     state = 0xdeadbee;
4084     action = 0xdeadbee;
4085     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4086     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4087     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4088     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4089
4090     state = 0xdeadbee;
4091     action = 0xdeadbee;
4092     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4093     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4094     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4095     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4096
4097     state = 0xdeadbee;
4098     action = 0xdeadbee;
4099     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4100     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4101     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4102     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4103
4104     state = 0xdeadbee;
4105     action = 0xdeadbee;
4106     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4107     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4108     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4109     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4110
4111     state = 0xdeadbee;
4112     action = 0xdeadbee;
4113     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4114     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4115     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4116     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4117
4118     state = 0xdeadbee;
4119     action = 0xdeadbee;
4120     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4121     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4122     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4123     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4124
4125     state = 0xdeadbee;
4126     action = 0xdeadbee;
4127     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4128     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4129     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4130     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4131
4132     state = 0xdeadbee;
4133     action = 0xdeadbee;
4134     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4135     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4136     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4137     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4138
4139     state = 0xdeadbee;
4140     action = 0xdeadbee;
4141     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4142     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4143     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4144     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4145
4146     state = 0xdeadbee;
4147     action = 0xdeadbee;
4148     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4149     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4150     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4151     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4152
4153     state = 0xdeadbee;
4154     action = 0xdeadbee;
4155     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4156     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4157     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4158     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4159
4160     state = 0xdeadbee;
4161     action = 0xdeadbee;
4162     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4163     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4164     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4165     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4166
4167     state = 0xdeadbee;
4168     action = 0xdeadbee;
4169     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4170     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4171     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4172     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4173
4174     state = 0xdeadbee;
4175     action = 0xdeadbee;
4176     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4177     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4178     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4179     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4180
4181     state = 0xdeadbee;
4182     action = 0xdeadbee;
4183     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4184     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4185     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4186     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4187
4188     state = 0xdeadbee;
4189     action = 0xdeadbee;
4190     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4191     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4192     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4193     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4194
4195     r = MsiDoAction( hpkg, "CostFinalize");
4196     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
4197
4198     state = 0xdeadbee;
4199     action = 0xdeadbee;
4200     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4201     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4202     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4203     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4204
4205     state = 0xdeadbee;
4206     action = 0xdeadbee;
4207     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4208     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4209     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4210     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4211
4212     state = 0xdeadbee;
4213     action = 0xdeadbee;
4214     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4215     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4216     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4217     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4218
4219     state = 0xdeadbee;
4220     action = 0xdeadbee;
4221     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4222     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4223     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4224     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4225
4226     state = 0xdeadbee;
4227     action = 0xdeadbee;
4228     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4229     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4230     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4231     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4232
4233     state = 0xdeadbee;
4234     action = 0xdeadbee;
4235     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4236     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4237     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4238     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4239
4240     state = 0xdeadbee;
4241     action = 0xdeadbee;
4242     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4243     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4244     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4245     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4246
4247     state = 0xdeadbee;
4248     action = 0xdeadbee;
4249     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4250     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4251     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4252     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4253
4254     state = 0xdeadbee;
4255     action = 0xdeadbee;
4256     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4257     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4258     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4259     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4260
4261     state = 0xdeadbee;
4262     action = 0xdeadbee;
4263     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4264     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4265     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4266     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4267
4268     state = 0xdeadbee;
4269     action = 0xdeadbee;
4270     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4271     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4272     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4273     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4274
4275     state = 0xdeadbee;
4276     action = 0xdeadbee;
4277     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4278     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4279     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4280     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4281
4282     state = 0xdeadbee;
4283     action = 0xdeadbee;
4284     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4285     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4286     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4287     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4288
4289     state = 0xdeadbee;
4290     action = 0xdeadbee;
4291     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4292     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4293     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4294     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4295
4296     state = 0xdeadbee;
4297     action = 0xdeadbee;
4298     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4299     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4300     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4301     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4302
4303     state = 0xdeadbee;
4304     action = 0xdeadbee;
4305     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4306     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4307     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4308     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4309
4310     state = 0xdeadbee;
4311     action = 0xdeadbee;
4312     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4313     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4314     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4315     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4316
4317     state = 0xdeadbee;
4318     action = 0xdeadbee;
4319     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4320     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4321     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4322     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4323
4324     state = 0xdeadbee;
4325     action = 0xdeadbee;
4326     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4327     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4328     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4329     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4330
4331     state = 0xdeadbee;
4332     action = 0xdeadbee;
4333     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4334     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4335     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4336     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4337
4338     state = 0xdeadbee;
4339     action = 0xdeadbee;
4340     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4341     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4342     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4343     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4344
4345     state = 0xdeadbee;
4346     action = 0xdeadbee;
4347     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4348     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4349     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4350     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4351
4352     state = 0xdeadbee;
4353     action = 0xdeadbee;
4354     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4355     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4356     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4357     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4358
4359     state = 0xdeadbee;
4360     action = 0xdeadbee;
4361     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4362     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4363     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4364     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4365
4366     state = 0xdeadbee;
4367     action = 0xdeadbee;
4368     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4369     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4370     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4371     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4372
4373     state = 0xdeadbee;
4374     action = 0xdeadbee;
4375     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4376     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4377     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4378     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4379
4380     state = 0xdeadbee;
4381     action = 0xdeadbee;
4382     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4383     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4384     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4385     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4386
4387     state = 0xdeadbee;
4388     action = 0xdeadbee;
4389     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4390     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4391     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4392     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4393
4394     state = 0xdeadbee;
4395     action = 0xdeadbee;
4396     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4397     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4398     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4399     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4400
4401     state = 0xdeadbee;
4402     action = 0xdeadbee;
4403     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4404     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4405     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4406     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4407
4408     state = 0xdeadbee;
4409     action = 0xdeadbee;
4410     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4411     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4412     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4413     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4414
4415     MsiCloseHandle(hpkg);
4416
4417     /* uninstall the product */
4418     r = MsiInstallProduct(msifile, "REMOVE=ALL");
4419     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4420
4421     /* all features installed locally */
4422     r = MsiInstallProduct(msifile2, "ADDLOCAL=ALL");
4423     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4424
4425     r = MsiOpenDatabase(msifile2, MSIDBOPEN_DIRECT, &hdb);
4426     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
4427
4428     /* these properties must not be in the saved msi file */
4429     r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven,eight,nine,ten'");
4430     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
4431
4432     hpkg = package_from_db( hdb );
4433     ok( hpkg, "failed to create package\n");
4434
4435     state = 0xdeadbee;
4436     action = 0xdeadbee;
4437     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4438     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4439     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4440     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4441
4442     state = 0xdeadbee;
4443     action = 0xdeadbee;
4444     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4445     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4446     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4447     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4448
4449     state = 0xdeadbee;
4450     action = 0xdeadbee;
4451     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4452     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4453     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4454     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4455
4456     state = 0xdeadbee;
4457     action = 0xdeadbee;
4458     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4459     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4460     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4461     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4462
4463     state = 0xdeadbee;
4464     action = 0xdeadbee;
4465     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4466     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4467     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4468     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4469
4470     state = 0xdeadbee;
4471     action = 0xdeadbee;
4472     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4473     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4474     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4475     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4476
4477     state = 0xdeadbee;
4478     action = 0xdeadbee;
4479     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4480     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4481     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4482     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4483
4484     state = 0xdeadbee;
4485     action = 0xdeadbee;
4486     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4487     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4488     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4489     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4490
4491     state = 0xdeadbee;
4492     action = 0xdeadbee;
4493     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4494     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4495     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4496     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4497
4498     state = 0xdeadbee;
4499     action = 0xdeadbee;
4500     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4501     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4502     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4503     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4504
4505     state = 0xdeadbee;
4506     action = 0xdeadbee;
4507     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4508     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4509     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4510     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4511
4512     state = 0xdeadbee;
4513     action = 0xdeadbee;
4514     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4515     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4516     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4517     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4518
4519     state = 0xdeadbee;
4520     action = 0xdeadbee;
4521     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4522     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4523     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4524     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4525
4526     state = 0xdeadbee;
4527     action = 0xdeadbee;
4528     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4529     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4530     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4531     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4532
4533     state = 0xdeadbee;
4534     action = 0xdeadbee;
4535     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4536     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4537     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4538     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4539
4540     state = 0xdeadbee;
4541     action = 0xdeadbee;
4542     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4543     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4544     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4545     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4546
4547     state = 0xdeadbee;
4548     action = 0xdeadbee;
4549     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4550     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4551     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4552     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4553
4554     state = 0xdeadbee;
4555     action = 0xdeadbee;
4556     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4557     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4558     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4559     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4560
4561     state = 0xdeadbee;
4562     action = 0xdeadbee;
4563     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4564     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4565     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4566     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4567
4568     state = 0xdeadbee;
4569     action = 0xdeadbee;
4570     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4571     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4572     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4573     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4574
4575     state = 0xdeadbee;
4576     action = 0xdeadbee;
4577     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4578     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4579     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4580     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4581
4582     state = 0xdeadbee;
4583     action = 0xdeadbee;
4584     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4585     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4586     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4587     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4588
4589     state = 0xdeadbee;
4590     action = 0xdeadbee;
4591     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4592     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4593     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4594     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4595
4596     state = 0xdeadbee;
4597     action = 0xdeadbee;
4598     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4599     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4600     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4601     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4602
4603     state = 0xdeadbee;
4604     action = 0xdeadbee;
4605     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4606     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4607     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4608     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4609
4610     state = 0xdeadbee;
4611     action = 0xdeadbee;
4612     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4613     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4614     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4615     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4616
4617     state = 0xdeadbee;
4618     action = 0xdeadbee;
4619     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4620     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4621     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4622     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4623
4624     state = 0xdeadbee;
4625     action = 0xdeadbee;
4626     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4627     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4628     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4629     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4630
4631     state = 0xdeadbee;
4632     action = 0xdeadbee;
4633     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4634     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4635     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4636     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4637
4638     state = 0xdeadbee;
4639     action = 0xdeadbee;
4640     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4641     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4642     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4643     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4644
4645     state = 0xdeadbee;
4646     action = 0xdeadbee;
4647     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4648     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4649     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4650     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4651
4652     r = MsiDoAction( hpkg, "CostInitialize");
4653     ok( r == ERROR_SUCCESS, "cost init failed\n");
4654
4655     state = 0xdeadbee;
4656     action = 0xdeadbee;
4657     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4658     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4659     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4660     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4661
4662     state = 0xdeadbee;
4663     action = 0xdeadbee;
4664     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4665     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4666     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4667     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4668
4669     state = 0xdeadbee;
4670     action = 0xdeadbee;
4671     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4672     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4673     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4674     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4675
4676     state = 0xdeadbee;
4677     action = 0xdeadbee;
4678     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4679     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4680     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4681     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4682
4683     state = 0xdeadbee;
4684     action = 0xdeadbee;
4685     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4686     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4687     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4688     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4689
4690     state = 0xdeadbee;
4691     action = 0xdeadbee;
4692     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4693     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4694     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4695     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4696
4697     state = 0xdeadbee;
4698     action = 0xdeadbee;
4699     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4700     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4701     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4702     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4703
4704     state = 0xdeadbee;
4705     action = 0xdeadbee;
4706     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4707     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4708     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4709     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4710
4711     state = 0xdeadbee;
4712     action = 0xdeadbee;
4713     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4714     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4715     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4716     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4717
4718     state = 0xdeadbee;
4719     action = 0xdeadbee;
4720     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4721     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4722     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4723     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4724
4725     state = 0xdeadbee;
4726     action = 0xdeadbee;
4727     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4728     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4729     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4730     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4731
4732     state = 0xdeadbee;
4733     action = 0xdeadbee;
4734     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4735     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4736     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4737     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4738
4739     state = 0xdeadbee;
4740     action = 0xdeadbee;
4741     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4742     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4743     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4744     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4745
4746     state = 0xdeadbee;
4747     action = 0xdeadbee;
4748     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4749     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4750     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4751     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4752
4753     state = 0xdeadbee;
4754     action = 0xdeadbee;
4755     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4756     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4757     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4758     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4759
4760     state = 0xdeadbee;
4761     action = 0xdeadbee;
4762     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4763     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4764     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4765     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4766
4767     state = 0xdeadbee;
4768     action = 0xdeadbee;
4769     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4770     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4771     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4772     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4773
4774     state = 0xdeadbee;
4775     action = 0xdeadbee;
4776     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4777     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4778     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4779     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4780
4781     state = 0xdeadbee;
4782     action = 0xdeadbee;
4783     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4784     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4785     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4786     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4787
4788     state = 0xdeadbee;
4789     action = 0xdeadbee;
4790     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4791     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4792     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4793     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4794
4795     state = 0xdeadbee;
4796     action = 0xdeadbee;
4797     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4798     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4799     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4800     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4801
4802     state = 0xdeadbee;
4803     action = 0xdeadbee;
4804     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4805     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4806     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4807     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4808
4809     state = 0xdeadbee;
4810     action = 0xdeadbee;
4811     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4812     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4813     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4814     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4815
4816     state = 0xdeadbee;
4817     action = 0xdeadbee;
4818     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4819     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4820     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4821     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4822
4823     state = 0xdeadbee;
4824     action = 0xdeadbee;
4825     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4826     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4827     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4828     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4829
4830     state = 0xdeadbee;
4831     action = 0xdeadbee;
4832     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4833     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4834     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4835     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4836
4837     state = 0xdeadbee;
4838     action = 0xdeadbee;
4839     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4840     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4841     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4842     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4843
4844     state = 0xdeadbee;
4845     action = 0xdeadbee;
4846     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4847     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4848     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4849     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4850
4851     state = 0xdeadbee;
4852     action = 0xdeadbee;
4853     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4854     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4855     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4856     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4857
4858     state = 0xdeadbee;
4859     action = 0xdeadbee;
4860     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4861     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4862     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4863     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4864
4865     state = 0xdeadbee;
4866     action = 0xdeadbee;
4867     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4868     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4869     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4870     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4871
4872     r = MsiDoAction( hpkg, "FileCost");
4873     ok( r == ERROR_SUCCESS, "file cost failed\n");
4874
4875     state = 0xdeadbee;
4876     action = 0xdeadbee;
4877     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4878     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4879     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4880     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4881
4882     state = 0xdeadbee;
4883     action = 0xdeadbee;
4884     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4885     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4886     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4887     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4888
4889     state = 0xdeadbee;
4890     action = 0xdeadbee;
4891     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4892     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4893     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4894     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4895
4896     state = 0xdeadbee;
4897     action = 0xdeadbee;
4898     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4899     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4900     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4901     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4902
4903     state = 0xdeadbee;
4904     action = 0xdeadbee;
4905     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4906     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4907     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4908     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4909
4910     state = 0xdeadbee;
4911     action = 0xdeadbee;
4912     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4913     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4914     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4915     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4916
4917     state = 0xdeadbee;
4918     action = 0xdeadbee;
4919     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4920     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4921     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4922     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4923
4924     state = 0xdeadbee;
4925     action = 0xdeadbee;
4926     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4927     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4928     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4929     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4930
4931     state = 0xdeadbee;
4932     action = 0xdeadbee;
4933     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4934     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4935     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4936     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4937
4938     state = 0xdeadbee;
4939     action = 0xdeadbee;
4940     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4941     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4942     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4943     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4944
4945     state = 0xdeadbee;
4946     action = 0xdeadbee;
4947     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4948     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4949     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4950     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4951
4952     state = 0xdeadbee;
4953     action = 0xdeadbee;
4954     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4955     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4956     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4957     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4958
4959     state = 0xdeadbee;
4960     action = 0xdeadbee;
4961     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4962     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4963     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4964     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4965
4966     state = 0xdeadbee;
4967     action = 0xdeadbee;
4968     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4969     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4970     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4971     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4972
4973     state = 0xdeadbee;
4974     action = 0xdeadbee;
4975     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4976     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4977     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4978     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4979
4980     state = 0xdeadbee;
4981     action = 0xdeadbee;
4982     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4983     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4984     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4985     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4986
4987     state = 0xdeadbee;
4988     action = 0xdeadbee;
4989     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4990     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4991     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4992     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4993
4994     state = 0xdeadbee;
4995     action = 0xdeadbee;
4996     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4997     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4998     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4999     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5000
5001     state = 0xdeadbee;
5002     action = 0xdeadbee;
5003     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5004     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5005     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5006     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5007
5008     state = 0xdeadbee;
5009     action = 0xdeadbee;
5010     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5011     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5012     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5013     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5014
5015     state = 0xdeadbee;
5016     action = 0xdeadbee;
5017     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5018     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5019     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5020     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5021
5022     state = 0xdeadbee;
5023     action = 0xdeadbee;
5024     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5025     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5026     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5027     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5028
5029     state = 0xdeadbee;
5030     action = 0xdeadbee;
5031     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5032     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5033     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5034     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5035
5036     state = 0xdeadbee;
5037     action = 0xdeadbee;
5038     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5039     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5040     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5041     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5042
5043     state = 0xdeadbee;
5044     action = 0xdeadbee;
5045     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5046     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5047     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5048     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5049
5050     state = 0xdeadbee;
5051     action = 0xdeadbee;
5052     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5053     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5054     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5055     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5056
5057     state = 0xdeadbee;
5058     action = 0xdeadbee;
5059     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5060     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5061     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5062     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5063
5064     state = 0xdeadbee;
5065     action = 0xdeadbee;
5066     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5067     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5068     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5069     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5070
5071     state = 0xdeadbee;
5072     action = 0xdeadbee;
5073     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5074     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5075     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5076     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5077
5078     state = 0xdeadbee;
5079     action = 0xdeadbee;
5080     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5081     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5082     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5083     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5084
5085     state = 0xdeadbee;
5086     action = 0xdeadbee;
5087     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5088     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5089     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5090     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5091
5092     r = MsiDoAction( hpkg, "CostFinalize");
5093     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
5094
5095     state = 0xdeadbee;
5096     action = 0xdeadbee;
5097     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5098     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5099     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5100     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5101
5102     state = 0xdeadbee;
5103     action = 0xdeadbee;
5104     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5105     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5106     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5107     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5108
5109     state = 0xdeadbee;
5110     action = 0xdeadbee;
5111     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5112     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5113     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5114     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5115
5116     state = 0xdeadbee;
5117     action = 0xdeadbee;
5118     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5119     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5120     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5121     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5122
5123     state = 0xdeadbee;
5124     action = 0xdeadbee;
5125     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5126     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5127     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5128     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5129
5130     state = 0xdeadbee;
5131     action = 0xdeadbee;
5132     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5133     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5134     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5135     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5136
5137     state = 0xdeadbee;
5138     action = 0xdeadbee;
5139     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5140     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5141     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5142     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5143
5144     state = 0xdeadbee;
5145     action = 0xdeadbee;
5146     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5147     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5148     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5149     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5150
5151     state = 0xdeadbee;
5152     action = 0xdeadbee;
5153     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5154     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5155     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5156     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5157
5158     state = 0xdeadbee;
5159     action = 0xdeadbee;
5160     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5161     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5162     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5163     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5164
5165     state = 0xdeadbee;
5166     action = 0xdeadbee;
5167     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5168     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5169     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5170     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5171
5172     state = 0xdeadbee;
5173     action = 0xdeadbee;
5174     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5175     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5176     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5177     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5178
5179     state = 0xdeadbee;
5180     action = 0xdeadbee;
5181     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5182     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5183     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5184     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5185
5186     state = 0xdeadbee;
5187     action = 0xdeadbee;
5188     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5189     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5190     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5191     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5192
5193     state = 0xdeadbee;
5194     action = 0xdeadbee;
5195     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5196     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5197     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5198     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5199
5200     state = 0xdeadbee;
5201     action = 0xdeadbee;
5202     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5203     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5204     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5205     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5206
5207     state = 0xdeadbee;
5208     action = 0xdeadbee;
5209     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5210     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5211     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5212     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5213
5214     state = 0xdeadbee;
5215     action = 0xdeadbee;
5216     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5217     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5218     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5219     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5220
5221     state = 0xdeadbee;
5222     action = 0xdeadbee;
5223     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5224     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5225     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5226     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5227
5228     state = 0xdeadbee;
5229     action = 0xdeadbee;
5230     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5231     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5232     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5233     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5234
5235     state = 0xdeadbee;
5236     action = 0xdeadbee;
5237     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5238     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5239     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5240     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5241
5242     state = 0xdeadbee;
5243     action = 0xdeadbee;
5244     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5245     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5246     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5247     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5248
5249     state = 0xdeadbee;
5250     action = 0xdeadbee;
5251     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5252     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5253     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5254     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5255
5256     state = 0xdeadbee;
5257     action = 0xdeadbee;
5258     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5259     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5260     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5261     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5262
5263     state = 0xdeadbee;
5264     action = 0xdeadbee;
5265     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5266     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5267     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5268     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5269
5270     state = 0xdeadbee;
5271     action = 0xdeadbee;
5272     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5273     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5274     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5275     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5276
5277     state = 0xdeadbee;
5278     action = 0xdeadbee;
5279     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5280     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5281     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5282     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5283
5284     state = 0xdeadbee;
5285     action = 0xdeadbee;
5286     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5287     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5288     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5289     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5290
5291     state = 0xdeadbee;
5292     action = 0xdeadbee;
5293     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5294     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5295     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5296     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5297
5298     state = 0xdeadbee;
5299     action = 0xdeadbee;
5300     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5301     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5302     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5303     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5304
5305     state = 0xdeadbee;
5306     action = 0xdeadbee;
5307     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5308     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5309     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5310     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5311
5312     MsiCloseHandle(hpkg);
5313
5314     /* uninstall the product */
5315     r = MsiInstallProduct(msifile2, "REMOVE=ALL");
5316     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5317
5318     /* all features installed from source */
5319     r = MsiInstallProduct(msifile3, "ADDSOURCE=ALL");
5320     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5321
5322     r = MsiOpenDatabase(msifile3, MSIDBOPEN_DIRECT, &hdb);
5323     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
5324
5325     /* this property must not be in the saved msi file */
5326     r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'");
5327     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
5328
5329     hpkg = package_from_db( hdb );
5330     ok( hpkg, "failed to create package\n");
5331
5332     state = 0xdeadbee;
5333     action = 0xdeadbee;
5334     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5335     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5336     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5337     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5338
5339     state = 0xdeadbee;
5340     action = 0xdeadbee;
5341     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5342     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5343     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5344     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5345
5346     state = 0xdeadbee;
5347     action = 0xdeadbee;
5348     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5349     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5350     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5351     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5352
5353     state = 0xdeadbee;
5354     action = 0xdeadbee;
5355     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5356     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5357     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5358     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5359
5360     state = 0xdeadbee;
5361     action = 0xdeadbee;
5362     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5363     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5364     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5365     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5366
5367     state = 0xdeadbee;
5368     action = 0xdeadbee;
5369     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5370     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5371     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5372     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5373
5374     state = 0xdeadbee;
5375     action = 0xdeadbee;
5376     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5377     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5378     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5379     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5380
5381     state = 0xdeadbee;
5382     action = 0xdeadbee;
5383     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5384     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5385     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5386     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5387
5388     state = 0xdeadbee;
5389     action = 0xdeadbee;
5390     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5391     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5392     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5393     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5394
5395     state = 0xdeadbee;
5396     action = 0xdeadbee;
5397     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5398     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5399     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5400     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5401
5402     state = 0xdeadbee;
5403     action = 0xdeadbee;
5404     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5405     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5406     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5407     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5408
5409     state = 0xdeadbee;
5410     action = 0xdeadbee;
5411     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5412     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5413     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5414     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5415
5416     state = 0xdeadbee;
5417     action = 0xdeadbee;
5418     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5419     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5420     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5421     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5422
5423     state = 0xdeadbee;
5424     action = 0xdeadbee;
5425     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5426     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5427     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5428     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5429
5430     state = 0xdeadbee;
5431     action = 0xdeadbee;
5432     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5433     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5434     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5435     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5436
5437     state = 0xdeadbee;
5438     action = 0xdeadbee;
5439     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5440     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5441     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5442     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5443
5444     state = 0xdeadbee;
5445     action = 0xdeadbee;
5446     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5447     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5448     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5449     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5450
5451     state = 0xdeadbee;
5452     action = 0xdeadbee;
5453     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5454     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5455     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5456     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5457
5458     state = 0xdeadbee;
5459     action = 0xdeadbee;
5460     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5461     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5462     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5463     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5464
5465     state = 0xdeadbee;
5466     action = 0xdeadbee;
5467     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5468     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5469     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5470     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5471
5472     state = 0xdeadbee;
5473     action = 0xdeadbee;
5474     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5475     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5476     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5477     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5478
5479     state = 0xdeadbee;
5480     action = 0xdeadbee;
5481     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5482     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5483     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5484     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5485
5486     state = 0xdeadbee;
5487     action = 0xdeadbee;
5488     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5489     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5490     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5491     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5492
5493     state = 0xdeadbee;
5494     action = 0xdeadbee;
5495     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5496     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5497     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5498     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5499
5500     state = 0xdeadbee;
5501     action = 0xdeadbee;
5502     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5503     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5504     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5505     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5506
5507     state = 0xdeadbee;
5508     action = 0xdeadbee;
5509     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5510     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5511     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5512     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5513
5514     state = 0xdeadbee;
5515     action = 0xdeadbee;
5516     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5517     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5518     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5519     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5520
5521     state = 0xdeadbee;
5522     action = 0xdeadbee;
5523     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5524     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5525     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5526     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5527
5528     state = 0xdeadbee;
5529     action = 0xdeadbee;
5530     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5531     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5532     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5533     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5534
5535     state = 0xdeadbee;
5536     action = 0xdeadbee;
5537     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5538     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5539     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5540     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5541
5542     state = 0xdeadbee;
5543     action = 0xdeadbee;
5544     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5545     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5546     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5547     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5548
5549     r = MsiDoAction( hpkg, "CostInitialize");
5550     ok( r == ERROR_SUCCESS, "cost init failed\n");
5551
5552     state = 0xdeadbee;
5553     action = 0xdeadbee;
5554     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5555     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5556     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5557     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5558
5559     state = 0xdeadbee;
5560     action = 0xdeadbee;
5561     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5562     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5563     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5564     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5565
5566     state = 0xdeadbee;
5567     action = 0xdeadbee;
5568     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5569     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5570     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5571     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5572
5573     state = 0xdeadbee;
5574     action = 0xdeadbee;
5575     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5576     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5577     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5578     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5579
5580     state = 0xdeadbee;
5581     action = 0xdeadbee;
5582     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5583     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5584     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5585     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5586
5587     state = 0xdeadbee;
5588     action = 0xdeadbee;
5589     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5590     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5591     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5592     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5593
5594     state = 0xdeadbee;
5595     action = 0xdeadbee;
5596     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5597     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5598     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5599     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5600
5601     state = 0xdeadbee;
5602     action = 0xdeadbee;
5603     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5604     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5605     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5606     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5607
5608     state = 0xdeadbee;
5609     action = 0xdeadbee;
5610     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5611     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5612     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5613     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5614
5615     state = 0xdeadbee;
5616     action = 0xdeadbee;
5617     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5618     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5619     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5620     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5621
5622     state = 0xdeadbee;
5623     action = 0xdeadbee;
5624     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5625     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5626     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5627     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5628
5629     state = 0xdeadbee;
5630     action = 0xdeadbee;
5631     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5632     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5633     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5634     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5635
5636     state = 0xdeadbee;
5637     action = 0xdeadbee;
5638     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5639     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5640     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5641     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5642
5643     state = 0xdeadbee;
5644     action = 0xdeadbee;
5645     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5646     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5647     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5648     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5649
5650     state = 0xdeadbee;
5651     action = 0xdeadbee;
5652     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5653     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5654     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5655     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5656
5657     state = 0xdeadbee;
5658     action = 0xdeadbee;
5659     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5660     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5661     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5662     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5663
5664     state = 0xdeadbee;
5665     action = 0xdeadbee;
5666     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5667     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5668     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5669     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5670
5671     state = 0xdeadbee;
5672     action = 0xdeadbee;
5673     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5674     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5675     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5676     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5677
5678     state = 0xdeadbee;
5679     action = 0xdeadbee;
5680     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5681     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5682     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5683     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5684
5685     state = 0xdeadbee;
5686     action = 0xdeadbee;
5687     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5688     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5689     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5690     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5691
5692     state = 0xdeadbee;
5693     action = 0xdeadbee;
5694     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5695     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5696     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5697     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5698
5699     state = 0xdeadbee;
5700     action = 0xdeadbee;
5701     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5702     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5703     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5704     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5705
5706     state = 0xdeadbee;
5707     action = 0xdeadbee;
5708     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5709     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5710     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5711     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5712
5713     state = 0xdeadbee;
5714     action = 0xdeadbee;
5715     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5716     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5717     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5718     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5719
5720     state = 0xdeadbee;
5721     action = 0xdeadbee;
5722     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5723     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5724     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5725     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5726
5727     state = 0xdeadbee;
5728     action = 0xdeadbee;
5729     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5730     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5731     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5732     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5733
5734     state = 0xdeadbee;
5735     action = 0xdeadbee;
5736     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5737     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5738     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5739     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5740
5741     state = 0xdeadbee;
5742     action = 0xdeadbee;
5743     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5744     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5745     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5746     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5747
5748     state = 0xdeadbee;
5749     action = 0xdeadbee;
5750     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5751     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5752     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5753     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5754
5755     state = 0xdeadbee;
5756     action = 0xdeadbee;
5757     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5758     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5759     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5760     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5761
5762     state = 0xdeadbee;
5763     action = 0xdeadbee;
5764     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5765     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5766     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5767     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5768
5769     r = MsiDoAction( hpkg, "FileCost");
5770     ok( r == ERROR_SUCCESS, "file cost failed\n");
5771
5772     state = 0xdeadbee;
5773     action = 0xdeadbee;
5774     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5775     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5776     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5777     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5778
5779     state = 0xdeadbee;
5780     action = 0xdeadbee;
5781     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5782     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5783     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5784     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5785
5786     state = 0xdeadbee;
5787     action = 0xdeadbee;
5788     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5789     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5790     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5791     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5792
5793     state = 0xdeadbee;
5794     action = 0xdeadbee;
5795     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5796     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5797     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5798     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5799
5800     state = 0xdeadbee;
5801     action = 0xdeadbee;
5802     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5803     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5804     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5805     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5806
5807     state = 0xdeadbee;
5808     action = 0xdeadbee;
5809     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5810     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5811     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5812     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5813
5814     state = 0xdeadbee;
5815     action = 0xdeadbee;
5816     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5817     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5818     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5819     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5820
5821     state = 0xdeadbee;
5822     action = 0xdeadbee;
5823     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5824     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5825     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5826     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5827
5828     state = 0xdeadbee;
5829     action = 0xdeadbee;
5830     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5831     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5832     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5833     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5834
5835     state = 0xdeadbee;
5836     action = 0xdeadbee;
5837     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5838     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5839     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5840     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5841
5842     state = 0xdeadbee;
5843     action = 0xdeadbee;
5844     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5845     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5846     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5847     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5848
5849     state = 0xdeadbee;
5850     action = 0xdeadbee;
5851     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5852     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5853     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5854     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5855
5856     state = 0xdeadbee;
5857     action = 0xdeadbee;
5858     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5859     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5860     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5861     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5862
5863     state = 0xdeadbee;
5864     action = 0xdeadbee;
5865     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5866     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5867     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5868     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5869
5870     state = 0xdeadbee;
5871     action = 0xdeadbee;
5872     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5873     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5874     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5875     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5876
5877     state = 0xdeadbee;
5878     action = 0xdeadbee;
5879     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5880     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5881     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5882     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5883
5884     state = 0xdeadbee;
5885     action = 0xdeadbee;
5886     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5887     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5888     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5889     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5890
5891     state = 0xdeadbee;
5892     action = 0xdeadbee;
5893     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5894     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5895     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5896     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5897
5898     state = 0xdeadbee;
5899     action = 0xdeadbee;
5900     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5901     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5902     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5903     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5904
5905     state = 0xdeadbee;
5906     action = 0xdeadbee;
5907     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5908     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5909     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5910     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5911
5912     state = 0xdeadbee;
5913     action = 0xdeadbee;
5914     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5915     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5916     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5917     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5918
5919     state = 0xdeadbee;
5920     action = 0xdeadbee;
5921     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5922     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5923     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5924     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5925
5926     state = 0xdeadbee;
5927     action = 0xdeadbee;
5928     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5929     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5930     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5931     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5932
5933     state = 0xdeadbee;
5934     action = 0xdeadbee;
5935     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5936     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5937     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5938     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5939
5940     state = 0xdeadbee;
5941     action = 0xdeadbee;
5942     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5943     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5944     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5945     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5946
5947     state = 0xdeadbee;
5948     action = 0xdeadbee;
5949     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5950     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5951     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5952     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5953
5954     state = 0xdeadbee;
5955     action = 0xdeadbee;
5956     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5957     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5958     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5959     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5960
5961     state = 0xdeadbee;
5962     action = 0xdeadbee;
5963     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5964     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5965     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5966     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5967
5968     state = 0xdeadbee;
5969     action = 0xdeadbee;
5970     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5971     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5972     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5973     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5974
5975     state = 0xdeadbee;
5976     action = 0xdeadbee;
5977     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5978     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5979     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5980     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5981
5982     state = 0xdeadbee;
5983     action = 0xdeadbee;
5984     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5985     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5986     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5987     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5988
5989     r = MsiDoAction( hpkg, "CostFinalize");
5990     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
5991
5992     state = 0xdeadbee;
5993     action = 0xdeadbee;
5994     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5995     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5996     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5997     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5998
5999     state = 0xdeadbee;
6000     action = 0xdeadbee;
6001     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6002     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6003     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6004     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6005
6006     state = 0xdeadbee;
6007     action = 0xdeadbee;
6008     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6009     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6010     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6011     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6012
6013     state = 0xdeadbee;
6014     action = 0xdeadbee;
6015     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6016     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6017     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6018     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6019
6020     state = 0xdeadbee;
6021     action = 0xdeadbee;
6022     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6023     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6024     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6025     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6026
6027     state = 0xdeadbee;
6028     action = 0xdeadbee;
6029     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6030     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6031     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6032     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6033
6034     state = 0xdeadbee;
6035     action = 0xdeadbee;
6036     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6037     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6038     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6039     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6040
6041     state = 0xdeadbee;
6042     action = 0xdeadbee;
6043     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6044     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6045     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6046     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6047
6048     state = 0xdeadbee;
6049     action = 0xdeadbee;
6050     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6051     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6052     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6053     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6054
6055     state = 0xdeadbee;
6056     action = 0xdeadbee;
6057     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6058     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6059     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6060     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6061
6062     state = 0xdeadbee;
6063     action = 0xdeadbee;
6064     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6065     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6066     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6067     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6068
6069     state = 0xdeadbee;
6070     action = 0xdeadbee;
6071     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6072     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6073     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6074     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6075
6076     state = 0xdeadbee;
6077     action = 0xdeadbee;
6078     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6079     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6080     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6081     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6082
6083     state = 0xdeadbee;
6084     action = 0xdeadbee;
6085     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6086     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6087     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6088     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6089
6090     state = 0xdeadbee;
6091     action = 0xdeadbee;
6092     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6093     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6094     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6095     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6096
6097     state = 0xdeadbee;
6098     action = 0xdeadbee;
6099     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6100     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6101     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6102     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6103
6104     state = 0xdeadbee;
6105     action = 0xdeadbee;
6106     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6107     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6108     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6109     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6110
6111     state = 0xdeadbee;
6112     action = 0xdeadbee;
6113     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6114     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6115     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6116     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6117
6118     state = 0xdeadbee;
6119     action = 0xdeadbee;
6120     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6121     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6122     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6123     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6124
6125     state = 0xdeadbee;
6126     action = 0xdeadbee;
6127     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6128     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6129     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6130     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6131
6132     state = 0xdeadbee;
6133     action = 0xdeadbee;
6134     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6135     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6136     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6137     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6138
6139     state = 0xdeadbee;
6140     action = 0xdeadbee;
6141     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6142     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6143     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6144     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6145
6146     state = 0xdeadbee;
6147     action = 0xdeadbee;
6148     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6149     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6150     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6151     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6152
6153     state = 0xdeadbee;
6154     action = 0xdeadbee;
6155     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6156     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6157     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6158     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6159
6160     state = 0xdeadbee;
6161     action = 0xdeadbee;
6162     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6163     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6164     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6165     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6166
6167     state = 0xdeadbee;
6168     action = 0xdeadbee;
6169     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6170     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6171     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6172     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6173
6174     state = 0xdeadbee;
6175     action = 0xdeadbee;
6176     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6177     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6178     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6179     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6180
6181     state = 0xdeadbee;
6182     action = 0xdeadbee;
6183     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6184     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6185     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6186     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6187
6188     state = 0xdeadbee;
6189     action = 0xdeadbee;
6190     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6191     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6192     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6193     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6194
6195     state = 0xdeadbee;
6196     action = 0xdeadbee;
6197     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6198     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6199     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6200     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6201
6202     state = 0xdeadbee;
6203     action = 0xdeadbee;
6204     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6205     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6206     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6207     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6208
6209     MsiCloseHandle(hpkg);
6210
6211     /* reinstall the product */
6212     r = MsiInstallProduct(msifile3, "REINSTALL=ALL");
6213     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6214
6215     r = MsiOpenDatabase(msifile4, MSIDBOPEN_DIRECT, &hdb);
6216     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
6217
6218     /* this property must not be in the saved msi file */
6219     r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'");
6220     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
6221
6222     hpkg = package_from_db( hdb );
6223     ok( hpkg, "failed to create package\n");
6224
6225     state = 0xdeadbee;
6226     action = 0xdeadbee;
6227     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6228     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6229     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6230     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6231
6232     state = 0xdeadbee;
6233     action = 0xdeadbee;
6234     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6235     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6236     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6237     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6238
6239     state = 0xdeadbee;
6240     action = 0xdeadbee;
6241     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6242     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6243     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6244     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6245
6246     state = 0xdeadbee;
6247     action = 0xdeadbee;
6248     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6249     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6250     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6251     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6252
6253     state = 0xdeadbee;
6254     action = 0xdeadbee;
6255     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6256     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6257     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6258     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6259
6260     state = 0xdeadbee;
6261     action = 0xdeadbee;
6262     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6263     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6264     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6265     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6266
6267     state = 0xdeadbee;
6268     action = 0xdeadbee;
6269     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6270     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6271     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6272     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6273
6274     state = 0xdeadbee;
6275     action = 0xdeadbee;
6276     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6277     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6278     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6279     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6280
6281     state = 0xdeadbee;
6282     action = 0xdeadbee;
6283     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6284     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6285     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6286     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6287
6288     state = 0xdeadbee;
6289     action = 0xdeadbee;
6290     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6291     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6292     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6293     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6294
6295     state = 0xdeadbee;
6296     action = 0xdeadbee;
6297     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6298     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6299     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6300     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6301
6302     state = 0xdeadbee;
6303     action = 0xdeadbee;
6304     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6305     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6306     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6307     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6308
6309     state = 0xdeadbee;
6310     action = 0xdeadbee;
6311     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6312     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6313     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6314     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6315
6316     state = 0xdeadbee;
6317     action = 0xdeadbee;
6318     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6319     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6320     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6321     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6322
6323     state = 0xdeadbee;
6324     action = 0xdeadbee;
6325     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6326     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6327     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6328     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6329
6330     state = 0xdeadbee;
6331     action = 0xdeadbee;
6332     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6333     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6334     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6335     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6336
6337     state = 0xdeadbee;
6338     action = 0xdeadbee;
6339     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6340     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6341     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6342     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6343
6344     state = 0xdeadbee;
6345     action = 0xdeadbee;
6346     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6347     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6348     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6349     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6350
6351     state = 0xdeadbee;
6352     action = 0xdeadbee;
6353     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6354     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6355     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6356     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6357
6358     state = 0xdeadbee;
6359     action = 0xdeadbee;
6360     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6361     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6362     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6363     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6364
6365     state = 0xdeadbee;
6366     action = 0xdeadbee;
6367     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6368     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6369     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6370     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6371
6372     state = 0xdeadbee;
6373     action = 0xdeadbee;
6374     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6375     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6376     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6377     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6378
6379     state = 0xdeadbee;
6380     action = 0xdeadbee;
6381     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6382     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6383     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6384     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6385
6386     state = 0xdeadbee;
6387     action = 0xdeadbee;
6388     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6389     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6390     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6391     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6392
6393     state = 0xdeadbee;
6394     action = 0xdeadbee;
6395     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6396     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6397     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6398     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6399
6400     state = 0xdeadbee;
6401     action = 0xdeadbee;
6402     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6403     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6404     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6405     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6406
6407     state = 0xdeadbee;
6408     action = 0xdeadbee;
6409     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6410     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6411     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6412     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6413
6414     state = 0xdeadbee;
6415     action = 0xdeadbee;
6416     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6417     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6418     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6419     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6420
6421     state = 0xdeadbee;
6422     action = 0xdeadbee;
6423     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6424     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6425     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6426     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6427
6428     state = 0xdeadbee;
6429     action = 0xdeadbee;
6430     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6431     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6432     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6433     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6434
6435     state = 0xdeadbee;
6436     action = 0xdeadbee;
6437     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6438     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6439     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6440     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6441
6442     r = MsiDoAction( hpkg, "CostInitialize");
6443     ok( r == ERROR_SUCCESS, "cost init failed\n");
6444
6445     state = 0xdeadbee;
6446     action = 0xdeadbee;
6447     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6448     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6449     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6450     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6451
6452     state = 0xdeadbee;
6453     action = 0xdeadbee;
6454     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6455     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6456     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6457     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6458
6459     state = 0xdeadbee;
6460     action = 0xdeadbee;
6461     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6462     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6463     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6464     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6465
6466     state = 0xdeadbee;
6467     action = 0xdeadbee;
6468     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6469     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6470     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6471     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6472
6473     state = 0xdeadbee;
6474     action = 0xdeadbee;
6475     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6476     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6477     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6478     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6479
6480     state = 0xdeadbee;
6481     action = 0xdeadbee;
6482     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6483     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6484     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6485     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6486
6487     state = 0xdeadbee;
6488     action = 0xdeadbee;
6489     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6490     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6491     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6492     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6493
6494     state = 0xdeadbee;
6495     action = 0xdeadbee;
6496     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6497     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6498     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6499     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6500
6501     state = 0xdeadbee;
6502     action = 0xdeadbee;
6503     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6504     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6505     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6506     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6507
6508     state = 0xdeadbee;
6509     action = 0xdeadbee;
6510     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6511     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6512     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6513     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6514
6515     state = 0xdeadbee;
6516     action = 0xdeadbee;
6517     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6518     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6519     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6520     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6521
6522     state = 0xdeadbee;
6523     action = 0xdeadbee;
6524     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6525     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6526     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6527     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6528
6529     state = 0xdeadbee;
6530     action = 0xdeadbee;
6531     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6532     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6533     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6534     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6535
6536     state = 0xdeadbee;
6537     action = 0xdeadbee;
6538     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6539     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6540     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6541     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6542
6543     state = 0xdeadbee;
6544     action = 0xdeadbee;
6545     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6546     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6547     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6548     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6549
6550     state = 0xdeadbee;
6551     action = 0xdeadbee;
6552     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6553     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6554     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6555     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6556
6557     state = 0xdeadbee;
6558     action = 0xdeadbee;
6559     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6560     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6561     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6562     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6563
6564     state = 0xdeadbee;
6565     action = 0xdeadbee;
6566     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6567     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6568     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6569     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6570
6571     state = 0xdeadbee;
6572     action = 0xdeadbee;
6573     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6574     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6575     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6576     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6577
6578     state = 0xdeadbee;
6579     action = 0xdeadbee;
6580     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6581     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6582     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6583     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6584
6585     state = 0xdeadbee;
6586     action = 0xdeadbee;
6587     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6588     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6589     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6590     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6591
6592     state = 0xdeadbee;
6593     action = 0xdeadbee;
6594     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6595     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6596     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6597     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6598
6599     state = 0xdeadbee;
6600     action = 0xdeadbee;
6601     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6602     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6603     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6604     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6605
6606     state = 0xdeadbee;
6607     action = 0xdeadbee;
6608     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6609     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6610     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6611     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6612
6613     state = 0xdeadbee;
6614     action = 0xdeadbee;
6615     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6616     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6617     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6618     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6619
6620     state = 0xdeadbee;
6621     action = 0xdeadbee;
6622     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6623     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6624     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6625     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6626
6627     state = 0xdeadbee;
6628     action = 0xdeadbee;
6629     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6630     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6631     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6632     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6633
6634     state = 0xdeadbee;
6635     action = 0xdeadbee;
6636     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6637     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6638     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6639     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6640
6641     state = 0xdeadbee;
6642     action = 0xdeadbee;
6643     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6644     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6645     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6646     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6647
6648     state = 0xdeadbee;
6649     action = 0xdeadbee;
6650     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6651     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6652     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6653     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6654
6655     state = 0xdeadbee;
6656     action = 0xdeadbee;
6657     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6658     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6659     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6660     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6661
6662     r = MsiDoAction( hpkg, "FileCost");
6663     ok( r == ERROR_SUCCESS, "file cost failed\n");
6664
6665     state = 0xdeadbee;
6666     action = 0xdeadbee;
6667     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6668     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6669     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6670     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6671
6672     state = 0xdeadbee;
6673     action = 0xdeadbee;
6674     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6675     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6676     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6677     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6678
6679     state = 0xdeadbee;
6680     action = 0xdeadbee;
6681     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6682     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6683     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6684     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6685
6686     state = 0xdeadbee;
6687     action = 0xdeadbee;
6688     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6689     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6690     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6691     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6692
6693     state = 0xdeadbee;
6694     action = 0xdeadbee;
6695     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6696     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6697     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6698     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6699
6700     state = 0xdeadbee;
6701     action = 0xdeadbee;
6702     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6703     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6704     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6705     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6706
6707     state = 0xdeadbee;
6708     action = 0xdeadbee;
6709     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6710     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6711     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6712     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6713
6714     state = 0xdeadbee;
6715     action = 0xdeadbee;
6716     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6717     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6718     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6719     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6720
6721     state = 0xdeadbee;
6722     action = 0xdeadbee;
6723     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6724     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6725     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6726     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6727
6728     state = 0xdeadbee;
6729     action = 0xdeadbee;
6730     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6731     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6732     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6733     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6734
6735     state = 0xdeadbee;
6736     action = 0xdeadbee;
6737     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6738     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6739     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6740     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6741
6742     state = 0xdeadbee;
6743     action = 0xdeadbee;
6744     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6745     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6746     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6747     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6748
6749     state = 0xdeadbee;
6750     action = 0xdeadbee;
6751     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6752     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6753     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6754     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6755
6756     state = 0xdeadbee;
6757     action = 0xdeadbee;
6758     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6759     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6760     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6761     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6762
6763     state = 0xdeadbee;
6764     action = 0xdeadbee;
6765     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6766     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6767     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6768     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6769
6770     state = 0xdeadbee;
6771     action = 0xdeadbee;
6772     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6773     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6774     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6775     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6776
6777     state = 0xdeadbee;
6778     action = 0xdeadbee;
6779     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6780     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6781     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6782     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6783
6784     state = 0xdeadbee;
6785     action = 0xdeadbee;
6786     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6787     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6788     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6789     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6790
6791     state = 0xdeadbee;
6792     action = 0xdeadbee;
6793     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6794     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6795     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6796     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6797
6798     state = 0xdeadbee;
6799     action = 0xdeadbee;
6800     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6801     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6802     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6803     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6804
6805     state = 0xdeadbee;
6806     action = 0xdeadbee;
6807     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6808     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6809     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6810     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6811
6812     state = 0xdeadbee;
6813     action = 0xdeadbee;
6814     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6815     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6816     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6817     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6818
6819     state = 0xdeadbee;
6820     action = 0xdeadbee;
6821     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6822     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6823     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6824     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6825
6826     state = 0xdeadbee;
6827     action = 0xdeadbee;
6828     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6829     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6830     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6831     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6832
6833     state = 0xdeadbee;
6834     action = 0xdeadbee;
6835     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6836     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6837     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6838     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6839
6840     state = 0xdeadbee;
6841     action = 0xdeadbee;
6842     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6843     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6844     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6845     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6846
6847     state = 0xdeadbee;
6848     action = 0xdeadbee;
6849     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6850     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6851     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6852     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6853
6854     state = 0xdeadbee;
6855     action = 0xdeadbee;
6856     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6857     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6858     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6859     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6860
6861     state = 0xdeadbee;
6862     action = 0xdeadbee;
6863     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6864     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6865     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6866     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6867
6868     state = 0xdeadbee;
6869     action = 0xdeadbee;
6870     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6871     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6872     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6873     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6874
6875     state = 0xdeadbee;
6876     action = 0xdeadbee;
6877     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6878     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6879     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6880     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6881
6882     r = MsiDoAction( hpkg, "CostFinalize");
6883     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
6884
6885     state = 0xdeadbee;
6886     action = 0xdeadbee;
6887     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6888     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6889     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6890     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6891
6892     state = 0xdeadbee;
6893     action = 0xdeadbee;
6894     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6895     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6896     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6897     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6898
6899     state = 0xdeadbee;
6900     action = 0xdeadbee;
6901     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6902     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6903     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6904     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6905
6906     state = 0xdeadbee;
6907     action = 0xdeadbee;
6908     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6909     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6910     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6911     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6912
6913     state = 0xdeadbee;
6914     action = 0xdeadbee;
6915     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6916     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6917     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6918     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6919
6920     state = 0xdeadbee;
6921     action = 0xdeadbee;
6922     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6923     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6924     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6925     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6926
6927     state = 0xdeadbee;
6928     action = 0xdeadbee;
6929     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6930     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6931     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6932     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6933
6934     state = 0xdeadbee;
6935     action = 0xdeadbee;
6936     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6937     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6938     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6939     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6940
6941     state = 0xdeadbee;
6942     action = 0xdeadbee;
6943     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6944     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6945     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6946     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6947
6948     state = 0xdeadbee;
6949     action = 0xdeadbee;
6950     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6951     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6952     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6953     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6954
6955     state = 0xdeadbee;
6956     action = 0xdeadbee;
6957     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6958     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6959     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6960     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6961
6962     state = 0xdeadbee;
6963     action = 0xdeadbee;
6964     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6965     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6966     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6967     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6968
6969     state = 0xdeadbee;
6970     action = 0xdeadbee;
6971     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6972     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6973     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6974     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6975
6976     state = 0xdeadbee;
6977     action = 0xdeadbee;
6978     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6979     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6980     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6981     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6982
6983     state = 0xdeadbee;
6984     action = 0xdeadbee;
6985     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6986     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6987     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6988     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6989
6990     state = 0xdeadbee;
6991     action = 0xdeadbee;
6992     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6993     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6994     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6995     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6996
6997     state = 0xdeadbee;
6998     action = 0xdeadbee;
6999     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
7000     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7001     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7002     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7003
7004     state = 0xdeadbee;
7005     action = 0xdeadbee;
7006     r = MsiGetComponentState(hpkg, "iota", &state, &action);
7007     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7008     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7009     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7010
7011     state = 0xdeadbee;
7012     action = 0xdeadbee;
7013     r = MsiGetComponentState(hpkg, "eta", &state, &action);
7014     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7015     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7016     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7017
7018     state = 0xdeadbee;
7019     action = 0xdeadbee;
7020     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
7021     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7022     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7023     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7024
7025     state = 0xdeadbee;
7026     action = 0xdeadbee;
7027     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
7028     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7029     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7030     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7031
7032     state = 0xdeadbee;
7033     action = 0xdeadbee;
7034     r = MsiGetComponentState(hpkg, "mu", &state, &action);
7035     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7036     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7037     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7038
7039     state = 0xdeadbee;
7040     action = 0xdeadbee;
7041     r = MsiGetComponentState(hpkg, "nu", &state, &action);
7042     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7043     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7044     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7045
7046     state = 0xdeadbee;
7047     action = 0xdeadbee;
7048     r = MsiGetComponentState(hpkg, "xi", &state, &action);
7049     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7050     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7051     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7052
7053     state = 0xdeadbee;
7054     action = 0xdeadbee;
7055     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
7056     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7057     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7058     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7059
7060     state = 0xdeadbee;
7061     action = 0xdeadbee;
7062     r = MsiGetComponentState(hpkg, "pi", &state, &action);
7063     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7064     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7065     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7066
7067     state = 0xdeadbee;
7068     action = 0xdeadbee;
7069     r = MsiGetComponentState(hpkg, "rho", &state, &action);
7070     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7071     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7072     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7073
7074     state = 0xdeadbee;
7075     action = 0xdeadbee;
7076     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
7077     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7078     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7079     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7080
7081     state = 0xdeadbee;
7082     action = 0xdeadbee;
7083     r = MsiGetComponentState(hpkg, "tau", &state, &action);
7084     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7085     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7086     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7087
7088     state = 0xdeadbee;
7089     action = 0xdeadbee;
7090     r = MsiGetComponentState(hpkg, "phi", &state, &action);
7091     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7092     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7093     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7094
7095     state = 0xdeadbee;
7096     action = 0xdeadbee;
7097     r = MsiGetComponentState(hpkg, "chi", &state, &action);
7098     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7099     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7100     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7101
7102     MsiCloseHandle(hpkg);
7103
7104     /* uninstall the product */
7105     r = MsiInstallProduct(msifile4, "REMOVE=ALL");
7106     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7107
7108     DeleteFileA(msifile);
7109     DeleteFileA(msifile2);
7110     DeleteFileA(msifile3);
7111     DeleteFileA(msifile4);
7112 }
7113
7114 static void test_getproperty(void)
7115 {
7116     MSIHANDLE hPackage = 0;
7117     char prop[100];
7118     static CHAR empty[] = "";
7119     DWORD size;
7120     UINT r;
7121
7122     hPackage = package_from_db(create_package_db());
7123     ok( hPackage != 0, " Failed to create package\n");
7124
7125     /* set the property */
7126     r = MsiSetProperty(hPackage, "Name", "Value");
7127     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7128
7129     /* retrieve the size, NULL pointer */
7130     size = 0;
7131     r = MsiGetProperty(hPackage, "Name", NULL, &size);
7132     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7133     ok( size == 5, "Expected 5, got %d\n", size);
7134
7135     /* retrieve the size, empty string */
7136     size = 0;
7137     r = MsiGetProperty(hPackage, "Name", empty, &size);
7138     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
7139     ok( size == 5, "Expected 5, got %d\n", size);
7140
7141     /* don't change size */
7142     r = MsiGetProperty(hPackage, "Name", prop, &size);
7143     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
7144     ok( size == 5, "Expected 5, got %d\n", size);
7145     ok( !lstrcmp(prop, "Valu"), "Expected Valu, got %s\n", prop);
7146
7147     /* increase the size by 1 */
7148     size++;
7149     r = MsiGetProperty(hPackage, "Name", prop, &size);
7150     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7151     ok( size == 5, "Expected 5, got %d\n", size);
7152     ok( !lstrcmp(prop, "Value"), "Expected Value, got %s\n", prop);
7153
7154     r = MsiCloseHandle( hPackage);
7155     ok( r == ERROR_SUCCESS , "Failed to close package\n" );
7156     DeleteFile(msifile);
7157 }
7158
7159 static void test_removefiles(void)
7160 {
7161     MSIHANDLE hpkg;
7162     UINT r;
7163     MSIHANDLE hdb;
7164
7165     hdb = create_package_db();
7166     ok ( hdb, "failed to create package database\n" );
7167
7168     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
7169     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
7170
7171     r = create_feature_table( hdb );
7172     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
7173
7174     r = create_component_table( hdb );
7175     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
7176
7177     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
7178     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7179
7180     r = add_component_entry( hdb, "'hydrogen', '', 'TARGETDIR', 0, '', 'hydrogen_file'" );
7181     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7182
7183     r = add_component_entry( hdb, "'helium', '', 'TARGETDIR', 0, '', 'helium_file'" );
7184     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7185
7186     r = add_component_entry( hdb, "'lithium', '', 'TARGETDIR', 0, '', 'lithium_file'" );
7187     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7188
7189     r = add_component_entry( hdb, "'beryllium', '', 'TARGETDIR', 0, '', 'beryllium_file'" );
7190     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7191
7192     r = add_component_entry( hdb, "'boron', '', 'TARGETDIR', 0, '', 'boron_file'" );
7193     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7194
7195     r = add_component_entry( hdb, "'carbon', '', 'TARGETDIR', 0, '', 'carbon_file'" );
7196     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7197
7198     r = create_feature_components_table( hdb );
7199     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
7200
7201     r = add_feature_components_entry( hdb, "'one', 'hydrogen'" );
7202     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7203
7204     r = add_feature_components_entry( hdb, "'one', 'helium'" );
7205     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7206
7207     r = add_feature_components_entry( hdb, "'one', 'lithium'" );
7208     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7209
7210     r = add_feature_components_entry( hdb, "'one', 'beryllium'" );
7211     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7212
7213     r = add_feature_components_entry( hdb, "'one', 'boron'" );
7214     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7215
7216     r = add_feature_components_entry( hdb, "'one', 'carbon'" );
7217     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7218
7219     r = create_file_table( hdb );
7220     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
7221
7222     r = add_file_entry( hdb, "'hydrogen_file', 'hydrogen', 'hydrogen.txt', 0, '', '1033', 8192, 1" );
7223     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7224
7225     r = add_file_entry( hdb, "'helium_file', 'helium', 'helium.txt', 0, '', '1033', 8192, 1" );
7226     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7227
7228     r = add_file_entry( hdb, "'lithium_file', 'lithium', 'lithium.txt', 0, '', '1033', 8192, 1" );
7229     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7230
7231     r = add_file_entry( hdb, "'beryllium_file', 'beryllium', 'beryllium.txt', 0, '', '1033', 16384, 1" );
7232     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7233
7234     r = add_file_entry( hdb, "'boron_file', 'boron', 'boron.txt', 0, '', '1033', 16384, 1" );
7235     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7236
7237     r = add_file_entry( hdb, "'carbon_file', 'carbon', 'carbon.txt', 0, '', '1033', 16384, 1" );
7238     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7239
7240     r = create_remove_file_table( hdb );
7241     ok( r == ERROR_SUCCESS, "cannot create Remove File table: %d\n", r);
7242
7243     hpkg = package_from_db( hdb );
7244     ok( hpkg, "failed to create package\n");
7245
7246     MsiCloseHandle( hdb );
7247
7248     create_test_file( "hydrogen.txt" );
7249     create_test_file( "helium.txt" );
7250     create_test_file( "lithium.txt" );
7251     create_test_file( "beryllium.txt" );
7252     create_test_file( "boron.txt" );
7253     create_test_file( "carbon.txt" );
7254
7255     r = MsiSetProperty( hpkg, "TARGETDIR", CURR_DIR );
7256     ok( r == ERROR_SUCCESS, "set property failed\n");
7257
7258     r = MsiDoAction( hpkg, "CostInitialize");
7259     ok( r == ERROR_SUCCESS, "cost init failed\n");
7260
7261     r = MsiDoAction( hpkg, "FileCost");
7262     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7263
7264     r = MsiDoAction( hpkg, "CostFinalize");
7265     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7266
7267     r = MsiDoAction( hpkg, "InstallValidate");
7268     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7269
7270     r = MsiSetComponentState( hpkg, "hydrogen", INSTALLSTATE_ABSENT );
7271     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7272
7273     r = MsiSetComponentState( hpkg, "helium", INSTALLSTATE_LOCAL );
7274     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7275
7276     r = MsiSetComponentState( hpkg, "lithium", INSTALLSTATE_SOURCE );
7277     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7278
7279     r = MsiSetComponentState( hpkg, "beryllium", INSTALLSTATE_ABSENT );
7280     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7281
7282     r = MsiSetComponentState( hpkg, "boron", INSTALLSTATE_LOCAL );
7283     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7284
7285     r = MsiSetComponentState( hpkg, "carbon", INSTALLSTATE_SOURCE );
7286     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7287
7288     r = MsiDoAction( hpkg, "RemoveFiles");
7289     ok( r == ERROR_SUCCESS, "remove files failed\n");
7290
7291     ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
7292     ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");    
7293     ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
7294     ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
7295     ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n");
7296     ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n");
7297
7298     MsiCloseHandle( hpkg );
7299     DeleteFileA(msifile);
7300 }
7301
7302 static void test_appsearch(void)
7303 {
7304     MSIHANDLE hpkg;
7305     UINT r;
7306     MSIHANDLE hdb;
7307     CHAR prop[MAX_PATH];
7308     DWORD size = MAX_PATH;
7309
7310     hdb = create_package_db();
7311     ok ( hdb, "failed to create package database\n" );
7312
7313     r = create_appsearch_table( hdb );
7314     ok( r == ERROR_SUCCESS, "cannot create AppSearch table: %d\n", r );
7315
7316     r = add_appsearch_entry( hdb, "'WEBBROWSERPROG', 'NewSignature1'" );
7317     ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r );
7318
7319     r = create_reglocator_table( hdb );
7320     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
7321
7322     r = add_reglocator_entry( hdb, "'NewSignature1', 0, 'htmlfile\\shell\\open\\command', '', 1" );
7323     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
7324
7325     r = create_signature_table( hdb );
7326     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
7327
7328     r = add_signature_entry( hdb, "'NewSignature1', 'FileName', '', '', '', '', '', '', ''" );
7329     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
7330
7331     hpkg = package_from_db( hdb );
7332     ok( hpkg, "failed to create package\n");
7333
7334     MsiCloseHandle( hdb );
7335
7336     r = MsiDoAction( hpkg, "AppSearch" );
7337     ok( r == ERROR_SUCCESS, "AppSearch failed: %d\n", r);
7338
7339     r = MsiGetPropertyA( hpkg, "WEBBROWSERPROG", prop, &size );
7340     ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
7341     todo_wine
7342     {
7343         ok( lstrlenA(prop) != 0, "Expected non-zero length\n");
7344     }
7345
7346     MsiCloseHandle( hpkg );
7347     DeleteFileA(msifile);
7348 }
7349
7350 static void test_appsearch_complocator(void)
7351 {
7352     MSIHANDLE hpkg, hdb;
7353     CHAR path[MAX_PATH];
7354     CHAR prop[MAX_PATH];
7355     LPSTR usersid;
7356     DWORD size;
7357     UINT r;
7358
7359     if (!get_user_sid(&usersid))
7360         return;
7361
7362     create_test_file("FileName1");
7363     create_test_file("FileName4");
7364     set_component_path("FileName1", MSIINSTALLCONTEXT_MACHINE,
7365                        "{A8AE6692-96BA-4198-8399-145D7D1D0D0E}", NULL, FALSE);
7366
7367     create_test_file("FileName2");
7368     set_component_path("FileName2", MSIINSTALLCONTEXT_USERUNMANAGED,
7369                        "{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}", usersid, FALSE);
7370
7371     create_test_file("FileName3");
7372     set_component_path("FileName3", MSIINSTALLCONTEXT_USERMANAGED,
7373                        "{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}", usersid, FALSE);
7374
7375     create_test_file("FileName5");
7376     set_component_path("FileName5", MSIINSTALLCONTEXT_MACHINE,
7377                        "{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}", NULL, TRUE);
7378
7379     create_test_file("FileName6");
7380     set_component_path("FileName6", MSIINSTALLCONTEXT_MACHINE,
7381                        "{C0ECD96F-7898-4410-9667-194BD8C1B648}", NULL, TRUE);
7382
7383     create_test_file("FileName7");
7384     set_component_path("FileName7", MSIINSTALLCONTEXT_MACHINE,
7385                        "{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}", NULL, FALSE);
7386
7387     /* dir is FALSE, but we're pretending it's a directory */
7388     set_component_path("IDontExist\\", MSIINSTALLCONTEXT_MACHINE,
7389                        "{91B7359B-07F2-4221-AA8D-DE102BB87A5F}", NULL, FALSE);
7390
7391     create_file_with_version("FileName8.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7392     set_component_path("FileName8.dll", MSIINSTALLCONTEXT_MACHINE,
7393                        "{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}", NULL, FALSE);
7394
7395     create_file_with_version("FileName9.dll", MAKELONG(1, 2), MAKELONG(3, 4));
7396     set_component_path("FileName9.dll", MSIINSTALLCONTEXT_MACHINE,
7397                        "{A204DF48-7346-4635-BA2E-66247DBAC9DF}", NULL, FALSE);
7398
7399     create_file_with_version("FileName10.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7400     set_component_path("FileName10.dll", MSIINSTALLCONTEXT_MACHINE,
7401                        "{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}", NULL, FALSE);
7402
7403     hdb = create_package_db();
7404     ok(hdb, "Expected a valid database handle\n");
7405
7406     r = create_appsearch_table(hdb);
7407     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7408
7409     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
7410     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7411
7412     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
7413     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7414
7415     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
7416     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7417
7418     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
7419     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7420
7421     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
7422     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7423
7424     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
7425     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7426
7427     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
7428     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7429
7430     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
7431     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7432
7433     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
7434     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7435
7436     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
7437     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7438
7439     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
7440     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7441
7442     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
7443     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7444
7445     r = create_complocator_table(hdb);
7446     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7447
7448     /* published component, machine, file, signature, misdbLocatorTypeFile */
7449     r = add_complocator_entry(hdb, "'NewSignature1', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 1");
7450     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7451
7452     /* published component, user-unmanaged, file, signature, misdbLocatorTypeFile */
7453     r = add_complocator_entry(hdb, "'NewSignature2', '{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}', 1");
7454     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7455
7456     /* published component, user-managed, file, signature, misdbLocatorTypeFile */
7457     r = add_complocator_entry(hdb, "'NewSignature3', '{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}', 1");
7458     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7459
7460     /* published component, machine, file, signature, misdbLocatorTypeDirectory */
7461     r = add_complocator_entry(hdb, "'NewSignature4', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 0");
7462     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7463
7464     /* published component, machine, dir, signature, misdbLocatorTypeDirectory */
7465     r = add_complocator_entry(hdb, "'NewSignature5', '{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}', 0");
7466     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7467
7468     /* published component, machine, dir, no signature, misdbLocatorTypeDirectory */
7469     r = add_complocator_entry(hdb, "'NewSignature6', '{C0ECD96F-7898-4410-9667-194BD8C1B648}', 0");
7470     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7471
7472     /* published component, machine, file, no signature, misdbLocatorTypeFile */
7473     r = add_complocator_entry(hdb, "'NewSignature7', '{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}', 1");
7474     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7475
7476     /* unpublished component, no signature, misdbLocatorTypeDir */
7477     r = add_complocator_entry(hdb, "'NewSignature8', '{FB671D5B-5083-4048-90E0-481C48D8F3A5}', 0");
7478     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7479
7480     /* published component, no signature, dir does not exist misdbLocatorTypeDir */
7481     r = add_complocator_entry(hdb, "'NewSignature9', '{91B7359B-07F2-4221-AA8D-DE102BB87A5F}', 0");
7482     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7483
7484     /* published component, signature w/ ver, misdbLocatorTypeFile */
7485     r = add_complocator_entry(hdb, "'NewSignature10', '{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}', 1");
7486     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7487
7488     /* published component, signature w/ ver, ver > max, misdbLocatorTypeFile */
7489     r = add_complocator_entry(hdb, "'NewSignature11', '{A204DF48-7346-4635-BA2E-66247DBAC9DF}', 1");
7490     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7491
7492     /* published component, signature w/ ver, sig->name ignored, misdbLocatorTypeFile */
7493     r = add_complocator_entry(hdb, "'NewSignature12', '{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}', 1");
7494     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7495
7496     r = create_signature_table(hdb);
7497     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7498
7499     r = add_signature_entry(hdb, "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''");
7500     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7501
7502     r = add_signature_entry(hdb, "'NewSignature2', 'FileName2', '', '', '', '', '', '', ''");
7503     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7504
7505     r = add_signature_entry(hdb, "'NewSignature3', 'FileName3', '', '', '', '', '', '', ''");
7506     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7507
7508     r = add_signature_entry(hdb, "'NewSignature4', 'FileName4', '', '', '', '', '', '', ''");
7509     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7510
7511     r = add_signature_entry(hdb, "'NewSignature5', 'FileName5', '', '', '', '', '', '', ''");
7512     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7513
7514     r = add_signature_entry(hdb, "'NewSignature10', 'FileName8.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7515     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7516
7517     r = add_signature_entry(hdb, "'NewSignature11', 'FileName9.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7518     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7519
7520     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7521     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7522
7523     hpkg = package_from_db(hdb);
7524     ok(hpkg, "Expected a valid package handle\n");
7525
7526     r = MsiSetPropertyA(hpkg, "SIGPROP8", "october");
7527     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7528
7529     r = MsiDoAction(hpkg, "AppSearch");
7530     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7531
7532     size = MAX_PATH;
7533     sprintf(path, "%s\\FileName1", CURR_DIR);
7534     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
7535     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7536     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7537
7538     size = MAX_PATH;
7539     sprintf(path, "%s\\FileName2", CURR_DIR);
7540     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
7541     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7542     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7543
7544     size = MAX_PATH;
7545     sprintf(path, "%s\\FileName3", CURR_DIR);
7546     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
7547     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7548     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7549
7550     size = MAX_PATH;
7551     sprintf(path, "%s\\FileName4", CURR_DIR);
7552     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
7553     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7554     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7555
7556     size = MAX_PATH;
7557     sprintf(path, "%s\\FileName5", CURR_DIR);
7558     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
7559     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7560     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7561
7562     size = MAX_PATH;
7563     sprintf(path, "%s\\", CURR_DIR);
7564     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
7565     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7566     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7567
7568     size = MAX_PATH;
7569     sprintf(path, "%s\\", CURR_DIR);
7570     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
7571     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7572     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7573
7574     size = MAX_PATH;
7575     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
7576     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7577     ok(!lstrcmpA(prop, "october"), "Expected \"october\", got \"%s\"\n", prop);
7578
7579     size = MAX_PATH;
7580     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
7581     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7582     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7583
7584     size = MAX_PATH;
7585     sprintf(path, "%s\\FileName8.dll", CURR_DIR);
7586     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
7587     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7588     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7589
7590     size = MAX_PATH;
7591     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
7592     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7593     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7594
7595     size = MAX_PATH;
7596     sprintf(path, "%s\\FileName10.dll", CURR_DIR);
7597     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
7598     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7599     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7600
7601     delete_component_path("{A8AE6692-96BA-4198-8399-145D7D1D0D0E}",
7602                           MSIINSTALLCONTEXT_MACHINE, NULL);
7603     delete_component_path("{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}",
7604                           MSIINSTALLCONTEXT_USERUNMANAGED, usersid);
7605     delete_component_path("{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}",
7606                           MSIINSTALLCONTEXT_USERMANAGED, usersid);
7607     delete_component_path("{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}",
7608                           MSIINSTALLCONTEXT_MACHINE, NULL);
7609     delete_component_path("{C0ECD96F-7898-4410-9667-194BD8C1B648}",
7610                           MSIINSTALLCONTEXT_MACHINE, NULL);
7611     delete_component_path("{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}",
7612                           MSIINSTALLCONTEXT_MACHINE, NULL);
7613     delete_component_path("{91B7359B-07F2-4221-AA8D-DE102BB87A5F}",
7614                           MSIINSTALLCONTEXT_MACHINE, NULL);
7615     delete_component_path("{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}",
7616                           MSIINSTALLCONTEXT_MACHINE, NULL);
7617     delete_component_path("{A204DF48-7346-4635-BA2E-66247DBAC9DF}",
7618                           MSIINSTALLCONTEXT_MACHINE, NULL);
7619     delete_component_path("{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}",
7620                           MSIINSTALLCONTEXT_MACHINE, NULL);
7621
7622     DeleteFileA("FileName1");
7623     DeleteFileA("FileName2");
7624     DeleteFileA("FileName3");
7625     DeleteFileA("FileName4");
7626     DeleteFileA("FileName5");
7627     DeleteFileA("FileName6");
7628     DeleteFileA("FileName7");
7629     DeleteFileA("FileName8.dll");
7630     DeleteFileA("FileName9.dll");
7631     DeleteFileA("FileName10.dll");
7632     MsiCloseHandle(hpkg);
7633     DeleteFileA(msifile);
7634 }
7635
7636 static void test_appsearch_reglocator(void)
7637 {
7638     MSIHANDLE hpkg, hdb;
7639     CHAR path[MAX_PATH];
7640     CHAR prop[MAX_PATH];
7641     DWORD binary[2];
7642     DWORD size, val;
7643     BOOL space, version;
7644     HKEY hklm, classes;
7645     HKEY hkcu, users;
7646     LPSTR pathdata;
7647     LPSTR pathvar;
7648     LPCSTR str;
7649     LPSTR ptr;
7650     LONG res;
7651     UINT r;
7652
7653     version = TRUE;
7654     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
7655         version = FALSE;
7656
7657     DeleteFileA("test.dll");
7658
7659     res = RegCreateKeyA(HKEY_CLASSES_ROOT, "Software\\Wine", &classes);
7660     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7661
7662     res = RegSetValueExA(classes, "Value1", 0, REG_SZ,
7663                          (const BYTE *)"regszdata", 10);
7664     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7665
7666     res = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine", &hkcu);
7667     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7668
7669     res = RegSetValueExA(hkcu, "Value1", 0, REG_SZ,
7670                          (const BYTE *)"regszdata", 10);
7671     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7672
7673     users = 0;
7674     res = RegCreateKeyA(HKEY_USERS, "S-1-5-18\\Software\\Wine", &users);
7675     ok(res == ERROR_SUCCESS ||
7676        broken(res == ERROR_INVALID_PARAMETER),
7677        "Expected ERROR_SUCCESS, got %d\n", res);
7678
7679     if (res == ERROR_SUCCESS)
7680     {
7681         res = RegSetValueExA(users, "Value1", 0, REG_SZ,
7682                              (const BYTE *)"regszdata", 10);
7683         ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7684     }
7685
7686     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine", &hklm);
7687     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7688
7689     res = RegSetValueA(hklm, NULL, REG_SZ, "defvalue", 8);
7690     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7691
7692     res = RegSetValueExA(hklm, "Value1", 0, REG_SZ,
7693                          (const BYTE *)"regszdata", 10);
7694     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7695
7696     val = 42;
7697     res = RegSetValueExA(hklm, "Value2", 0, REG_DWORD,
7698                          (const BYTE *)&val, sizeof(DWORD));
7699     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7700
7701     val = -42;
7702     res = RegSetValueExA(hklm, "Value3", 0, REG_DWORD,
7703                          (const BYTE *)&val, sizeof(DWORD));
7704     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7705
7706     res = RegSetValueExA(hklm, "Value4", 0, REG_EXPAND_SZ,
7707                          (const BYTE *)"%PATH%", 7);
7708     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7709
7710     res = RegSetValueExA(hklm, "Value5", 0, REG_EXPAND_SZ,
7711                          (const BYTE *)"my%NOVAR%", 10);
7712     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7713
7714     res = RegSetValueExA(hklm, "Value6", 0, REG_MULTI_SZ,
7715                          (const BYTE *)"one\0two\0", 9);
7716     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7717
7718     binary[0] = 0x1234abcd;
7719     binary[1] = 0x567890ef;
7720     res = RegSetValueExA(hklm, "Value7", 0, REG_BINARY,
7721                          (const BYTE *)binary, sizeof(binary));
7722     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7723
7724     res = RegSetValueExA(hklm, "Value8", 0, REG_SZ,
7725                          (const BYTE *)"#regszdata", 11);
7726     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7727
7728     create_test_file("FileName1");
7729     sprintf(path, "%s\\FileName1", CURR_DIR);
7730     res = RegSetValueExA(hklm, "Value9", 0, REG_SZ,
7731                          (const BYTE *)path, lstrlenA(path) + 1);
7732     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7733
7734     sprintf(path, "%s\\FileName2", CURR_DIR);
7735     res = RegSetValueExA(hklm, "Value10", 0, REG_SZ,
7736                          (const BYTE *)path, lstrlenA(path) + 1);
7737     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7738
7739     lstrcpyA(path, CURR_DIR);
7740     res = RegSetValueExA(hklm, "Value11", 0, REG_SZ,
7741                          (const BYTE *)path, lstrlenA(path) + 1);
7742     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7743
7744     res = RegSetValueExA(hklm, "Value12", 0, REG_SZ,
7745                          (const BYTE *)"", 1);
7746     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7747
7748     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7749     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
7750     res = RegSetValueExA(hklm, "Value13", 0, REG_SZ,
7751                          (const BYTE *)path, lstrlenA(path) + 1);
7752     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7753
7754     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
7755     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
7756     res = RegSetValueExA(hklm, "Value14", 0, REG_SZ,
7757                          (const BYTE *)path, lstrlenA(path) + 1);
7758     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7759
7760     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7761     sprintf(path, "%s\\FileName5.dll", CURR_DIR);
7762     res = RegSetValueExA(hklm, "Value15", 0, REG_SZ,
7763                          (const BYTE *)path, lstrlenA(path) + 1);
7764     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7765
7766     sprintf(path, "\"%s\\FileName1\" -option", CURR_DIR);
7767     res = RegSetValueExA(hklm, "value16", 0, REG_SZ,
7768                          (const BYTE *)path, lstrlenA(path) + 1);
7769
7770     space = (strchr(CURR_DIR, ' ')) ? TRUE : FALSE;
7771     sprintf(path, "%s\\FileName1 -option", CURR_DIR);
7772     res = RegSetValueExA(hklm, "value17", 0, REG_SZ,
7773                          (const BYTE *)path, lstrlenA(path) + 1);
7774
7775     hdb = create_package_db();
7776     ok(hdb, "Expected a valid database handle\n");
7777
7778     r = create_appsearch_table(hdb);
7779     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7780
7781     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
7782     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7783
7784     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
7785     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7786
7787     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
7788     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7789
7790     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
7791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7792
7793     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
7794     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7795
7796     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
7797     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7798
7799     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
7800     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7801
7802     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
7803     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7804
7805     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
7806     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7807
7808     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
7809     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7810
7811     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
7812     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7813
7814     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
7815     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7816
7817     r = add_appsearch_entry(hdb, "'SIGPROP13', 'NewSignature13'");
7818     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7819
7820     r = add_appsearch_entry(hdb, "'SIGPROP14', 'NewSignature14'");
7821     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7822
7823     r = add_appsearch_entry(hdb, "'SIGPROP15', 'NewSignature15'");
7824     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7825
7826     r = add_appsearch_entry(hdb, "'SIGPROP16', 'NewSignature16'");
7827     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7828
7829     r = add_appsearch_entry(hdb, "'SIGPROP17', 'NewSignature17'");
7830     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7831
7832     r = add_appsearch_entry(hdb, "'SIGPROP18', 'NewSignature18'");
7833     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7834
7835     r = add_appsearch_entry(hdb, "'SIGPROP19', 'NewSignature19'");
7836     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7837
7838     r = add_appsearch_entry(hdb, "'SIGPROP20', 'NewSignature20'");
7839     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7840
7841     r = add_appsearch_entry(hdb, "'SIGPROP21', 'NewSignature21'");
7842     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7843
7844     r = add_appsearch_entry(hdb, "'SIGPROP22', 'NewSignature22'");
7845     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7846
7847     r = add_appsearch_entry(hdb, "'SIGPROP23', 'NewSignature23'");
7848     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7849
7850     r = add_appsearch_entry(hdb, "'SIGPROP24', 'NewSignature24'");
7851     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7852
7853     r = add_appsearch_entry(hdb, "'SIGPROP25', 'NewSignature25'");
7854     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7855
7856     r = add_appsearch_entry(hdb, "'SIGPROP26', 'NewSignature26'");
7857     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7858
7859     r = add_appsearch_entry(hdb, "'SIGPROP27', 'NewSignature27'");
7860     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7861
7862     r = add_appsearch_entry(hdb, "'SIGPROP28', 'NewSignature28'");
7863     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7864
7865     r = add_appsearch_entry(hdb, "'SIGPROP29', 'NewSignature29'");
7866     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7867
7868     r = add_appsearch_entry(hdb, "'SIGPROP30', 'NewSignature30'");
7869     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7870
7871     r = create_reglocator_table(hdb);
7872     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7873
7874     /* HKLM, msidbLocatorTypeRawValue, REG_SZ */
7875     str = "'NewSignature1', 2, 'Software\\Wine', 'Value1', 2";
7876     r = add_reglocator_entry(hdb, str);
7877     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7878
7879     /* HKLM, msidbLocatorTypeRawValue, positive DWORD */
7880     str = "'NewSignature2', 2, 'Software\\Wine', 'Value2', 2";
7881     r = add_reglocator_entry(hdb, str);
7882     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7883
7884     /* HKLM, msidbLocatorTypeRawValue, negative DWORD */
7885     str = "'NewSignature3', 2, 'Software\\Wine', 'Value3', 2";
7886     r = add_reglocator_entry(hdb, str);
7887     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7888
7889     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
7890     str = "'NewSignature4', 2, 'Software\\Wine', 'Value4', 2";
7891     r = add_reglocator_entry(hdb, str);
7892     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7893
7894     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
7895     str = "'NewSignature5', 2, 'Software\\Wine', 'Value5', 2";
7896     r = add_reglocator_entry(hdb, str);
7897     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7898
7899     /* HKLM, msidbLocatorTypeRawValue, REG_MULTI_SZ */
7900     str = "'NewSignature6', 2, 'Software\\Wine', 'Value6', 2";
7901     r = add_reglocator_entry(hdb, str);
7902     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7903
7904     /* HKLM, msidbLocatorTypeRawValue, REG_BINARY */
7905     str = "'NewSignature7', 2, 'Software\\Wine', 'Value7', 2";
7906     r = add_reglocator_entry(hdb, str);
7907     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7908
7909     /* HKLM, msidbLocatorTypeRawValue, REG_SZ first char is # */
7910     str = "'NewSignature8', 2, 'Software\\Wine', 'Value8', 2";
7911     r = add_reglocator_entry(hdb, str);
7912     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7913
7914     /* HKLM, msidbLocatorTypeFileName, signature, file exists */
7915     str = "'NewSignature9', 2, 'Software\\Wine', 'Value9', 1";
7916     r = add_reglocator_entry(hdb, str);
7917     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7918
7919     /* HKLM, msidbLocatorTypeFileName, signature, file does not exist */
7920     str = "'NewSignature10', 2, 'Software\\Wine', 'Value10', 1";
7921     r = add_reglocator_entry(hdb, str);
7922     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7923
7924     /* HKLM, msidbLocatorTypeFileName, no signature */
7925     str = "'NewSignature11', 2, 'Software\\Wine', 'Value9', 1";
7926     r = add_reglocator_entry(hdb, str);
7927     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7928
7929     /* HKLM, msidbLocatorTypeDirectory, no signature, file exists */
7930     str = "'NewSignature12', 2, 'Software\\Wine', 'Value9', 0";
7931     r = add_reglocator_entry(hdb, str);
7932     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7933
7934     /* HKLM, msidbLocatorTypeDirectory, no signature, directory exists */
7935     str = "'NewSignature13', 2, 'Software\\Wine', 'Value11', 0";
7936     r = add_reglocator_entry(hdb, str);
7937     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7938
7939     /* HKLM, msidbLocatorTypeDirectory, signature, file exists */
7940     str = "'NewSignature14', 2, 'Software\\Wine', 'Value9', 0";
7941     r = add_reglocator_entry(hdb, str);
7942     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7943
7944     /* HKCR, msidbLocatorTypeRawValue, REG_SZ */
7945     str = "'NewSignature15', 0, 'Software\\Wine', 'Value1', 2";
7946     r = add_reglocator_entry(hdb, str);
7947     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7948
7949     /* HKCU, msidbLocatorTypeRawValue, REG_SZ */
7950     str = "'NewSignature16', 1, 'Software\\Wine', 'Value1', 2";
7951     r = add_reglocator_entry(hdb, str);
7952     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7953
7954     /* HKU, msidbLocatorTypeRawValue, REG_SZ */
7955     str = "'NewSignature17', 3, 'S-1-5-18\\Software\\Wine', 'Value1', 2";
7956     r = add_reglocator_entry(hdb, str);
7957     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7958
7959     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, NULL Name */
7960     str = "'NewSignature18', 2, 'Software\\Wine', '', 2";
7961     r = add_reglocator_entry(hdb, str);
7962     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7963
7964     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, key does not exist */
7965     str = "'NewSignature19', 2, 'Software\\IDontExist', '', 2";
7966     r = add_reglocator_entry(hdb, str);
7967     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7968
7969     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, value is empty */
7970     str = "'NewSignature20', 2, 'Software\\Wine', 'Value12', 2";
7971     r = add_reglocator_entry(hdb, str);
7972     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7973
7974     /* HKLM, msidbLocatorTypeFileName, signature, file exists w/ version */
7975     str = "'NewSignature21', 2, 'Software\\Wine', 'Value13', 1";
7976     r = add_reglocator_entry(hdb, str);
7977     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7978
7979     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, version > max */
7980     str = "'NewSignature22', 2, 'Software\\Wine', 'Value14', 1";
7981     r = add_reglocator_entry(hdb, str);
7982     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7983
7984     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, sig->name ignored */
7985     str = "'NewSignature23', 2, 'Software\\Wine', 'Value15', 1";
7986     r = add_reglocator_entry(hdb, str);
7987     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7988
7989     /* HKLM, msidbLocatorTypeFileName, no signature, directory exists */
7990     str = "'NewSignature24', 2, 'Software\\Wine', 'Value11', 1";
7991     r = add_reglocator_entry(hdb, str);
7992     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7993
7994     /* HKLM, msidbLocatorTypeFileName, no signature, file does not exist */
7995     str = "'NewSignature25', 2, 'Software\\Wine', 'Value10', 1";
7996     r = add_reglocator_entry(hdb, str);
7997     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7998
7999     /* HKLM, msidbLocatorTypeDirectory, signature, directory exists */
8000     str = "'NewSignature26', 2, 'Software\\Wine', 'Value11', 0";
8001     r = add_reglocator_entry(hdb, str);
8002     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8003
8004     /* HKLM, msidbLocatorTypeDirectory, signature, file does not exist */
8005     str = "'NewSignature27', 2, 'Software\\Wine', 'Value10', 0";
8006     r = add_reglocator_entry(hdb, str);
8007     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8008
8009     /* HKLM, msidbLocatorTypeDirectory, no signature, file does not exist */
8010     str = "'NewSignature28', 2, 'Software\\Wine', 'Value10', 0";
8011     r = add_reglocator_entry(hdb, str);
8012     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8013
8014     /* HKLM, msidbLocatorTypeFile, file exists, in quotes */
8015     str = "'NewSignature29', 2, 'Software\\Wine', 'Value16', 1";
8016     r = add_reglocator_entry(hdb, str);
8017     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8018
8019     /* HKLM, msidbLocatorTypeFile, file exists, no quotes */
8020     str = "'NewSignature30', 2, 'Software\\Wine', 'Value17', 1";
8021     r = add_reglocator_entry(hdb, str);
8022     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8023
8024     r = create_signature_table(hdb);
8025     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8026
8027     str = "'NewSignature9', 'FileName1', '', '', '', '', '', '', ''";
8028     r = add_signature_entry(hdb, str);
8029     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8030
8031     str = "'NewSignature10', 'FileName2', '', '', '', '', '', '', ''";
8032     r = add_signature_entry(hdb, str);
8033     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8034
8035     str = "'NewSignature14', 'FileName1', '', '', '', '', '', '', ''";
8036     r = add_signature_entry(hdb, str);
8037     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8038
8039     str = "'NewSignature21', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8040     r = add_signature_entry(hdb, str);
8041     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8042
8043     str = "'NewSignature22', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8044     r = add_signature_entry(hdb, str);
8045     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8046
8047     str = "'NewSignature23', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8048     r = add_signature_entry(hdb, str);
8049     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8050
8051     ptr = strrchr(CURR_DIR, '\\') + 1;
8052     sprintf(path, "'NewSignature26', '%s', '', '', '', '', '', '', ''", ptr);
8053     r = add_signature_entry(hdb, path);
8054     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8055
8056     str = "'NewSignature27', 'FileName2', '', '', '', '', '', '', ''";
8057     r = add_signature_entry(hdb, str);
8058     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8059
8060     str = "'NewSignature29', 'FileName1', '', '', '', '', '', '', ''";
8061     r = add_signature_entry(hdb, str);
8062     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8063
8064     str = "'NewSignature30', 'FileName1', '', '', '', '', '', '', ''";
8065     r = add_signature_entry(hdb, str);
8066     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8067
8068     hpkg = package_from_db(hdb);
8069     ok(hpkg, "Expected a valid package handle\n");
8070
8071     r = MsiDoAction(hpkg, "AppSearch");
8072     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8073
8074     size = MAX_PATH;
8075     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8076     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8077     ok(!lstrcmpA(prop, "regszdata"),
8078        "Expected \"regszdata\", got \"%s\"\n", prop);
8079
8080     size = MAX_PATH;
8081     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8082     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8083     ok(!lstrcmpA(prop, "#42"), "Expected \"#42\", got \"%s\"\n", prop);
8084
8085     size = MAX_PATH;
8086     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8087     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8088     ok(!lstrcmpA(prop, "#-42"), "Expected \"#-42\", got \"%s\"\n", prop);
8089
8090     size = ExpandEnvironmentStringsA("%PATH%", NULL, 0);
8091     if (size == 0 && GetLastError() == ERROR_INVALID_PARAMETER)
8092     {
8093         /* Workaround for Win95 */
8094         CHAR tempbuf[1];
8095         size = ExpandEnvironmentStringsA("%PATH%", tempbuf, 0);
8096     }
8097     pathvar = HeapAlloc(GetProcessHeap(), 0, size);
8098     ExpandEnvironmentStringsA("%PATH%", pathvar, size);
8099
8100     size = 0;
8101     r = MsiGetPropertyA(hpkg, "SIGPROP4", NULL, &size);
8102     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8103
8104     pathdata = HeapAlloc(GetProcessHeap(), 0, ++size);
8105     r = MsiGetPropertyA(hpkg, "SIGPROP4", pathdata, &size);
8106     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8107     ok(!lstrcmpA(pathdata, pathvar),
8108        "Expected \"%s\", got \"%s\"\n", pathvar, pathdata);
8109
8110     HeapFree(GetProcessHeap(), 0, pathvar);
8111     HeapFree(GetProcessHeap(), 0, pathdata);
8112
8113     size = MAX_PATH;
8114     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8115     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8116     ok(!lstrcmpA(prop,
8117        "my%NOVAR%"), "Expected \"my%%NOVAR%%\", got \"%s\"\n", prop);
8118
8119     size = MAX_PATH;
8120     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8121     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8122     todo_wine
8123     {
8124         ok(!memcmp(prop, "\0one\0two\0\0", 10),
8125            "Expected \"\\0one\\0two\\0\\0\"\n");
8126     }
8127
8128     size = MAX_PATH;
8129     lstrcpyA(path, "#xCDAB3412EF907856");
8130     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8131     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8132     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8133
8134     size = MAX_PATH;
8135     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8136     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8137     ok(!lstrcmpA(prop, "##regszdata"),
8138        "Expected \"##regszdata\", got \"%s\"\n", prop);
8139
8140     size = MAX_PATH;
8141     sprintf(path, "%s\\FileName1", CURR_DIR);
8142     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8143     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8144     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8145
8146     size = MAX_PATH;
8147     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8148     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8149     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8150
8151     size = MAX_PATH;
8152     sprintf(path, "%s\\", CURR_DIR);
8153     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8154     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8155     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8156
8157     size = MAX_PATH;
8158     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
8159     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8160     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8161
8162     size = MAX_PATH;
8163     sprintf(path, "%s\\", CURR_DIR);
8164     r = MsiGetPropertyA(hpkg, "SIGPROP13", prop, &size);
8165     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8166     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8167
8168     size = MAX_PATH;
8169     r = MsiGetPropertyA(hpkg, "SIGPROP14", prop, &size);
8170     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8171     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8172
8173     size = MAX_PATH;
8174     r = MsiGetPropertyA(hpkg, "SIGPROP15", prop, &size);
8175     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8176     ok(!lstrcmpA(prop, "regszdata"),
8177        "Expected \"regszdata\", got \"%s\"\n", prop);
8178
8179     size = MAX_PATH;
8180     r = MsiGetPropertyA(hpkg, "SIGPROP16", prop, &size);
8181     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8182     ok(!lstrcmpA(prop, "regszdata"),
8183        "Expected \"regszdata\", got \"%s\"\n", prop);
8184
8185     if (users)
8186     {
8187         size = MAX_PATH;
8188         r = MsiGetPropertyA(hpkg, "SIGPROP17", prop, &size);
8189         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8190         ok(!lstrcmpA(prop, "regszdata"),
8191            "Expected \"regszdata\", got \"%s\"\n", prop);
8192     }
8193
8194     size = MAX_PATH;
8195     r = MsiGetPropertyA(hpkg, "SIGPROP18", prop, &size);
8196     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8197     ok(!lstrcmpA(prop, "defvalue"),
8198        "Expected \"defvalue\", got \"%s\"\n", prop);
8199
8200     size = MAX_PATH;
8201     r = MsiGetPropertyA(hpkg, "SIGPROP19", prop, &size);
8202     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8203     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8204
8205     size = MAX_PATH;
8206     r = MsiGetPropertyA(hpkg, "SIGPROP20", prop, &size);
8207     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8208     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8209
8210     if (version)
8211     {
8212         size = MAX_PATH;
8213         sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8214         r = MsiGetPropertyA(hpkg, "SIGPROP21", prop, &size);
8215         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8216         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8217
8218         size = MAX_PATH;
8219         r = MsiGetPropertyA(hpkg, "SIGPROP22", prop, &size);
8220         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8221         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8222
8223         size = MAX_PATH;
8224         sprintf(path, "%s\\FileName5.dll", CURR_DIR);
8225         r = MsiGetPropertyA(hpkg, "SIGPROP23", prop, &size);
8226         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8227         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8228     }
8229
8230     size = MAX_PATH;
8231     lstrcpyA(path, CURR_DIR);
8232     ptr = strrchr(path, '\\') + 1;
8233     *ptr = '\0';
8234     r = MsiGetPropertyA(hpkg, "SIGPROP24", prop, &size);
8235     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8236     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8237
8238     size = MAX_PATH;
8239     sprintf(path, "%s\\", CURR_DIR);
8240     r = MsiGetPropertyA(hpkg, "SIGPROP25", prop, &size);
8241     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8242     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8243
8244     size = MAX_PATH;
8245     r = MsiGetPropertyA(hpkg, "SIGPROP26", prop, &size);
8246     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8247     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8248
8249     size = MAX_PATH;
8250     r = MsiGetPropertyA(hpkg, "SIGPROP27", prop, &size);
8251     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8252     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8253
8254     size = MAX_PATH;
8255     r = MsiGetPropertyA(hpkg, "SIGPROP28", prop, &size);
8256     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8257     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8258
8259     size = MAX_PATH;
8260     sprintf(path, "%s\\FileName1", CURR_DIR);
8261     r = MsiGetPropertyA(hpkg, "SIGPROP29", prop, &size);
8262     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8263     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8264
8265     size = MAX_PATH;
8266     sprintf(path, "%s\\FileName1", CURR_DIR);
8267     r = MsiGetPropertyA(hpkg, "SIGPROP30", prop, &size);
8268     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8269     if (space)
8270         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8271     else
8272         todo_wine ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8273
8274     RegSetValueA(hklm, NULL, REG_SZ, "", 0);
8275     RegDeleteValueA(hklm, "Value1");
8276     RegDeleteValueA(hklm, "Value2");
8277     RegDeleteValueA(hklm, "Value3");
8278     RegDeleteValueA(hklm, "Value4");
8279     RegDeleteValueA(hklm, "Value5");
8280     RegDeleteValueA(hklm, "Value6");
8281     RegDeleteValueA(hklm, "Value7");
8282     RegDeleteValueA(hklm, "Value8");
8283     RegDeleteValueA(hklm, "Value9");
8284     RegDeleteValueA(hklm, "Value10");
8285     RegDeleteValueA(hklm, "Value11");
8286     RegDeleteValueA(hklm, "Value12");
8287     RegDeleteValueA(hklm, "Value13");
8288     RegDeleteValueA(hklm, "Value14");
8289     RegDeleteValueA(hklm, "Value15");
8290     RegDeleteValueA(hklm, "Value16");
8291     RegDeleteValueA(hklm, "Value17");
8292     RegDeleteKeyA(hklm, "");
8293     RegCloseKey(hklm);
8294
8295     RegDeleteValueA(classes, "Value1");
8296     RegDeleteKeyA(classes, "");
8297     RegCloseKey(classes);
8298
8299     RegDeleteValueA(hkcu, "Value1");
8300     RegDeleteKeyA(hkcu, "");
8301     RegCloseKey(hkcu);
8302
8303     RegDeleteValueA(users, "Value1");
8304     RegDeleteKeyA(users, "");
8305     RegCloseKey(users);
8306
8307     DeleteFileA("FileName1");
8308     DeleteFileA("FileName3.dll");
8309     DeleteFileA("FileName4.dll");
8310     DeleteFileA("FileName5.dll");
8311     MsiCloseHandle(hpkg);
8312     DeleteFileA(msifile);
8313 }
8314
8315 static void delete_win_ini(LPCSTR file)
8316 {
8317     CHAR path[MAX_PATH];
8318
8319     GetWindowsDirectoryA(path, MAX_PATH);
8320     lstrcatA(path, "\\");
8321     lstrcatA(path, file);
8322
8323     DeleteFileA(path);
8324 }
8325
8326 static void test_appsearch_inilocator(void)
8327 {
8328     MSIHANDLE hpkg, hdb;
8329     CHAR path[MAX_PATH];
8330     CHAR prop[MAX_PATH];
8331     BOOL version;
8332     LPCSTR str;
8333     LPSTR ptr;
8334     DWORD size;
8335     UINT r;
8336
8337     version = TRUE;
8338     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
8339         version = FALSE;
8340
8341     DeleteFileA("test.dll");
8342
8343     WritePrivateProfileStringA("Section", "Key", "keydata,field2", "IniFile.ini");
8344
8345     create_test_file("FileName1");
8346     sprintf(path, "%s\\FileName1", CURR_DIR);
8347     WritePrivateProfileStringA("Section", "Key2", path, "IniFile.ini");
8348
8349     WritePrivateProfileStringA("Section", "Key3", CURR_DIR, "IniFile.ini");
8350
8351     sprintf(path, "%s\\IDontExist", CURR_DIR);
8352     WritePrivateProfileStringA("Section", "Key4", path, "IniFile.ini");
8353
8354     create_file_with_version("FileName2.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8355     sprintf(path, "%s\\FileName2.dll", CURR_DIR);
8356     WritePrivateProfileStringA("Section", "Key5", path, "IniFile.ini");
8357
8358     create_file_with_version("FileName3.dll", MAKELONG(1, 2), MAKELONG(3, 4));
8359     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8360     WritePrivateProfileStringA("Section", "Key6", path, "IniFile.ini");
8361
8362     create_file_with_version("FileName4.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8363     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
8364     WritePrivateProfileStringA("Section", "Key7", path, "IniFile.ini");
8365
8366     hdb = create_package_db();
8367     ok(hdb, "Expected a valid database handle\n");
8368
8369     r = create_appsearch_table(hdb);
8370     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8371
8372     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
8373     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8374
8375     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
8376     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8377
8378     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
8379     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8380
8381     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
8382     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8383
8384     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
8385     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8386
8387     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
8388     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8389
8390     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
8391     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8392
8393     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
8394     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8395
8396     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
8397     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8398
8399     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
8400     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8401
8402     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
8403     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8404
8405     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
8406     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8407
8408     r = create_inilocator_table(hdb);
8409     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8410
8411     /* msidbLocatorTypeRawValue, field 1 */
8412     str = "'NewSignature1', 'IniFile.ini', 'Section', 'Key', 1, 2";
8413     r = add_inilocator_entry(hdb, str);
8414     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8415
8416     /* msidbLocatorTypeRawValue, field 2 */
8417     str = "'NewSignature2', 'IniFile.ini', 'Section', 'Key', 2, 2";
8418     r = add_inilocator_entry(hdb, str);
8419     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8420
8421     /* msidbLocatorTypeRawValue, entire field */
8422     str = "'NewSignature3', 'IniFile.ini', 'Section', 'Key', 0, 2";
8423     r = add_inilocator_entry(hdb, str);
8424     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8425
8426     /* msidbLocatorTypeFile */
8427     str = "'NewSignature4', 'IniFile.ini', 'Section', 'Key2', 1, 1";
8428     r = add_inilocator_entry(hdb, str);
8429     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8430
8431     /* msidbLocatorTypeDirectory, file */
8432     str = "'NewSignature5', 'IniFile.ini', 'Section', 'Key2', 1, 0";
8433     r = add_inilocator_entry(hdb, str);
8434     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8435
8436     /* msidbLocatorTypeDirectory, directory */
8437     str = "'NewSignature6', 'IniFile.ini', 'Section', 'Key3', 1, 0";
8438     r = add_inilocator_entry(hdb, str);
8439     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8440
8441     /* msidbLocatorTypeFile, file, no signature */
8442     str = "'NewSignature7', 'IniFile.ini', 'Section', 'Key2', 1, 1";
8443     r = add_inilocator_entry(hdb, str);
8444     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8445
8446     /* msidbLocatorTypeFile, dir, no signature */
8447     str = "'NewSignature8', 'IniFile.ini', 'Section', 'Key3', 1, 1";
8448     r = add_inilocator_entry(hdb, str);
8449     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8450
8451     /* msidbLocatorTypeFile, file does not exist */
8452     str = "'NewSignature9', 'IniFile.ini', 'Section', 'Key4', 1, 1";
8453     r = add_inilocator_entry(hdb, str);
8454     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8455
8456     /* msidbLocatorTypeFile, signature with version */
8457     str = "'NewSignature10', 'IniFile.ini', 'Section', 'Key5', 1, 1";
8458     r = add_inilocator_entry(hdb, str);
8459     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8460
8461     /* msidbLocatorTypeFile, signature with version, ver > max */
8462     str = "'NewSignature11', 'IniFile.ini', 'Section', 'Key6', 1, 1";
8463     r = add_inilocator_entry(hdb, str);
8464     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8465
8466     /* msidbLocatorTypeFile, signature with version, sig->name ignored */
8467     str = "'NewSignature12', 'IniFile.ini', 'Section', 'Key7', 1, 1";
8468     r = add_inilocator_entry(hdb, str);
8469     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8470
8471     r = create_signature_table(hdb);
8472     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8473
8474     r = add_signature_entry(hdb, "'NewSignature4', 'FileName1', '', '', '', '', '', '', ''");
8475     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8476
8477     r = add_signature_entry(hdb, "'NewSignature9', 'IDontExist', '', '', '', '', '', '', ''");
8478     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8479
8480     r = add_signature_entry(hdb, "'NewSignature10', 'FileName2.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8481     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8482
8483     r = add_signature_entry(hdb, "'NewSignature11', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8484     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8485
8486     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8487     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8488
8489     hpkg = package_from_db(hdb);
8490     ok(hpkg, "Expected a valid package handle\n");
8491
8492     r = MsiDoAction(hpkg, "AppSearch");
8493     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8494
8495     size = MAX_PATH;
8496     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8497     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8498     ok(!lstrcmpA(prop, "keydata"), "Expected \"keydata\", got \"%s\"\n", prop);
8499
8500     size = MAX_PATH;
8501     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8502     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8503     ok(!lstrcmpA(prop, "field2"), "Expected \"field2\", got \"%s\"\n", prop);
8504
8505     size = MAX_PATH;
8506     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8507     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8508     ok(!lstrcmpA(prop, "keydata,field2"),
8509        "Expected \"keydata,field2\", got \"%s\"\n", prop);
8510
8511     size = MAX_PATH;
8512     sprintf(path, "%s\\FileName1", CURR_DIR);
8513     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
8514     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8515     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8516
8517     size = MAX_PATH;
8518     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8519     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8520     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8521
8522     size = MAX_PATH;
8523     sprintf(path, "%s\\", CURR_DIR);
8524     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8525     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8526     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8527
8528     size = MAX_PATH;
8529     sprintf(path, "%s\\", CURR_DIR);
8530     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8531     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8532     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8533
8534     size = MAX_PATH;
8535     lstrcpyA(path, CURR_DIR);
8536     ptr = strrchr(path, '\\');
8537     *(ptr + 1) = '\0';
8538     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8539     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8540     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8541
8542     size = MAX_PATH;
8543     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8544     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8545     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8546
8547     if (version)
8548     {
8549         size = MAX_PATH;
8550         sprintf(path, "%s\\FileName2.dll", CURR_DIR);
8551         r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8552         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8553         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8554
8555         size = MAX_PATH;
8556         r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8557         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8558         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8559
8560         size = MAX_PATH;
8561         sprintf(path, "%s\\FileName4.dll", CURR_DIR);
8562         r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
8563         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8564         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8565     }
8566
8567     delete_win_ini("IniFile.ini");
8568     DeleteFileA("FileName1");
8569     DeleteFileA("FileName2.dll");
8570     DeleteFileA("FileName3.dll");
8571     DeleteFileA("FileName4.dll");
8572     MsiCloseHandle(hpkg);
8573     DeleteFileA(msifile);
8574 }
8575
8576 /*
8577  * MSI AppSearch action on DrLocator table always returns absolute paths.
8578  * If a relative path was set, it returns the first absolute path that
8579  * matches or an empty string if it didn't find anything.
8580  * This helper function replicates this behaviour.
8581  */
8582 static void search_absolute_directory(LPSTR absolute, LPCSTR relative)
8583 {
8584     int i, size;
8585     DWORD attr, drives;
8586
8587     size = lstrlenA(relative);
8588     drives = GetLogicalDrives();
8589     lstrcpyA(absolute, "A:\\");
8590     for (i = 0; i < 26; absolute[0] = '\0', i++)
8591     {
8592         if (!(drives & (1 << i)))
8593             continue;
8594
8595         absolute[0] = 'A' + i;
8596         if (GetDriveType(absolute) != DRIVE_FIXED)
8597             continue;
8598
8599         lstrcpynA(absolute + 3, relative, size + 1);
8600         attr = GetFileAttributesA(absolute);
8601         if (attr != INVALID_FILE_ATTRIBUTES &&
8602             (attr & FILE_ATTRIBUTE_DIRECTORY))
8603         {
8604             if (absolute[3 + size - 1] != '\\')
8605                 lstrcatA(absolute, "\\");
8606             break;
8607         }
8608         absolute[3] = '\0';
8609     }
8610 }
8611
8612 static void test_appsearch_drlocator(void)
8613 {
8614     MSIHANDLE hpkg, hdb;
8615     CHAR path[MAX_PATH];
8616     CHAR prop[MAX_PATH];
8617     BOOL version;
8618     LPCSTR str;
8619     DWORD size;
8620     UINT r;
8621
8622     version = TRUE;
8623     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
8624         version = FALSE;
8625
8626     DeleteFileA("test.dll");
8627
8628     create_test_file("FileName1");
8629     CreateDirectoryA("one", NULL);
8630     CreateDirectoryA("one\\two", NULL);
8631     CreateDirectoryA("one\\two\\three", NULL);
8632     create_test_file("one\\two\\three\\FileName2");
8633     CreateDirectoryA("another", NULL);
8634     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8635     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
8636     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8637
8638     hdb = create_package_db();
8639     ok(hdb, "Expected a valid database handle\n");
8640
8641     r = create_appsearch_table(hdb);
8642     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8643
8644     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
8645     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8646
8647     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
8648     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8649
8650     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
8651     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8652
8653     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
8654     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8655
8656     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
8657     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8658
8659     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
8660     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8661
8662     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
8663     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8664
8665     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
8666     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8667
8668     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
8669     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8670
8671     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
8672     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8673
8674     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
8675     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8676
8677     r = create_drlocator_table(hdb);
8678     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8679
8680     /* no parent, full path, depth 0, signature */
8681     sprintf(path, "'NewSignature1', '', '%s', 0", CURR_DIR);
8682     r = add_drlocator_entry(hdb, path);
8683     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8684
8685     /* no parent, full path, depth 0, no signature */
8686     sprintf(path, "'NewSignature2', '', '%s', 0", CURR_DIR);
8687     r = add_drlocator_entry(hdb, path);
8688     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8689
8690     /* no parent, relative path, depth 0, no signature */
8691     sprintf(path, "'NewSignature3', '', '%s', 0", CURR_DIR + 3);
8692     r = add_drlocator_entry(hdb, path);
8693     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8694
8695     /* no parent, full path, depth 2, signature */
8696     sprintf(path, "'NewSignature4', '', '%s', 2", CURR_DIR);
8697     r = add_drlocator_entry(hdb, path);
8698     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8699
8700     /* no parent, full path, depth 3, signature */
8701     sprintf(path, "'NewSignature5', '', '%s', 3", CURR_DIR);
8702     r = add_drlocator_entry(hdb, path);
8703     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8704
8705     /* no parent, full path, depth 1, signature is dir */
8706     sprintf(path, "'NewSignature6', '', '%s', 1", CURR_DIR);
8707     r = add_drlocator_entry(hdb, path);
8708     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8709
8710     /* parent is in DrLocator, relative path, depth 0, signature */
8711     sprintf(path, "'NewSignature7', 'NewSignature1', 'one\\two\\three', 1");
8712     r = add_drlocator_entry(hdb, path);
8713     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8714
8715     /* no parent, full path, depth 0, signature w/ version */
8716     sprintf(path, "'NewSignature8', '', '%s', 0", CURR_DIR);
8717     r = add_drlocator_entry(hdb, path);
8718     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8719
8720     /* no parent, full path, depth 0, signature w/ version, ver > max */
8721     sprintf(path, "'NewSignature9', '', '%s', 0", CURR_DIR);
8722     r = add_drlocator_entry(hdb, path);
8723     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8724
8725     /* no parent, full path, depth 0, signature w/ version, sig->name not ignored */
8726     sprintf(path, "'NewSignature10', '', '%s', 0", CURR_DIR);
8727     r = add_drlocator_entry(hdb, path);
8728     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8729
8730     /* no parent, relative empty path, depth 0, no signature */
8731     sprintf(path, "'NewSignature11', '', '', 0");
8732     r = add_drlocator_entry(hdb, path);
8733     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8734
8735     r = create_signature_table(hdb);
8736     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8737
8738     str = "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''";
8739     r = add_signature_entry(hdb, str);
8740     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8741
8742     str = "'NewSignature4', 'FileName2', '', '', '', '', '', '', ''";
8743     r = add_signature_entry(hdb, str);
8744     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8745
8746     str = "'NewSignature5', 'FileName2', '', '', '', '', '', '', ''";
8747     r = add_signature_entry(hdb, str);
8748     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8749
8750     str = "'NewSignature6', 'another', '', '', '', '', '', '', ''";
8751     r = add_signature_entry(hdb, str);
8752     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8753
8754     str = "'NewSignature7', 'FileName2', '', '', '', '', '', '', ''";
8755     r = add_signature_entry(hdb, str);
8756     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8757
8758     str = "'NewSignature8', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8759     r = add_signature_entry(hdb, str);
8760     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8761
8762     str = "'NewSignature9', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8763     r = add_signature_entry(hdb, str);
8764     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8765
8766     str = "'NewSignature10', 'necessary', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8767     r = add_signature_entry(hdb, str);
8768     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8769
8770     hpkg = package_from_db(hdb);
8771     ok(hpkg, "Expected a valid package handle\n");
8772
8773     r = MsiDoAction(hpkg, "AppSearch");
8774     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8775
8776     size = MAX_PATH;
8777     sprintf(path, "%s\\FileName1", CURR_DIR);
8778     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8779     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8780     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8781
8782     size = MAX_PATH;
8783     sprintf(path, "%s\\", CURR_DIR);
8784     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8785     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8786     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8787
8788     size = MAX_PATH;
8789     search_absolute_directory(path, CURR_DIR + 3);
8790     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8792     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8793
8794     size = MAX_PATH;
8795     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
8796     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8797     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8798
8799     size = MAX_PATH;
8800     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
8801     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8802     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8803     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8804
8805     size = MAX_PATH;
8806     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8807     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8808     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8809
8810     size = MAX_PATH;
8811     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
8812     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8813     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8814     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8815
8816     if (version)
8817     {
8818         size = MAX_PATH;
8819         sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8820         r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8821         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8822         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8823
8824         size = MAX_PATH;
8825         r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8826         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8827         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8828
8829         size = MAX_PATH;
8830         r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8831         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8832         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8833     }
8834
8835     size = MAX_PATH;
8836     search_absolute_directory(path, "");
8837     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8838     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8839     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8840
8841     DeleteFileA("FileName1");
8842     DeleteFileA("FileName3.dll");
8843     DeleteFileA("FileName4.dll");
8844     DeleteFileA("FileName5.dll");
8845     DeleteFileA("one\\two\\three\\FileName2");
8846     RemoveDirectoryA("one\\two\\three");
8847     RemoveDirectoryA("one\\two");
8848     RemoveDirectoryA("one");
8849     RemoveDirectoryA("another");
8850     MsiCloseHandle(hpkg);
8851     DeleteFileA(msifile);
8852 }
8853
8854 static void test_featureparents(void)
8855 {
8856     MSIHANDLE hpkg;
8857     UINT r;
8858     MSIHANDLE hdb;
8859     INSTALLSTATE state, action;
8860
8861     hdb = create_package_db();
8862     ok ( hdb, "failed to create package database\n" );
8863
8864     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
8865     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
8866
8867     r = create_feature_table( hdb );
8868     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
8869
8870     r = create_component_table( hdb );
8871     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
8872
8873     r = create_feature_components_table( hdb );
8874     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
8875
8876     r = create_file_table( hdb );
8877     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
8878
8879     /* msidbFeatureAttributesFavorLocal */
8880     r = add_feature_entry( hdb, "'zodiac', '', '', '', 2, 1, '', 0" );
8881     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8882
8883     /* msidbFeatureAttributesFavorSource */
8884     r = add_feature_entry( hdb, "'perseus', '', '', '', 2, 1, '', 1" );
8885     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8886
8887     /* msidbFeatureAttributesFavorLocal */
8888     r = add_feature_entry( hdb, "'orion', '', '', '', 2, 1, '', 0" );
8889     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8890
8891     /* disabled because of install level */
8892     r = add_feature_entry( hdb, "'waters', '', '', '', 15, 101, '', 9" );
8893     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8894
8895     /* child feature of disabled feature */
8896     r = add_feature_entry( hdb, "'bayer', 'waters', '', '', 14, 1, '', 9" );
8897     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8898
8899     /* component of disabled feature (install level) */
8900     r = add_component_entry( hdb, "'delphinus', '', 'TARGETDIR', 0, '', 'delphinus_file'" );
8901     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8902
8903     /* component of disabled child feature (install level) */
8904     r = add_component_entry( hdb, "'hydrus', '', 'TARGETDIR', 0, '', 'hydrus_file'" );
8905     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8906
8907     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
8908     r = add_component_entry( hdb, "'leo', '', 'TARGETDIR', 0, '', 'leo_file'" );
8909     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8910
8911     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
8912     r = add_component_entry( hdb, "'virgo', '', 'TARGETDIR', 1, '', 'virgo_file'" );
8913     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8914
8915     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
8916     r = add_component_entry( hdb, "'libra', '', 'TARGETDIR', 2, '', 'libra_file'" );
8917     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8918
8919     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
8920     r = add_component_entry( hdb, "'cassiopeia', '', 'TARGETDIR', 0, '', 'cassiopeia_file'" );
8921     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8922
8923     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
8924     r = add_component_entry( hdb, "'cepheus', '', 'TARGETDIR', 1, '', 'cepheus_file'" );
8925     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8926
8927     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
8928     r = add_component_entry( hdb, "'andromeda', '', 'TARGETDIR', 2, '', 'andromeda_file'" );
8929     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8930
8931     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
8932     r = add_component_entry( hdb, "'canis', '', 'TARGETDIR', 0, '', 'canis_file'" );
8933     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8934
8935     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
8936     r = add_component_entry( hdb, "'monoceros', '', 'TARGETDIR', 1, '', 'monoceros_file'" );
8937     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8938
8939     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
8940     r = add_component_entry( hdb, "'lepus', '', 'TARGETDIR', 2, '', 'lepus_file'" );
8941
8942     r = add_feature_components_entry( hdb, "'zodiac', 'leo'" );
8943     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8944
8945     r = add_feature_components_entry( hdb, "'zodiac', 'virgo'" );
8946     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8947
8948     r = add_feature_components_entry( hdb, "'zodiac', 'libra'" );
8949     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8950
8951     r = add_feature_components_entry( hdb, "'perseus', 'cassiopeia'" );
8952     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8953
8954     r = add_feature_components_entry( hdb, "'perseus', 'cepheus'" );
8955     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8956
8957     r = add_feature_components_entry( hdb, "'perseus', 'andromeda'" );
8958     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8959
8960     r = add_feature_components_entry( hdb, "'orion', 'leo'" );
8961     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8962
8963     r = add_feature_components_entry( hdb, "'orion', 'virgo'" );
8964     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8965
8966     r = add_feature_components_entry( hdb, "'orion', 'libra'" );
8967     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8968
8969     r = add_feature_components_entry( hdb, "'orion', 'cassiopeia'" );
8970     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8971
8972     r = add_feature_components_entry( hdb, "'orion', 'cepheus'" );
8973     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8974
8975     r = add_feature_components_entry( hdb, "'orion', 'andromeda'" );
8976     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8977
8978     r = add_feature_components_entry( hdb, "'orion', 'canis'" );
8979     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8980
8981     r = add_feature_components_entry( hdb, "'orion', 'monoceros'" );
8982     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8983
8984     r = add_feature_components_entry( hdb, "'orion', 'lepus'" );
8985     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8986
8987     r = add_feature_components_entry( hdb, "'waters', 'delphinus'" );
8988     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8989
8990     r = add_feature_components_entry( hdb, "'bayer', 'hydrus'" );
8991     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
8992
8993     r = add_file_entry( hdb, "'leo_file', 'leo', 'leo.txt', 100, '', '1033', 8192, 1" );
8994     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
8995
8996     r = add_file_entry( hdb, "'virgo_file', 'virgo', 'virgo.txt', 0, '', '1033', 8192, 1" );
8997     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
8998
8999     r = add_file_entry( hdb, "'libra_file', 'libra', 'libra.txt', 0, '', '1033', 8192, 1" );
9000     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9001
9002     r = add_file_entry( hdb, "'cassiopeia_file', 'cassiopeia', 'cassiopeia.txt', 0, '', '1033', 8192, 1" );
9003     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9004
9005     r = add_file_entry( hdb, "'cepheus_file', 'cepheus', 'cepheus.txt', 0, '', '1033', 8192, 1" );
9006     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9007
9008     r = add_file_entry( hdb, "'andromeda_file', 'andromeda', 'andromeda.txt', 0, '', '1033', 8192, 1" );
9009     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9010
9011     r = add_file_entry( hdb, "'canis_file', 'canis', 'canis.txt', 0, '', '1033', 8192, 1" );
9012     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9013
9014     r = add_file_entry( hdb, "'monoceros_file', 'monoceros', 'monoceros.txt', 0, '', '1033', 8192, 1" );
9015     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9016
9017     r = add_file_entry( hdb, "'lepus_file', 'lepus', 'lepus.txt', 0, '', '1033', 8192, 1" );
9018     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9019
9020     r = add_file_entry( hdb, "'delphinus_file', 'delphinus', 'delphinus.txt', 0, '', '1033', 8192, 1" );
9021     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9022
9023     r = add_file_entry( hdb, "'hydrus_file', 'hydrus', 'hydrus.txt', 0, '', '1033', 8192, 1" );
9024     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9025
9026     hpkg = package_from_db( hdb );
9027     ok( hpkg, "failed to create package\n");
9028
9029     MsiCloseHandle( hdb );
9030
9031     r = MsiDoAction( hpkg, "CostInitialize");
9032     ok( r == ERROR_SUCCESS, "cost init failed\n");
9033
9034     r = MsiDoAction( hpkg, "FileCost");
9035     ok( r == ERROR_SUCCESS, "file cost failed\n");
9036
9037     r = MsiDoAction( hpkg, "CostFinalize");
9038     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
9039
9040     state = 0xdeadbee;
9041     action = 0xdeadbee;
9042     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
9043     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9044     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9045     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9046
9047     state = 0xdeadbee;
9048     action = 0xdeadbee;
9049     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
9050     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9051     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9052     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
9053
9054     state = 0xdeadbee;
9055     action = 0xdeadbee;
9056     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
9057     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9058     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9059     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9060
9061     state = 0xdeadbee;
9062     action = 0xdeadbee;
9063     r = MsiGetFeatureState(hpkg, "waters", &state, &action);
9064     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9065     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9066     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
9067
9068     state = 0xdeadbee;
9069     action = 0xdeadbee;
9070     r = MsiGetFeatureState(hpkg, "bayer", &state, &action);
9071     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9072     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9073     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
9074
9075     state = 0xdeadbee;
9076     action = 0xdeadbee;
9077     r = MsiGetComponentState(hpkg, "leo", &state, &action);
9078     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9079     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
9080     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9081
9082     state = 0xdeadbee;
9083     action = 0xdeadbee;
9084     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
9085     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9086     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
9087     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
9088
9089     state = 0xdeadbee;
9090     action = 0xdeadbee;
9091     r = MsiGetComponentState(hpkg, "libra", &state, &action);
9092     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9093     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
9094     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
9095
9096     state = 0xdeadbee;
9097     action = 0xdeadbee;
9098     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
9099     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9100     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
9101     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
9102
9103     state = 0xdeadbee;
9104     action = 0xdeadbee;
9105     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
9106     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9107     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
9108     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
9109
9110     state = 0xdeadbee;
9111     action = 0xdeadbee;
9112     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
9113     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9114     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
9115     ok( action == INSTALLSTATE_LOCAL, "Expected andromeda INSTALLSTATE_LOCAL, got %d\n", action);
9116
9117     state = 0xdeadbee;
9118     action = 0xdeadbee;
9119     r = MsiGetComponentState(hpkg, "canis", &state, &action);
9120     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9121     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
9122     ok( action == INSTALLSTATE_LOCAL, "Expected canis INSTALLSTATE_LOCAL, got %d\n", action);
9123
9124     state = 0xdeadbee;
9125     action = 0xdeadbee;
9126     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
9127     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9128     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
9129     ok( action == INSTALLSTATE_SOURCE, "Expected monoceros INSTALLSTATE_SOURCE, got %d\n", action);
9130
9131     state = 0xdeadbee;
9132     action = 0xdeadbee;
9133     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
9134     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9135     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
9136     ok( action == INSTALLSTATE_LOCAL, "Expected lepus INSTALLSTATE_LOCAL, got %d\n", action);
9137
9138     state = 0xdeadbee;
9139     action = 0xdeadbee;
9140     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
9141     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9142     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
9143     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
9144
9145     state = 0xdeadbee;
9146     action = 0xdeadbee;
9147     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
9148     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9149     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
9150     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
9151
9152     r = MsiSetFeatureState(hpkg, "orion", INSTALLSTATE_ABSENT);
9153     ok( r == ERROR_SUCCESS, "failed to set feature state: %d\n", r);
9154
9155     state = 0xdeadbee;
9156     action = 0xdeadbee;
9157     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
9158     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9159     ok( state == INSTALLSTATE_ABSENT, "Expected zodiac INSTALLSTATE_ABSENT, got %d\n", state);
9160     ok( action == INSTALLSTATE_LOCAL, "Expected zodiac INSTALLSTATE_LOCAL, got %d\n", action);
9161
9162     state = 0xdeadbee;
9163     action = 0xdeadbee;
9164     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
9165     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9166     ok( state == INSTALLSTATE_ABSENT, "Expected perseus INSTALLSTATE_ABSENT, got %d\n", state);
9167     ok( action == INSTALLSTATE_SOURCE, "Expected perseus INSTALLSTATE_SOURCE, got %d\n", action);
9168
9169     state = 0xdeadbee;
9170     action = 0xdeadbee;
9171     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
9172     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9173     ok( state == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", state);
9174     ok( action == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", action);
9175
9176     state = 0xdeadbee;
9177     action = 0xdeadbee;
9178     r = MsiGetComponentState(hpkg, "leo", &state, &action);
9179     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9180     ok( state == INSTALLSTATE_UNKNOWN, "Expected leo INSTALLSTATE_UNKNOWN, got %d\n", state);
9181     ok( action == INSTALLSTATE_LOCAL, "Expected leo INSTALLSTATE_LOCAL, got %d\n", action);
9182
9183     state = 0xdeadbee;
9184     action = 0xdeadbee;
9185     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
9186     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9187     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
9188     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
9189
9190     state = 0xdeadbee;
9191     action = 0xdeadbee;
9192     r = MsiGetComponentState(hpkg, "libra", &state, &action);
9193     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9194     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
9195     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
9196
9197     state = 0xdeadbee;
9198     action = 0xdeadbee;
9199     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
9200     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9201     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
9202     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
9203
9204     state = 0xdeadbee;
9205     action = 0xdeadbee;
9206     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
9207     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9208     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
9209     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
9210
9211     state = 0xdeadbee;
9212     action = 0xdeadbee;
9213     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
9214     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9215     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
9216     ok( action == INSTALLSTATE_SOURCE, "Expected andromeda INSTALLSTATE_SOURCE, got %d\n", action);
9217
9218     state = 0xdeadbee;
9219     action = 0xdeadbee;
9220     r = MsiGetComponentState(hpkg, "canis", &state, &action);
9221     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9222     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
9223     ok( action == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", action);
9224
9225     state = 0xdeadbee;
9226     action = 0xdeadbee;
9227     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
9228     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9229     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
9230     ok( action == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", action);
9231
9232     state = 0xdeadbee;
9233     action = 0xdeadbee;
9234     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
9235     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9236     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
9237     ok( action == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", action);
9238
9239     state = 0xdeadbee;
9240     action = 0xdeadbee;
9241     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
9242     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9243     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
9244     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
9245
9246     state = 0xdeadbee;
9247     action = 0xdeadbee;
9248     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
9249     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9250     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
9251     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
9252     
9253     MsiCloseHandle(hpkg);
9254     DeleteFileA(msifile);
9255 }
9256
9257 static void test_installprops(void)
9258 {
9259     MSIHANDLE hpkg, hdb;
9260     CHAR path[MAX_PATH];
9261     CHAR buf[MAX_PATH];
9262     DWORD size, type;
9263     LANGID langid;
9264     HKEY hkey1, hkey2;
9265     int res;
9266     UINT r;
9267
9268     GetCurrentDirectory(MAX_PATH, path);
9269     lstrcat(path, "\\");
9270     lstrcat(path, msifile);
9271
9272     hdb = create_package_db();
9273     ok( hdb, "failed to create database\n");
9274
9275     hpkg = package_from_db(hdb);
9276     ok( hpkg, "failed to create package\n");
9277
9278     MsiCloseHandle(hdb);
9279
9280     size = MAX_PATH;
9281     r = MsiGetProperty(hpkg, "DATABASE", buf, &size);
9282     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9283     ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9284
9285     RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\MS Setup (ACME)\\User Info", &hkey1);
9286
9287     RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hkey2);
9288
9289     size = MAX_PATH;
9290     type = REG_SZ;
9291     *path = '\0';
9292     if (RegQueryValueEx(hkey1, "DefName", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
9293     {
9294         size = MAX_PATH;
9295         type = REG_SZ;
9296         RegQueryValueEx(hkey2, "RegisteredOwner", NULL, &type, (LPBYTE)path, &size);
9297     }
9298
9299     /* win9x doesn't set this */
9300     if (*path)
9301     {
9302         size = MAX_PATH;
9303         r = MsiGetProperty(hpkg, "USERNAME", buf, &size);
9304         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9305         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9306     }
9307
9308     size = MAX_PATH;
9309     type = REG_SZ;
9310     *path = '\0';
9311     if (RegQueryValueEx(hkey1, "DefCompany", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
9312     {
9313         size = MAX_PATH;
9314         type = REG_SZ;
9315         RegQueryValueEx(hkey2, "RegisteredOrganization", NULL, &type, (LPBYTE)path, &size);
9316     }
9317
9318     if (*path)
9319     {
9320         size = MAX_PATH;
9321         r = MsiGetProperty(hpkg, "COMPANYNAME", buf, &size);
9322         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9323         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9324     }
9325
9326     size = MAX_PATH;
9327     r = MsiGetProperty(hpkg, "VersionDatabase", buf, &size);
9328     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9329     trace("VersionDatabase = %s\n", buf);
9330
9331     size = MAX_PATH;
9332     r = MsiGetProperty(hpkg, "VersionMsi", buf, &size);
9333     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9334     trace("VersionMsi = %s\n", buf);
9335
9336     size = MAX_PATH;
9337     r = MsiGetProperty(hpkg, "Date", buf, &size);
9338     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9339     trace("Date = %s\n", buf);
9340
9341     size = MAX_PATH;
9342     r = MsiGetProperty(hpkg, "Time", buf, &size);
9343     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9344     trace("Time = %s\n", buf);
9345
9346     size = MAX_PATH;
9347     r = MsiGetProperty(hpkg, "PackageCode", buf, &size);
9348     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9349     trace("PackageCode = %s\n", buf);
9350
9351     langid = GetUserDefaultLangID();
9352     sprintf(path, "%d", langid);
9353
9354     size = MAX_PATH;
9355     r = MsiGetProperty(hpkg, "UserLanguageID", buf, &size);
9356     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS< got %d\n", r);
9357     ok( !lstrcmpA(buf, path), "Expected \"%s\", got \"%s\"\n", path, buf);
9358
9359     res = GetSystemMetrics(SM_CXSCREEN);
9360     size = MAX_PATH;
9361     r = MsiGetProperty(hpkg, "ScreenX", buf, &size);
9362     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
9363
9364     res = GetSystemMetrics(SM_CYSCREEN);
9365     size = MAX_PATH;
9366     r = MsiGetProperty(hpkg, "ScreenY", buf, &size);
9367     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
9368
9369     CloseHandle(hkey1);
9370     CloseHandle(hkey2);
9371     MsiCloseHandle(hpkg);
9372     DeleteFile(msifile);
9373 }
9374
9375 static void test_launchconditions(void)
9376 {
9377     MSIHANDLE hpkg;
9378     MSIHANDLE hdb;
9379     UINT r;
9380
9381     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
9382
9383     hdb = create_package_db();
9384     ok( hdb, "failed to create package database\n" );
9385
9386     r = create_launchcondition_table( hdb );
9387     ok( r == ERROR_SUCCESS, "cannot create LaunchCondition table: %d\n", r );
9388
9389     r = add_launchcondition_entry( hdb, "'X = \"1\"', 'one'" );
9390     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
9391
9392     /* invalid condition */
9393     r = add_launchcondition_entry( hdb, "'X != \"1\"', 'one'" );
9394     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
9395
9396     hpkg = package_from_db( hdb );
9397     ok( hpkg, "failed to create package\n");
9398
9399     MsiCloseHandle( hdb );
9400
9401     r = MsiSetProperty( hpkg, "X", "1" );
9402     ok( r == ERROR_SUCCESS, "failed to set property\n" );
9403
9404     /* invalid conditions are ignored */
9405     r = MsiDoAction( hpkg, "LaunchConditions" );
9406     ok( r == ERROR_SUCCESS, "cost init failed\n" );
9407
9408     /* verify LaunchConditions still does some verification */
9409     r = MsiSetProperty( hpkg, "X", "2" );
9410     ok( r == ERROR_SUCCESS, "failed to set property\n" );
9411
9412     r = MsiDoAction( hpkg, "LaunchConditions" );
9413     ok( r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %d\n", r );
9414
9415     MsiCloseHandle( hpkg );
9416     DeleteFile( msifile );
9417 }
9418
9419 static void test_ccpsearch(void)
9420 {
9421     MSIHANDLE hdb, hpkg;
9422     CHAR prop[MAX_PATH];
9423     DWORD size = MAX_PATH;
9424     UINT r;
9425
9426     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
9427
9428     hdb = create_package_db();
9429     ok(hdb, "failed to create package database\n");
9430
9431     r = create_ccpsearch_table(hdb);
9432     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9433
9434     r = add_ccpsearch_entry(hdb, "'CCP_random'");
9435     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9436
9437     r = add_ccpsearch_entry(hdb, "'RMCCP_random'");
9438     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9439
9440     r = create_reglocator_table(hdb);
9441     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9442
9443     r = add_reglocator_entry(hdb, "'CCP_random', 0, 'htmlfile\\shell\\open\\nonexistent', '', 1");
9444     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9445
9446     r = create_drlocator_table(hdb);
9447     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9448
9449     r = add_drlocator_entry(hdb, "'RMCCP_random', '', 'C:\\', '0'");
9450     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9451
9452     r = create_signature_table(hdb);
9453     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9454
9455     hpkg = package_from_db(hdb);
9456     ok(hpkg, "failed to create package\n");
9457
9458     MsiCloseHandle(hdb);
9459
9460     r = MsiDoAction(hpkg, "CCPSearch");
9461     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9462
9463     r = MsiGetPropertyA(hpkg, "CCP_Success", prop, &size);
9464     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9465     ok(!lstrcmpA(prop, "1"), "Expected 1, got %s\n", prop);
9466
9467     MsiCloseHandle(hpkg);
9468     DeleteFileA(msifile);
9469 }
9470
9471 static void test_complocator(void)
9472 {
9473     MSIHANDLE hdb, hpkg;
9474     UINT r;
9475     CHAR prop[MAX_PATH];
9476     CHAR expected[MAX_PATH];
9477     DWORD size = MAX_PATH;
9478
9479     hdb = create_package_db();
9480     ok(hdb, "failed to create package database\n");
9481
9482     r = create_appsearch_table(hdb);
9483     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9484
9485     r = add_appsearch_entry(hdb, "'ABELISAURUS', 'abelisaurus'");
9486     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9487
9488     r = add_appsearch_entry(hdb, "'BACTROSAURUS', 'bactrosaurus'");
9489     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9490
9491     r = add_appsearch_entry(hdb, "'CAMELOTIA', 'camelotia'");
9492     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9493
9494     r = add_appsearch_entry(hdb, "'DICLONIUS', 'diclonius'");
9495     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9496
9497     r = add_appsearch_entry(hdb, "'ECHINODON', 'echinodon'");
9498     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9499
9500     r = add_appsearch_entry(hdb, "'FALCARIUS', 'falcarius'");
9501     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9502
9503     r = add_appsearch_entry(hdb, "'GALLIMIMUS', 'gallimimus'");
9504     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9505
9506     r = add_appsearch_entry(hdb, "'HAGRYPHUS', 'hagryphus'");
9507     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9508
9509     r = add_appsearch_entry(hdb, "'IGUANODON', 'iguanodon'");
9510     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9511
9512     r = add_appsearch_entry(hdb, "'JOBARIA', 'jobaria'");
9513     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9514
9515     r = add_appsearch_entry(hdb, "'KAKURU', 'kakuru'");
9516     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9517
9518     r = add_appsearch_entry(hdb, "'LABOCANIA', 'labocania'");
9519     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9520
9521     r = add_appsearch_entry(hdb, "'MEGARAPTOR', 'megaraptor'");
9522     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9523
9524     r = add_appsearch_entry(hdb, "'NEOSODON', 'neosodon'");
9525     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9526
9527     r = add_appsearch_entry(hdb, "'OLOROTITAN', 'olorotitan'");
9528     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9529
9530     r = add_appsearch_entry(hdb, "'PANTYDRACO', 'pantydraco'");
9531     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9532
9533     r = create_complocator_table(hdb);
9534     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9535
9536     r = add_complocator_entry(hdb, "'abelisaurus', '{E3619EED-305A-418C-B9C7-F7D7377F0934}', 1");
9537     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9538
9539     r = add_complocator_entry(hdb, "'bactrosaurus', '{D56B688D-542F-42Ef-90FD-B6DA76EE8119}', 0");
9540     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9541
9542     r = add_complocator_entry(hdb, "'camelotia', '{8211BE36-2466-47E3-AFB7-6AC72E51AED2}', 1");
9543     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9544
9545     r = add_complocator_entry(hdb, "'diclonius', '{5C767B20-A33C-45A4-B80B-555E512F01AE}', 0");
9546     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9547
9548     r = add_complocator_entry(hdb, "'echinodon', '{A19E16C5-C75D-4699-8111-C4338C40C3CB}', 1");
9549     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9550
9551     r = add_complocator_entry(hdb, "'falcarius', '{17762FA1-A7AE-4CC6-8827-62873C35361D}', 0");
9552     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9553
9554     r = add_complocator_entry(hdb, "'gallimimus', '{75EBF568-C959-41E0-A99E-9050638CF5FB}', 1");
9555     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9556
9557     r = add_complocator_entry(hdb, "'hagrphus', '{D4969B72-17D9-4AB6-BE49-78F2FEE857AC}', 0");
9558     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9559
9560     r = add_complocator_entry(hdb, "'iguanodon', '{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}', 1");
9561     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9562
9563     r = add_complocator_entry(hdb, "'jobaria', '{243C22B1-8C51-4151-B9D1-1AE5265E079E}', 0");
9564     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9565
9566     r = add_complocator_entry(hdb, "'kakuru', '{5D0F03BA-50BC-44F2-ABB1-72C972F4E514}', 1");
9567     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9568
9569     r = add_complocator_entry(hdb, "'labocania', '{C7DDB60C-7828-4046-A6F8-699D5E92F1ED}', 0");
9570     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9571
9572     r = add_complocator_entry(hdb, "'megaraptor', '{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}', 1");
9573     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9574
9575     r = add_complocator_entry(hdb, "'neosodon', '{0B499649-197A-48EF-93D2-AF1C17ED6E90}', 0");
9576     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9577
9578     r = add_complocator_entry(hdb, "'olorotitan', '{54E9E91F-AED2-46D5-A25A-7E50AFA24513}', 1");
9579     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9580
9581     r = add_complocator_entry(hdb, "'pantydraco', '{2A989951-5565-4FA7-93A7-E800A3E67D71}', 0");
9582     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9583
9584     r = create_signature_table(hdb);
9585     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9586
9587     r = add_signature_entry(hdb, "'abelisaurus', 'abelisaurus', '', '', '', '', '', '', ''");
9588     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9589
9590     r = add_signature_entry(hdb, "'bactrosaurus', 'bactrosaurus', '', '', '', '', '', '', ''");
9591     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9592
9593     r = add_signature_entry(hdb, "'camelotia', 'camelotia', '', '', '', '', '', '', ''");
9594     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9595
9596     r = add_signature_entry(hdb, "'diclonius', 'diclonius', '', '', '', '', '', '', ''");
9597     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9598
9599     r = add_signature_entry(hdb, "'iguanodon', 'iguanodon', '', '', '', '', '', '', ''");
9600     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9601
9602     r = add_signature_entry(hdb, "'jobaria', 'jobaria', '', '', '', '', '', '', ''");
9603     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9604
9605     r = add_signature_entry(hdb, "'kakuru', 'kakuru', '', '', '', '', '', '', ''");
9606     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9607
9608     r = add_signature_entry(hdb, "'labocania', 'labocania', '', '', '', '', '', '', ''");
9609     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9610
9611     hpkg = package_from_db(hdb);
9612     ok(hpkg, "failed to create package\n");
9613
9614     MsiCloseHandle(hdb);
9615
9616     create_test_file("abelisaurus");
9617     create_test_file("bactrosaurus");
9618     create_test_file("camelotia");
9619     create_test_file("diclonius");
9620     create_test_file("echinodon");
9621     create_test_file("falcarius");
9622     create_test_file("gallimimus");
9623     create_test_file("hagryphus");
9624     CreateDirectoryA("iguanodon", NULL);
9625     CreateDirectoryA("jobaria", NULL);
9626     CreateDirectoryA("kakuru", NULL);
9627     CreateDirectoryA("labocania", NULL);
9628     CreateDirectoryA("megaraptor", NULL);
9629     CreateDirectoryA("neosodon", NULL);
9630     CreateDirectoryA("olorotitan", NULL);
9631     CreateDirectoryA("pantydraco", NULL);
9632
9633     set_component_path("abelisaurus", MSIINSTALLCONTEXT_MACHINE,
9634                        "{E3619EED-305A-418C-B9C7-F7D7377F0934}", NULL, FALSE);
9635     set_component_path("bactrosaurus", MSIINSTALLCONTEXT_MACHINE,
9636                        "{D56B688D-542F-42Ef-90FD-B6DA76EE8119}", NULL, FALSE);
9637     set_component_path("echinodon", MSIINSTALLCONTEXT_MACHINE,
9638                        "{A19E16C5-C75D-4699-8111-C4338C40C3CB}", NULL, FALSE);
9639     set_component_path("falcarius", MSIINSTALLCONTEXT_MACHINE,
9640                        "{17762FA1-A7AE-4CC6-8827-62873C35361D}", NULL, FALSE);
9641     set_component_path("iguanodon", MSIINSTALLCONTEXT_MACHINE,
9642                        "{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}", NULL, FALSE);
9643     set_component_path("jobaria", MSIINSTALLCONTEXT_MACHINE,
9644                        "{243C22B1-8C51-4151-B9D1-1AE5265E079E}", NULL, FALSE);
9645     set_component_path("megaraptor", MSIINSTALLCONTEXT_MACHINE,
9646                        "{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}", NULL, FALSE);
9647     set_component_path("neosodon", MSIINSTALLCONTEXT_MACHINE,
9648                        "{0B499649-197A-48EF-93D2-AF1C17ED6E90}", NULL, FALSE);
9649
9650     r = MsiDoAction(hpkg, "AppSearch");
9651     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9652
9653     size = MAX_PATH;
9654     r = MsiGetPropertyA(hpkg, "ABELISAURUS", prop, &size);
9655     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9656
9657     lstrcpyA(expected, CURR_DIR);
9658     lstrcatA(expected, "\\abelisaurus");
9659     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9660        "Expected %s or empty string, got %s\n", expected, prop);
9661
9662     size = MAX_PATH;
9663     r = MsiGetPropertyA(hpkg, "BACTROSAURUS", prop, &size);
9664     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9665     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9666
9667     size = MAX_PATH;
9668     r = MsiGetPropertyA(hpkg, "CAMELOTIA", prop, &size);
9669     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9670     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9671
9672     size = MAX_PATH;
9673     r = MsiGetPropertyA(hpkg, "DICLONIUS", prop, &size);
9674     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9675     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9676
9677     size = MAX_PATH;
9678     r = MsiGetPropertyA(hpkg, "ECHINODON", prop, &size);
9679     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9680
9681     lstrcpyA(expected, CURR_DIR);
9682     lstrcatA(expected, "\\");
9683     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9684        "Expected %s or empty string, got %s\n", expected, prop);
9685
9686     size = MAX_PATH;
9687     r = MsiGetPropertyA(hpkg, "FALCARIUS", prop, &size);
9688     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9689     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9690
9691     size = MAX_PATH;
9692     r = MsiGetPropertyA(hpkg, "GALLIMIMUS", prop, &size);
9693     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9694     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9695
9696     size = MAX_PATH;
9697     r = MsiGetPropertyA(hpkg, "HAGRYPHUS", prop, &size);
9698     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9699     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9700
9701     size = MAX_PATH;
9702     r = MsiGetPropertyA(hpkg, "IGUANODON", prop, &size);
9703     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9704     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9705
9706     size = MAX_PATH;
9707     r = MsiGetPropertyA(hpkg, "JOBARIA", prop, &size);
9708     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9709     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9710
9711     size = MAX_PATH;
9712     r = MsiGetPropertyA(hpkg, "KAKURU", prop, &size);
9713     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9714     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9715
9716     size = MAX_PATH;
9717     r = MsiGetPropertyA(hpkg, "LABOCANIA", prop, &size);
9718     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9719     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9720
9721     size = MAX_PATH;
9722     r = MsiGetPropertyA(hpkg, "MEGARAPTOR", prop, &size);
9723     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9724
9725     lstrcpyA(expected, CURR_DIR);
9726     lstrcatA(expected, "\\");
9727     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9728        "Expected %s or empty string, got %s\n", expected, prop);
9729
9730     size = MAX_PATH;
9731     r = MsiGetPropertyA(hpkg, "NEOSODON", prop, &size);
9732     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9733
9734     lstrcpyA(expected, CURR_DIR);
9735     lstrcatA(expected, "\\neosodon\\");
9736     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9737        "Expected %s or empty string, got %s\n", expected, prop);
9738
9739     size = MAX_PATH;
9740     r = MsiGetPropertyA(hpkg, "OLOROTITAN", prop, &size);
9741     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9742     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9743
9744     size = MAX_PATH;
9745     r = MsiGetPropertyA(hpkg, "PANTYDRACO", prop, &size);
9746     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9747     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9748
9749     MsiCloseHandle(hpkg);
9750     DeleteFileA("abelisaurus");
9751     DeleteFileA("bactrosaurus");
9752     DeleteFileA("camelotia");
9753     DeleteFileA("diclonius");
9754     DeleteFileA("echinodon");
9755     DeleteFileA("falcarius");
9756     DeleteFileA("gallimimus");
9757     DeleteFileA("hagryphus");
9758     RemoveDirectoryA("iguanodon");
9759     RemoveDirectoryA("jobaria");
9760     RemoveDirectoryA("kakuru");
9761     RemoveDirectoryA("labocania");
9762     RemoveDirectoryA("megaraptor");
9763     RemoveDirectoryA("neosodon");
9764     RemoveDirectoryA("olorotitan");
9765     RemoveDirectoryA("pantydraco");
9766     delete_component_path("{E3619EED-305A-418C-B9C7-F7D7377F0934}",
9767                           MSIINSTALLCONTEXT_MACHINE, NULL);
9768     delete_component_path("{D56B688D-542F-42Ef-90FD-B6DA76EE8119}",
9769                           MSIINSTALLCONTEXT_MACHINE, NULL);
9770     delete_component_path("{A19E16C5-C75D-4699-8111-C4338C40C3CB}",
9771                           MSIINSTALLCONTEXT_MACHINE, NULL);
9772     delete_component_path("{17762FA1-A7AE-4CC6-8827-62873C35361D}",
9773                           MSIINSTALLCONTEXT_MACHINE, NULL);
9774     delete_component_path("{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}",
9775                           MSIINSTALLCONTEXT_MACHINE, NULL);
9776     delete_component_path("{243C22B1-8C51-4151-B9D1-1AE5265E079E}",
9777                           MSIINSTALLCONTEXT_MACHINE, NULL);
9778     delete_component_path("{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}",
9779                           MSIINSTALLCONTEXT_MACHINE, NULL);
9780     delete_component_path("{0B499649-197A-48EF-93D2-AF1C17ED6E90}",
9781                           MSIINSTALLCONTEXT_MACHINE, NULL);
9782     DeleteFileA(msifile);
9783 }
9784
9785 static void set_suminfo_prop(MSIHANDLE db, DWORD prop, DWORD val)
9786 {
9787     MSIHANDLE summary;
9788     UINT r;
9789
9790     r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
9791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9792
9793     r = MsiSummaryInfoSetPropertyA(summary, prop, VT_I4, val, NULL, NULL);
9794     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9795
9796     r = MsiSummaryInfoPersist(summary);
9797     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
9798
9799     MsiCloseHandle(summary);
9800 }
9801
9802 static void test_MsiGetSourcePath(void)
9803 {
9804     MSIHANDLE hdb, hpkg;
9805     CHAR path[MAX_PATH];
9806     CHAR cwd[MAX_PATH];
9807     CHAR subsrc[MAX_PATH];
9808     CHAR sub2[MAX_PATH];
9809     DWORD size;
9810     UINT r;
9811
9812     lstrcpyA(cwd, CURR_DIR);
9813     lstrcatA(cwd, "\\");
9814
9815     lstrcpyA(subsrc, cwd);
9816     lstrcatA(subsrc, "subsource");
9817     lstrcatA(subsrc, "\\");
9818
9819     lstrcpyA(sub2, subsrc);
9820     lstrcatA(sub2, "sub2");
9821     lstrcatA(sub2, "\\");
9822
9823     /* uncompressed source */
9824
9825     hdb = create_package_db();
9826     ok( hdb, "failed to create database\n");
9827
9828     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
9829
9830     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
9831     ok(r == S_OK, "failed\n");
9832
9833     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'subtarget:subsource'");
9834     ok(r == S_OK, "failed\n");
9835
9836     r = add_directory_entry(hdb, "'SubDir2', 'SubDir', 'sub2'");
9837     ok(r == S_OK, "failed\n");
9838
9839     r = MsiDatabaseCommit(hdb);
9840     ok(r == ERROR_SUCCESS , "Failed to commit database\n");
9841
9842     hpkg = package_from_db(hdb);
9843     ok(hpkg, "failed to create package\n");
9844
9845     MsiCloseHandle(hdb);
9846
9847     /* invalid database handle */
9848     size = MAX_PATH;
9849     lstrcpyA(path, "kiwi");
9850     r = MsiGetSourcePath(-1, "TARGETDIR", path, &size);
9851     ok(r == ERROR_INVALID_HANDLE,
9852        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
9853     ok(!lstrcmpA(path, "kiwi"),
9854        "Expected path to be unchanged, got \"%s\"\n", path);
9855     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9856
9857     /* NULL szFolder */
9858     size = MAX_PATH;
9859     lstrcpyA(path, "kiwi");
9860     r = MsiGetSourcePath(hpkg, NULL, path, &size);
9861     ok(r == ERROR_INVALID_PARAMETER,
9862        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
9863     ok(!lstrcmpA(path, "kiwi"),
9864        "Expected path to be unchanged, got \"%s\"\n", path);
9865     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9866
9867     /* empty szFolder */
9868     size = MAX_PATH;
9869     lstrcpyA(path, "kiwi");
9870     r = MsiGetSourcePath(hpkg, "", path, &size);
9871     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9872     ok(!lstrcmpA(path, "kiwi"),
9873        "Expected path to be unchanged, got \"%s\"\n", path);
9874     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9875
9876     /* try TARGETDIR */
9877     size = MAX_PATH;
9878     lstrcpyA(path, "kiwi");
9879     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
9880     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9881     ok(!lstrcmpA(path, "kiwi"),
9882        "Expected path to be unchanged, got \"%s\"\n", path);
9883     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9884
9885     /* try SourceDir */
9886     size = MAX_PATH;
9887     lstrcpyA(path, "kiwi");
9888     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9889     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9890     ok(!lstrcmpA(path, "kiwi"),
9891        "Expected path to be unchanged, got \"%s\"\n", path);
9892     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9893
9894     /* try SOURCEDIR */
9895     size = MAX_PATH;
9896     lstrcpyA(path, "kiwi");
9897     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9898     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9899     ok(!lstrcmpA(path, "kiwi"),
9900        "Expected path to be unchanged, got \"%s\"\n", path);
9901     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9902
9903     /* source path does not exist, but the property exists */
9904     size = MAX_PATH;
9905     lstrcpyA(path, "kiwi");
9906     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9907     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9908     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9909     ok(size == 0, "Expected 0, got %d\n", size);
9910
9911     /* try SubDir */
9912     size = MAX_PATH;
9913     lstrcpyA(path, "kiwi");
9914     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
9915     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9916     ok(!lstrcmpA(path, "kiwi"),
9917        "Expected path to be unchanged, got \"%s\"\n", path);
9918     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9919
9920     /* try SubDir2 */
9921     size = MAX_PATH;
9922     lstrcpyA(path, "kiwi");
9923     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
9924     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9925     ok(!lstrcmpA(path, "kiwi"),
9926        "Expected path to be unchanged, got \"%s\"\n", path);
9927     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9928
9929     r = MsiDoAction(hpkg, "CostInitialize");
9930     ok(r == ERROR_SUCCESS, "cost init failed\n");
9931
9932     /* try TARGETDIR after CostInitialize */
9933     size = MAX_PATH;
9934     lstrcpyA(path, "kiwi");
9935     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
9936     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9937     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9938     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9939
9940     /* try SourceDir after CostInitialize */
9941     size = MAX_PATH;
9942     lstrcpyA(path, "kiwi");
9943     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9944     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9945     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9946     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9947
9948     /* try SOURCEDIR after CostInitialize */
9949     size = MAX_PATH;
9950     lstrcpyA(path, "kiwi");
9951     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9952     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9953     ok(!lstrcmpA(path, "kiwi"),
9954        "Expected path to be unchanged, got \"%s\"\n", path);
9955     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9956
9957     /* source path does not exist, but the property exists */
9958     size = MAX_PATH;
9959     lstrcpyA(path, "kiwi");
9960     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9961     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9962     todo_wine
9963     {
9964         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9965         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9966     }
9967
9968     /* try SubDir after CostInitialize */
9969     size = MAX_PATH;
9970     lstrcpyA(path, "kiwi");
9971     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
9972     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9973     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
9974     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
9975
9976     /* try SubDir2 after CostInitialize */
9977     size = MAX_PATH;
9978     lstrcpyA(path, "kiwi");
9979     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
9980     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9981     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
9982     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
9983
9984     r = MsiDoAction(hpkg, "ResolveSource");
9985     ok(r == ERROR_SUCCESS, "file cost failed\n");
9986
9987     /* try TARGETDIR after ResolveSource */
9988     size = MAX_PATH;
9989     lstrcpyA(path, "kiwi");
9990     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
9991     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9992     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9993     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9994
9995     /* try SourceDir after ResolveSource */
9996     size = MAX_PATH;
9997     lstrcpyA(path, "kiwi");
9998     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9999     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10000     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10001     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10002
10003     /* try SOURCEDIR after ResolveSource */
10004     size = MAX_PATH;
10005     lstrcpyA(path, "kiwi");
10006     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10007     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10008     ok(!lstrcmpA(path, "kiwi"),
10009        "Expected path to be unchanged, got \"%s\"\n", path);
10010     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10011
10012     /* source path does not exist, but the property exists */
10013     size = MAX_PATH;
10014     lstrcpyA(path, "kiwi");
10015     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10016     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10017     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10018     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10019
10020     /* try SubDir after ResolveSource */
10021     size = MAX_PATH;
10022     lstrcpyA(path, "kiwi");
10023     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10024     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10025     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10026     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10027
10028     /* try SubDir2 after ResolveSource */
10029     size = MAX_PATH;
10030     lstrcpyA(path, "kiwi");
10031     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10032     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10033     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10034     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10035
10036     r = MsiDoAction(hpkg, "FileCost");
10037     ok(r == ERROR_SUCCESS, "file cost failed\n");
10038
10039     /* try TARGETDIR after FileCost */
10040     size = MAX_PATH;
10041     lstrcpyA(path, "kiwi");
10042     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10043     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10044     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10045     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10046
10047     /* try SourceDir after FileCost */
10048     size = MAX_PATH;
10049     lstrcpyA(path, "kiwi");
10050     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10051     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10052     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10053     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10054
10055     /* try SOURCEDIR after FileCost */
10056     size = MAX_PATH;
10057     lstrcpyA(path, "kiwi");
10058     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10059     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10060     ok(!lstrcmpA(path, "kiwi"),
10061        "Expected path to be unchanged, got \"%s\"\n", path);
10062     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10063
10064     /* try SubDir after FileCost */
10065     size = MAX_PATH;
10066     lstrcpyA(path, "kiwi");
10067     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10068     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10069     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10070     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10071
10072     /* try SubDir2 after FileCost */
10073     size = MAX_PATH;
10074     lstrcpyA(path, "kiwi");
10075     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10076     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10077     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10078     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10079
10080     r = MsiDoAction(hpkg, "CostFinalize");
10081     ok(r == ERROR_SUCCESS, "file cost failed\n");
10082
10083     /* try TARGETDIR after CostFinalize */
10084     size = MAX_PATH;
10085     lstrcpyA(path, "kiwi");
10086     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10087     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10088     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10089     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10090
10091     /* try SourceDir after CostFinalize */
10092     size = MAX_PATH;
10093     lstrcpyA(path, "kiwi");
10094     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10095     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10096     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10097     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10098
10099     /* try SOURCEDIR after CostFinalize */
10100     size = MAX_PATH;
10101     lstrcpyA(path, "kiwi");
10102     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10103     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10104     ok(!lstrcmpA(path, "kiwi"),
10105        "Expected path to be unchanged, got \"%s\"\n", path);
10106     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10107
10108     /* try SubDir after CostFinalize */
10109     size = MAX_PATH;
10110     lstrcpyA(path, "kiwi");
10111     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10112     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10113     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10114     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10115
10116     /* try SubDir2 after CostFinalize */
10117     size = MAX_PATH;
10118     lstrcpyA(path, "kiwi");
10119     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10120     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10121     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10122     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10123
10124     /* nonexistent directory */
10125     size = MAX_PATH;
10126     lstrcpyA(path, "kiwi");
10127     r = MsiGetSourcePath(hpkg, "IDontExist", path, &size);
10128     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10129     ok(!lstrcmpA(path, "kiwi"),
10130        "Expected path to be unchanged, got \"%s\"\n", path);
10131     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10132
10133     /* NULL szPathBuf */
10134     size = MAX_PATH;
10135     r = MsiGetSourcePath(hpkg, "SourceDir", NULL, &size);
10136     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10137     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10138
10139     /* NULL pcchPathBuf */
10140     lstrcpyA(path, "kiwi");
10141     r = MsiGetSourcePath(hpkg, "SourceDir", path, NULL);
10142     ok(r == ERROR_INVALID_PARAMETER,
10143        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
10144     ok(!lstrcmpA(path, "kiwi"),
10145        "Expected path to be unchanged, got \"%s\"\n", path);
10146
10147     /* pcchPathBuf is 0 */
10148     size = 0;
10149     lstrcpyA(path, "kiwi");
10150     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10151     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
10152     ok(!lstrcmpA(path, "kiwi"),
10153        "Expected path to be unchanged, got \"%s\"\n", path);
10154     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10155
10156     /* pcchPathBuf does not have room for NULL terminator */
10157     size = lstrlenA(cwd);
10158     lstrcpyA(path, "kiwi");
10159     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10160     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
10161     ok(!strncmp(path, cwd, lstrlenA(cwd) - 1),
10162        "Expected path with no backslash, got \"%s\"\n", path);
10163     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10164
10165     /* pcchPathBuf has room for NULL terminator */
10166     size = lstrlenA(cwd) + 1;
10167     lstrcpyA(path, "kiwi");
10168     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10169     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10170     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10171     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10172
10173     MsiCloseHandle(hpkg);
10174
10175     /* compressed source */
10176
10177     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
10178     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10179
10180     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeCompressed);
10181
10182     hpkg = package_from_db(hdb);
10183     ok(hpkg, "failed to create package\n");
10184
10185     r = MsiDoAction(hpkg, "CostInitialize");
10186     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10187     r = MsiDoAction(hpkg, "FileCost");
10188     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10189     r = MsiDoAction(hpkg, "CostFinalize");
10190     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10191
10192     /* try TARGETDIR after CostFinalize */
10193     size = MAX_PATH;
10194     lstrcpyA(path, "kiwi");
10195     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10196     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10197     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10198     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10199
10200     /* try SourceDir after CostFinalize */
10201     size = MAX_PATH;
10202     lstrcpyA(path, "kiwi");
10203     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10204     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10205     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10206     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10207
10208     /* try SOURCEDIR after CostFinalize */
10209     size = MAX_PATH;
10210     lstrcpyA(path, "kiwi");
10211     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10212     todo_wine
10213     {
10214         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10215         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10216         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10217     }
10218
10219     /* try SubDir after CostFinalize */
10220     size = MAX_PATH;
10221     lstrcpyA(path, "kiwi");
10222     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10223     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10224     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10225     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10226
10227     /* try SubDir2 after CostFinalize */
10228     size = MAX_PATH;
10229     lstrcpyA(path, "kiwi");
10230     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10231     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10232     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10233     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10234
10235     MsiCloseHandle(hpkg);
10236     DeleteFile(msifile);
10237 }
10238
10239 static void test_shortlongsource(void)
10240 {
10241     MSIHANDLE hdb, hpkg;
10242     CHAR path[MAX_PATH];
10243     CHAR cwd[MAX_PATH];
10244     CHAR subsrc[MAX_PATH];
10245     DWORD size;
10246     UINT r;
10247
10248     lstrcpyA(cwd, CURR_DIR);
10249     lstrcatA(cwd, "\\");
10250
10251     lstrcpyA(subsrc, cwd);
10252     lstrcatA(subsrc, "long");
10253     lstrcatA(subsrc, "\\");
10254
10255     /* long file names */
10256
10257     hdb = create_package_db();
10258     ok( hdb, "failed to create database\n");
10259
10260     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
10261
10262     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
10263     ok(r == S_OK, "failed\n");
10264
10265     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'short|long'");
10266     ok(r == S_OK, "failed\n");
10267
10268     /* CostInitialize:short */
10269     r = add_directory_entry(hdb, "'SubDir2', 'TARGETDIR', 'one|two'");
10270     ok(r == S_OK, "failed\n");
10271
10272     /* CostInitialize:long */
10273     r = add_directory_entry(hdb, "'SubDir3', 'TARGETDIR', 'three|four'");
10274     ok(r == S_OK, "failed\n");
10275
10276     /* FileCost:short */
10277     r = add_directory_entry(hdb, "'SubDir4', 'TARGETDIR', 'five|six'");
10278     ok(r == S_OK, "failed\n");
10279
10280     /* FileCost:long */
10281     r = add_directory_entry(hdb, "'SubDir5', 'TARGETDIR', 'seven|eight'");
10282     ok(r == S_OK, "failed\n");
10283
10284     /* CostFinalize:short */
10285     r = add_directory_entry(hdb, "'SubDir6', 'TARGETDIR', 'nine|ten'");
10286     ok(r == S_OK, "failed\n");
10287
10288     /* CostFinalize:long */
10289     r = add_directory_entry(hdb, "'SubDir7', 'TARGETDIR', 'eleven|twelve'");
10290     ok(r == S_OK, "failed\n");
10291
10292     MsiDatabaseCommit(hdb);
10293
10294     hpkg = package_from_db(hdb);
10295     ok(hpkg, "failed to create package\n");
10296
10297     MsiCloseHandle(hdb);
10298
10299     CreateDirectoryA("one", NULL);
10300     CreateDirectoryA("four", NULL);
10301
10302     r = MsiDoAction(hpkg, "CostInitialize");
10303     ok(r == ERROR_SUCCESS, "file cost failed\n");
10304
10305     CreateDirectory("five", NULL);
10306     CreateDirectory("eight", NULL);
10307
10308     r = MsiDoAction(hpkg, "FileCost");
10309     ok(r == ERROR_SUCCESS, "file cost failed\n");
10310
10311     CreateDirectory("nine", NULL);
10312     CreateDirectory("twelve", NULL);
10313
10314     r = MsiDoAction(hpkg, "CostFinalize");
10315     ok(r == ERROR_SUCCESS, "file cost failed\n");
10316
10317     /* neither short nor long source directories exist */
10318     size = MAX_PATH;
10319     lstrcpyA(path, "kiwi");
10320     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10321     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10322     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10323     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10324
10325     CreateDirectoryA("short", NULL);
10326
10327     /* short source directory exists */
10328     size = MAX_PATH;
10329     lstrcpyA(path, "kiwi");
10330     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10331     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10332     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10333     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10334
10335     CreateDirectoryA("long", NULL);
10336
10337     /* both short and long source directories exist */
10338     size = MAX_PATH;
10339     lstrcpyA(path, "kiwi");
10340     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10341     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10342     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10343     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10344
10345     lstrcpyA(subsrc, cwd);
10346     lstrcatA(subsrc, "two");
10347     lstrcatA(subsrc, "\\");
10348
10349     /* short dir exists before CostInitialize */
10350     size = MAX_PATH;
10351     lstrcpyA(path, "kiwi");
10352     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10353     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10354     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10355     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10356
10357     lstrcpyA(subsrc, cwd);
10358     lstrcatA(subsrc, "four");
10359     lstrcatA(subsrc, "\\");
10360
10361     /* long dir exists before CostInitialize */
10362     size = MAX_PATH;
10363     lstrcpyA(path, "kiwi");
10364     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
10365     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10366     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10367     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10368
10369     lstrcpyA(subsrc, cwd);
10370     lstrcatA(subsrc, "six");
10371     lstrcatA(subsrc, "\\");
10372
10373     /* short dir exists before FileCost */
10374     size = MAX_PATH;
10375     lstrcpyA(path, "kiwi");
10376     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
10377     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10378     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10379     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10380
10381     lstrcpyA(subsrc, cwd);
10382     lstrcatA(subsrc, "eight");
10383     lstrcatA(subsrc, "\\");
10384
10385     /* long dir exists before FileCost */
10386     size = MAX_PATH;
10387     lstrcpyA(path, "kiwi");
10388     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
10389     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10390     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10391     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10392
10393     lstrcpyA(subsrc, cwd);
10394     lstrcatA(subsrc, "ten");
10395     lstrcatA(subsrc, "\\");
10396
10397     /* short dir exists before CostFinalize */
10398     size = MAX_PATH;
10399     lstrcpyA(path, "kiwi");
10400     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
10401     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10402     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10403     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10404
10405     lstrcpyA(subsrc, cwd);
10406     lstrcatA(subsrc, "twelve");
10407     lstrcatA(subsrc, "\\");
10408
10409     /* long dir exists before CostFinalize */
10410     size = MAX_PATH;
10411     lstrcpyA(path, "kiwi");
10412     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
10413     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10414     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10415     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10416
10417     MsiCloseHandle(hpkg);
10418     RemoveDirectoryA("short");
10419     RemoveDirectoryA("long");
10420     RemoveDirectoryA("one");
10421     RemoveDirectoryA("four");
10422     RemoveDirectoryA("five");
10423     RemoveDirectoryA("eight");
10424     RemoveDirectoryA("nine");
10425     RemoveDirectoryA("twelve");
10426
10427     /* short file names */
10428
10429     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
10430     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10431
10432     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeSFN);
10433
10434     hpkg = package_from_db(hdb);
10435     ok(hpkg, "failed to create package\n");
10436
10437     MsiCloseHandle(hdb);
10438
10439     CreateDirectoryA("one", NULL);
10440     CreateDirectoryA("four", NULL);
10441
10442     r = MsiDoAction(hpkg, "CostInitialize");
10443     ok(r == ERROR_SUCCESS, "file cost failed\n");
10444
10445     CreateDirectory("five", NULL);
10446     CreateDirectory("eight", NULL);
10447
10448     r = MsiDoAction(hpkg, "FileCost");
10449     ok(r == ERROR_SUCCESS, "file cost failed\n");
10450
10451     CreateDirectory("nine", NULL);
10452     CreateDirectory("twelve", NULL);
10453
10454     r = MsiDoAction(hpkg, "CostFinalize");
10455     ok(r == ERROR_SUCCESS, "file cost failed\n");
10456
10457     lstrcpyA(subsrc, cwd);
10458     lstrcatA(subsrc, "short");
10459     lstrcatA(subsrc, "\\");
10460
10461     /* neither short nor long source directories exist */
10462     size = MAX_PATH;
10463     lstrcpyA(path, "kiwi");
10464     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10465     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10466     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10467     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10468
10469     CreateDirectoryA("short", NULL);
10470
10471     /* short source directory exists */
10472     size = MAX_PATH;
10473     lstrcpyA(path, "kiwi");
10474     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10475     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10476     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10477     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10478
10479     CreateDirectoryA("long", NULL);
10480
10481     /* both short and long source directories exist */
10482     size = MAX_PATH;
10483     lstrcpyA(path, "kiwi");
10484     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10485     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10486     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10487     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10488
10489     lstrcpyA(subsrc, cwd);
10490     lstrcatA(subsrc, "one");
10491     lstrcatA(subsrc, "\\");
10492
10493     /* short dir exists before CostInitialize */
10494     size = MAX_PATH;
10495     lstrcpyA(path, "kiwi");
10496     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10497     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10498     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10499     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10500
10501     lstrcpyA(subsrc, cwd);
10502     lstrcatA(subsrc, "three");
10503     lstrcatA(subsrc, "\\");
10504
10505     /* long dir exists before CostInitialize */
10506     size = MAX_PATH;
10507     lstrcpyA(path, "kiwi");
10508     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
10509     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10510     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10511     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10512
10513     lstrcpyA(subsrc, cwd);
10514     lstrcatA(subsrc, "five");
10515     lstrcatA(subsrc, "\\");
10516
10517     /* short dir exists before FileCost */
10518     size = MAX_PATH;
10519     lstrcpyA(path, "kiwi");
10520     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
10521     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10522     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10523     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10524
10525     lstrcpyA(subsrc, cwd);
10526     lstrcatA(subsrc, "seven");
10527     lstrcatA(subsrc, "\\");
10528
10529     /* long dir exists before FileCost */
10530     size = MAX_PATH;
10531     lstrcpyA(path, "kiwi");
10532     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
10533     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10534     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10535     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10536
10537     lstrcpyA(subsrc, cwd);
10538     lstrcatA(subsrc, "nine");
10539     lstrcatA(subsrc, "\\");
10540
10541     /* short dir exists before CostFinalize */
10542     size = MAX_PATH;
10543     lstrcpyA(path, "kiwi");
10544     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
10545     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10546     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10547     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10548
10549     lstrcpyA(subsrc, cwd);
10550     lstrcatA(subsrc, "eleven");
10551     lstrcatA(subsrc, "\\");
10552
10553     /* long dir exists before CostFinalize */
10554     size = MAX_PATH;
10555     lstrcpyA(path, "kiwi");
10556     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
10557     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10558     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10559     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10560
10561     MsiCloseHandle(hpkg);
10562     RemoveDirectoryA("short");
10563     RemoveDirectoryA("long");
10564     RemoveDirectoryA("one");
10565     RemoveDirectoryA("four");
10566     RemoveDirectoryA("five");
10567     RemoveDirectoryA("eight");
10568     RemoveDirectoryA("nine");
10569     RemoveDirectoryA("twelve");
10570     DeleteFileA(msifile);
10571 }
10572
10573 static void test_sourcedir(void)
10574 {
10575     MSIHANDLE hdb, hpkg;
10576     CHAR package[10];
10577     CHAR path[MAX_PATH];
10578     CHAR cwd[MAX_PATH];
10579     CHAR subsrc[MAX_PATH];
10580     DWORD size;
10581     UINT r;
10582
10583     lstrcpyA(cwd, CURR_DIR);
10584     lstrcatA(cwd, "\\");
10585
10586     lstrcpyA(subsrc, cwd);
10587     lstrcatA(subsrc, "long");
10588     lstrcatA(subsrc, "\\");
10589
10590     hdb = create_package_db();
10591     ok( hdb, "failed to create database\n");
10592
10593     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
10594     ok(r == S_OK, "failed\n");
10595
10596     sprintf(package, "#%i", hdb);
10597     r = MsiOpenPackage(package, &hpkg);
10598     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10599
10600     /* properties only */
10601
10602     /* SourceDir prop */
10603     size = MAX_PATH;
10604     lstrcpyA(path, "kiwi");
10605     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10606     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10607     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10608     ok(size == 0, "Expected 0, got %d\n", size);
10609
10610     /* SOURCEDIR prop */
10611     size = MAX_PATH;
10612     lstrcpyA(path, "kiwi");
10613     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10614     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10615     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10616     ok(size == 0, "Expected 0, got %d\n", size);
10617
10618     r = MsiDoAction(hpkg, "CostInitialize");
10619     ok(r == ERROR_SUCCESS, "file cost failed\n");
10620
10621     /* SourceDir after CostInitialize */
10622     size = MAX_PATH;
10623     lstrcpyA(path, "kiwi");
10624     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10625     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10626     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10627     ok(size == 0, "Expected 0, got %d\n", size);
10628
10629     /* SOURCEDIR after CostInitialize */
10630     size = MAX_PATH;
10631     lstrcpyA(path, "kiwi");
10632     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10633     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10634     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10635     ok(size == 0, "Expected 0, got %d\n", size);
10636
10637     r = MsiDoAction(hpkg, "FileCost");
10638     ok(r == ERROR_SUCCESS, "file cost failed\n");
10639
10640     /* SourceDir after FileCost */
10641     size = MAX_PATH;
10642     lstrcpyA(path, "kiwi");
10643     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10644     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10645     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10646     ok(size == 0, "Expected 0, got %d\n", size);
10647
10648     /* SOURCEDIR after FileCost */
10649     size = MAX_PATH;
10650     lstrcpyA(path, "kiwi");
10651     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10652     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10653     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10654     ok(size == 0, "Expected 0, got %d\n", size);
10655
10656     r = MsiDoAction(hpkg, "CostFinalize");
10657     ok(r == ERROR_SUCCESS, "file cost failed\n");
10658
10659     /* SourceDir after CostFinalize */
10660     size = MAX_PATH;
10661     lstrcpyA(path, "kiwi");
10662     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10663     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10664     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10665     ok(size == 0, "Expected 0, got %d\n", size);
10666
10667     /* SOURCEDIR after CostFinalize */
10668     size = MAX_PATH;
10669     lstrcpyA(path, "kiwi");
10670     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10671     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10672     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10673     ok(size == 0, "Expected 0, got %d\n", size);
10674
10675     r = MsiDoAction(hpkg, "ResolveSource");
10676     ok(r == ERROR_SUCCESS, "file cost failed\n");
10677
10678     /* SourceDir after ResolveSource */
10679     size = MAX_PATH;
10680     lstrcpyA(path, "kiwi");
10681     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10682     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10683     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10684     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10685
10686     /* SOURCEDIR after ResolveSource */
10687     size = MAX_PATH;
10688     lstrcpyA(path, "kiwi");
10689     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10690     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10691     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10692     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10693
10694     /* random casing */
10695     size = MAX_PATH;
10696     lstrcpyA(path, "kiwi");
10697     r = MsiGetProperty(hpkg, "SoUrCeDiR", path, &size);
10698     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10699     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10700     ok(size == 0, "Expected 0, got %d\n", size);
10701
10702     MsiCloseHandle(hpkg);
10703
10704     /* reset the package state */
10705     sprintf(package, "#%i", hdb);
10706     r = MsiOpenPackage(package, &hpkg);
10707     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10708
10709     /* test how MsiGetSourcePath affects the properties */
10710
10711     /* SourceDir prop */
10712     size = MAX_PATH;
10713     lstrcpyA(path, "kiwi");
10714     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10715     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10716     todo_wine
10717     {
10718         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10719         ok(size == 0, "Expected 0, got %d\n", size);
10720     }
10721
10722     size = MAX_PATH;
10723     lstrcpyA(path, "kiwi");
10724     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10725     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10726     ok(!lstrcmpA(path, "kiwi"),
10727        "Expected path to be unchanged, got \"%s\"\n", path);
10728     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10729
10730     /* SourceDir after MsiGetSourcePath */
10731     size = MAX_PATH;
10732     lstrcpyA(path, "kiwi");
10733     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10734     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10735     todo_wine
10736     {
10737         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10738         ok(size == 0, "Expected 0, got %d\n", size);
10739     }
10740
10741     /* SOURCEDIR prop */
10742     size = MAX_PATH;
10743     lstrcpyA(path, "kiwi");
10744     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10745     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10746     todo_wine
10747     {
10748         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10749         ok(size == 0, "Expected 0, got %d\n", size);
10750     }
10751
10752     size = MAX_PATH;
10753     lstrcpyA(path, "kiwi");
10754     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10755     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10756     ok(!lstrcmpA(path, "kiwi"),
10757        "Expected path to be unchanged, got \"%s\"\n", path);
10758     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10759
10760     /* SOURCEDIR prop after MsiGetSourcePath */
10761     size = MAX_PATH;
10762     lstrcpyA(path, "kiwi");
10763     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10764     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10765     todo_wine
10766     {
10767         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10768         ok(size == 0, "Expected 0, got %d\n", size);
10769     }
10770
10771     r = MsiDoAction(hpkg, "CostInitialize");
10772     ok(r == ERROR_SUCCESS, "file cost failed\n");
10773
10774     /* SourceDir after CostInitialize */
10775     size = MAX_PATH;
10776     lstrcpyA(path, "kiwi");
10777     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10778     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10779     todo_wine
10780     {
10781         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10782         ok(size == 0, "Expected 0, got %d\n", size);
10783     }
10784
10785     size = MAX_PATH;
10786     lstrcpyA(path, "kiwi");
10787     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10788     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10789     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10790     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10791
10792     /* SourceDir after MsiGetSourcePath */
10793     size = MAX_PATH;
10794     lstrcpyA(path, "kiwi");
10795     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10796     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10797     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10798     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10799
10800     /* SOURCEDIR after CostInitialize */
10801     size = MAX_PATH;
10802     lstrcpyA(path, "kiwi");
10803     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10804     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10805     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10806     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10807
10808     /* SOURCEDIR source path still does not exist */
10809     size = MAX_PATH;
10810     lstrcpyA(path, "kiwi");
10811     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10812     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10813     ok(!lstrcmpA(path, "kiwi"),
10814        "Expected path to be unchanged, got \"%s\"\n", path);
10815     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10816
10817     r = MsiDoAction(hpkg, "FileCost");
10818     ok(r == ERROR_SUCCESS, "file cost failed\n");
10819
10820     /* SourceDir after FileCost */
10821     size = MAX_PATH;
10822     lstrcpyA(path, "kiwi");
10823     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10824     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10825     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10826     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10827
10828     /* SOURCEDIR after FileCost */
10829     size = MAX_PATH;
10830     lstrcpyA(path, "kiwi");
10831     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10832     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10833     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10834     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10835
10836     /* SOURCEDIR source path still does not exist */
10837     size = MAX_PATH;
10838     lstrcpyA(path, "kiwi");
10839     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10840     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10841     ok(!lstrcmpA(path, "kiwi"),
10842        "Expected path to be unchanged, got \"%s\"\n", path);
10843     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10844
10845     r = MsiDoAction(hpkg, "CostFinalize");
10846     ok(r == ERROR_SUCCESS, "file cost failed\n");
10847
10848     /* SourceDir after CostFinalize */
10849     size = MAX_PATH;
10850     lstrcpyA(path, "kiwi");
10851     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10852     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10853     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10854     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10855
10856     /* SOURCEDIR after CostFinalize */
10857     size = MAX_PATH;
10858     lstrcpyA(path, "kiwi");
10859     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10860     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10861     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10862     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10863
10864     /* SOURCEDIR source path still does not exist */
10865     size = MAX_PATH;
10866     lstrcpyA(path, "kiwi");
10867     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10868     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10869     ok(!lstrcmpA(path, "kiwi"),
10870        "Expected path to be unchanged, got \"%s\"\n", path);
10871     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10872
10873     r = MsiDoAction(hpkg, "ResolveSource");
10874     ok(r == ERROR_SUCCESS, "file cost failed\n");
10875
10876     /* SourceDir after ResolveSource */
10877     size = MAX_PATH;
10878     lstrcpyA(path, "kiwi");
10879     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10880     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10881     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10882     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10883
10884     /* SOURCEDIR after ResolveSource */
10885     size = MAX_PATH;
10886     lstrcpyA(path, "kiwi");
10887     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10888     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10889     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10890     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10891
10892     /* SOURCEDIR source path still does not exist */
10893     size = MAX_PATH;
10894     lstrcpyA(path, "kiwi");
10895     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10896     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10897     ok(!lstrcmpA(path, "kiwi"),
10898        "Expected path to be unchanged, got \"%s\"\n", path);
10899     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10900
10901     MsiCloseHandle(hdb);
10902     MsiCloseHandle(hpkg);
10903     DeleteFileA(msifile);
10904 }
10905
10906 struct access_res
10907 {
10908     BOOL gothandle;
10909     DWORD lasterr;
10910     BOOL ignore;
10911 };
10912
10913 static const struct access_res create[16] =
10914 {
10915     { TRUE, ERROR_SUCCESS, TRUE },
10916     { TRUE, ERROR_SUCCESS, TRUE },
10917     { TRUE, ERROR_SUCCESS, FALSE },
10918     { TRUE, ERROR_SUCCESS, FALSE },
10919     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10920     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10921     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10922     { TRUE, ERROR_SUCCESS, FALSE },
10923     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10924     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10925     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10926     { TRUE, ERROR_SUCCESS, TRUE },
10927     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10928     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10929     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10930     { TRUE, ERROR_SUCCESS, TRUE }
10931 };
10932
10933 static const struct access_res create_commit[16] =
10934 {
10935     { TRUE, ERROR_SUCCESS, TRUE },
10936     { TRUE, ERROR_SUCCESS, TRUE },
10937     { TRUE, ERROR_SUCCESS, FALSE },
10938     { TRUE, ERROR_SUCCESS, FALSE },
10939     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10940     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10941     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10942     { TRUE, ERROR_SUCCESS, FALSE },
10943     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10944     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10945     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10946     { TRUE, ERROR_SUCCESS, TRUE },
10947     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10948     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10949     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
10950     { TRUE, ERROR_SUCCESS, TRUE }
10951 };
10952
10953 static const struct access_res create_close[16] =
10954 {
10955     { TRUE, ERROR_SUCCESS, FALSE },
10956     { TRUE, ERROR_SUCCESS, FALSE },
10957     { TRUE, ERROR_SUCCESS, FALSE },
10958     { TRUE, ERROR_SUCCESS, FALSE },
10959     { TRUE, ERROR_SUCCESS, FALSE },
10960     { TRUE, ERROR_SUCCESS, FALSE },
10961     { TRUE, ERROR_SUCCESS, FALSE },
10962     { TRUE, ERROR_SUCCESS, FALSE },
10963     { TRUE, ERROR_SUCCESS, FALSE },
10964     { TRUE, ERROR_SUCCESS, FALSE },
10965     { TRUE, ERROR_SUCCESS, FALSE },
10966     { TRUE, ERROR_SUCCESS, FALSE },
10967     { TRUE, ERROR_SUCCESS, FALSE },
10968     { TRUE, ERROR_SUCCESS, FALSE },
10969     { TRUE, ERROR_SUCCESS, FALSE },
10970     { TRUE, ERROR_SUCCESS }
10971 };
10972
10973 static void _test_file_access(LPCSTR file, const struct access_res *ares, DWORD line)
10974 {
10975     DWORD access = 0, share = 0;
10976     DWORD lasterr;
10977     HANDLE hfile;
10978     int i, j, idx = 0;
10979
10980     for (i = 0; i < 4; i++)
10981     {
10982         if (i == 0) access = 0;
10983         if (i == 1) access = GENERIC_READ;
10984         if (i == 2) access = GENERIC_WRITE;
10985         if (i == 3) access = GENERIC_READ | GENERIC_WRITE;
10986
10987         for (j = 0; j < 4; j++)
10988         {
10989             if (ares[idx].ignore)
10990                 continue;
10991
10992             if (j == 0) share = 0;
10993             if (j == 1) share = FILE_SHARE_READ;
10994             if (j == 2) share = FILE_SHARE_WRITE;
10995             if (j == 3) share = FILE_SHARE_READ | FILE_SHARE_WRITE;
10996
10997             SetLastError(0xdeadbeef);
10998             hfile = CreateFileA(file, access, share, NULL, OPEN_EXISTING,
10999                                 FILE_ATTRIBUTE_NORMAL, 0);
11000             lasterr = GetLastError();
11001
11002             ok((hfile != INVALID_HANDLE_VALUE) == ares[idx].gothandle,
11003                "(%d, handle, %d): Expected %d, got %d\n",
11004                line, idx, ares[idx].gothandle,
11005                (hfile != INVALID_HANDLE_VALUE));
11006
11007             ok(lasterr == ares[idx].lasterr ||
11008                lasterr == 0xdeadbeef, /* win9x */
11009                "(%d, lasterr, %d): Expected %d, got %d\n",
11010                line, idx, ares[idx].lasterr, lasterr);
11011
11012             CloseHandle(hfile);
11013             idx++;
11014         }
11015     }
11016 }
11017
11018 #define test_file_access(file, ares) _test_file_access(file, ares, __LINE__)
11019
11020 static void test_access(void)
11021 {
11022     MSIHANDLE hdb;
11023     UINT r;
11024
11025     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATE, &hdb);
11026     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11027
11028     test_file_access(msifile, create);
11029
11030     r = MsiDatabaseCommit(hdb);
11031     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11032
11033     test_file_access(msifile, create_commit);
11034
11035     MsiCloseHandle(hdb);
11036
11037     test_file_access(msifile, create_close);
11038
11039     DeleteFileA(msifile);
11040
11041     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATEDIRECT, &hdb);
11042     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11043
11044     test_file_access(msifile, create);
11045
11046     r = MsiDatabaseCommit(hdb);
11047     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11048
11049     test_file_access(msifile, create_commit);
11050
11051     MsiCloseHandle(hdb);
11052
11053     test_file_access(msifile, create_close);
11054
11055     DeleteFileA(msifile);
11056 }
11057
11058 static void test_emptypackage(void)
11059 {
11060     MSIHANDLE hpkg, hdb, hsuminfo;
11061     MSIHANDLE hview, hrec;
11062     MSICONDITION condition;
11063     CHAR buffer[MAX_PATH];
11064     DWORD size;
11065     UINT r;
11066
11067     r = MsiOpenPackageA("", &hpkg);
11068     todo_wine
11069     {
11070         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11071     }
11072
11073     hdb = MsiGetActiveDatabase(hpkg);
11074     todo_wine
11075     {
11076         ok(hdb != 0, "Expected a valid database handle\n");
11077     }
11078
11079     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Tables`", &hview);
11080     todo_wine
11081     {
11082         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11083     }
11084     r = MsiViewExecute(hview, 0);
11085     todo_wine
11086     {
11087         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11088     }
11089
11090     r = MsiViewFetch(hview, &hrec);
11091     todo_wine
11092     {
11093         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11094     }
11095
11096     size = MAX_PATH;
11097     r = MsiRecordGetString(hrec, 1, buffer, &size);
11098     todo_wine
11099     {
11100         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11101         ok(!lstrcmpA(buffer, "_Property"),
11102            "Expected \"_Property\", got \"%s\"\n", buffer);
11103     }
11104
11105     MsiCloseHandle(hrec);
11106
11107     r = MsiViewFetch(hview, &hrec);
11108     todo_wine
11109     {
11110         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11111     }
11112
11113     size = MAX_PATH;
11114     r = MsiRecordGetString(hrec, 1, buffer, &size);
11115     todo_wine
11116     {
11117         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11118         ok(!lstrcmpA(buffer, "#_FolderCache"),
11119            "Expected \"_Property\", got \"%s\"\n", buffer);
11120     }
11121
11122     MsiCloseHandle(hrec);
11123     MsiViewClose(hview);
11124     MsiCloseHandle(hview);
11125
11126     condition = MsiDatabaseIsTablePersistentA(hdb, "_Property");
11127     todo_wine
11128     {
11129         ok(condition == MSICONDITION_FALSE,
11130            "Expected MSICONDITION_FALSE, got %d\n", condition);
11131     }
11132
11133     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
11134     todo_wine
11135     {
11136         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11137     }
11138     r = MsiViewExecute(hview, 0);
11139     todo_wine
11140     {
11141         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11142     }
11143
11144     /* _Property table is not empty */
11145     r = MsiViewFetch(hview, &hrec);
11146     todo_wine
11147     {
11148         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11149     }
11150
11151     MsiCloseHandle(hrec);
11152     MsiViewClose(hview);
11153     MsiCloseHandle(hview);
11154
11155     condition = MsiDatabaseIsTablePersistentA(hdb, "#_FolderCache");
11156     todo_wine
11157     {
11158         ok(condition == MSICONDITION_FALSE,
11159            "Expected MSICONDITION_FALSE, got %d\n", condition);
11160     }
11161
11162     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `#_FolderCache`", &hview);
11163     todo_wine
11164     {
11165         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11166     }
11167     r = MsiViewExecute(hview, 0);
11168     todo_wine
11169     {
11170         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11171     }
11172
11173     /* #_FolderCache is not empty */
11174     r = MsiViewFetch(hview, &hrec);
11175     todo_wine
11176     {
11177         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11178     }
11179
11180     MsiCloseHandle(hrec);
11181     MsiViewClose(hview);
11182     MsiCloseHandle(hview);
11183
11184     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Streams`", &hview);
11185     todo_wine
11186     {
11187         ok(r == ERROR_BAD_QUERY_SYNTAX,
11188            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11189     }
11190
11191     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Storages`", &hview);
11192     todo_wine
11193     {
11194         ok(r == ERROR_BAD_QUERY_SYNTAX,
11195            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11196     }
11197
11198     r = MsiGetSummaryInformationA(hdb, NULL, 0, &hsuminfo);
11199     todo_wine
11200     {
11201         ok(r == ERROR_INSTALL_PACKAGE_INVALID,
11202            "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
11203     }
11204
11205     MsiCloseHandle(hsuminfo);
11206
11207     r = MsiDatabaseCommit(hdb);
11208     todo_wine
11209     {
11210         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11211     }
11212
11213     MsiCloseHandle(hdb);
11214     MsiCloseHandle(hpkg);
11215 }
11216
11217 static void test_MsiGetProductProperty(void)
11218 {
11219     MSIHANDLE hprod, hdb;
11220     CHAR val[MAX_PATH];
11221     CHAR path[MAX_PATH];
11222     CHAR query[MAX_PATH];
11223     CHAR keypath[MAX_PATH*2];
11224     CHAR prodcode[MAX_PATH];
11225     CHAR prod_squashed[MAX_PATH];
11226     HKEY prodkey, userkey, props;
11227     DWORD size;
11228     LONG res;
11229     UINT r;
11230     SC_HANDLE scm;
11231
11232     scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
11233     if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
11234     {
11235         win_skip("Different registry keys on Win9x and WinMe\n");
11236         return;
11237     }
11238     CloseServiceHandle(scm);
11239
11240     GetCurrentDirectoryA(MAX_PATH, path);
11241     lstrcatA(path, "\\");
11242
11243     create_test_guid(prodcode, prod_squashed);
11244
11245     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
11246     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11247
11248     r = MsiDatabaseCommit(hdb);
11249     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11250
11251     r = set_summary_info(hdb);
11252     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11253
11254     r = run_query(hdb,
11255             "CREATE TABLE `Directory` ( "
11256             "`Directory` CHAR(255) NOT NULL, "
11257             "`Directory_Parent` CHAR(255), "
11258             "`DefaultDir` CHAR(255) NOT NULL "
11259             "PRIMARY KEY `Directory`)");
11260     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11261
11262     r = run_query(hdb,
11263             "CREATE TABLE `Property` ( "
11264             "`Property` CHAR(72) NOT NULL, "
11265             "`Value` CHAR(255) "
11266             "PRIMARY KEY `Property`)");
11267     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11268
11269     sprintf(query, "INSERT INTO `Property` "
11270             "(`Property`, `Value`) "
11271             "VALUES( 'ProductCode', '%s' )", prodcode);
11272     r = run_query(hdb, query);
11273     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11274
11275     r = MsiDatabaseCommit(hdb);
11276     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11277
11278     MsiCloseHandle(hdb);
11279
11280     lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
11281     lstrcatA(keypath, prod_squashed);
11282
11283     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
11284     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11285
11286     lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\");
11287     lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\");
11288     lstrcatA(keypath, prod_squashed);
11289
11290     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
11291     if (res == ERROR_ACCESS_DENIED)
11292     {
11293         skip("Not enough rights to perform tests\n");
11294         RegDeleteKeyA(prodkey, "");
11295         RegCloseKey(prodkey);
11296         return;
11297     }
11298     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11299
11300     res = RegCreateKeyA(userkey, "InstallProperties", &props);
11301     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11302
11303     lstrcpyA(val, path);
11304     lstrcatA(val, "\\winetest.msi");
11305     res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
11306                          (const BYTE *)val, lstrlenA(val) + 1);
11307     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11308
11309     hprod = 0xdeadbeef;
11310     r = MsiOpenProductA(prodcode, &hprod);
11311     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11312     ok(hprod != 0 && hprod != 0xdeadbeef, "Expected a valid product handle\n");
11313
11314     /* hProduct is invalid */
11315     size = MAX_PATH;
11316     lstrcpyA(val, "apple");
11317     r = MsiGetProductPropertyA(0xdeadbeef, "ProductCode", val, &size);
11318     ok(r == ERROR_INVALID_HANDLE,
11319        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11320     ok(!lstrcmpA(val, "apple"),
11321        "Expected val to be unchanged, got \"%s\"\n", val);
11322     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11323
11324     /* szProperty is NULL */
11325     size = MAX_PATH;
11326     lstrcpyA(val, "apple");
11327     r = MsiGetProductPropertyA(hprod, NULL, val, &size);
11328     ok(r == ERROR_INVALID_PARAMETER,
11329        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11330     ok(!lstrcmpA(val, "apple"),
11331        "Expected val to be unchanged, got \"%s\"\n", val);
11332     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11333
11334     /* szProperty is empty */
11335     size = MAX_PATH;
11336     lstrcpyA(val, "apple");
11337     r = MsiGetProductPropertyA(hprod, "", val, &size);
11338     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11339     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11340     ok(size == 0, "Expected 0, got %d\n", size);
11341
11342     /* get the property */
11343     size = MAX_PATH;
11344     lstrcpyA(val, "apple");
11345     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11346     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11347     ok(!lstrcmpA(val, prodcode),
11348        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11349     ok(size == lstrlenA(prodcode),
11350        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11351
11352     /* lpValueBuf is NULL */
11353     size = MAX_PATH;
11354     r = MsiGetProductPropertyA(hprod, "ProductCode", NULL, &size);
11355     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11356     ok(size == lstrlenA(prodcode),
11357        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11358
11359     /* pcchValueBuf is NULL */
11360     lstrcpyA(val, "apple");
11361     r = MsiGetProductPropertyA(hprod, "ProductCode", val, NULL);
11362     ok(r == ERROR_INVALID_PARAMETER,
11363        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11364     ok(!lstrcmpA(val, "apple"),
11365        "Expected val to be unchanged, got \"%s\"\n", val);
11366     ok(size == lstrlenA(prodcode),
11367        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11368
11369     /* pcchValueBuf is too small */
11370     size = 4;
11371     lstrcpyA(val, "apple");
11372     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11373     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
11374     ok(!strncmp(val, prodcode, 3),
11375        "Expected first 3 chars of \"%s\", got \"%s\"\n", prodcode, val);
11376     ok(size == lstrlenA(prodcode),
11377        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11378
11379     /* pcchValueBuf does not leave room for NULL terminator */
11380     size = lstrlenA(prodcode);
11381     lstrcpyA(val, "apple");
11382     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11383     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
11384     ok(!strncmp(val, prodcode, lstrlenA(prodcode) - 1),
11385        "Expected first 37 chars of \"%s\", got \"%s\"\n", prodcode, val);
11386     ok(size == lstrlenA(prodcode),
11387        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11388
11389     /* pcchValueBuf has enough room for NULL terminator */
11390     size = lstrlenA(prodcode) + 1;
11391     lstrcpyA(val, "apple");
11392     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11393     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11394     ok(!lstrcmpA(val, prodcode),
11395        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11396     ok(size == lstrlenA(prodcode),
11397        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11398
11399     /* nonexistent property */
11400     size = MAX_PATH;
11401     lstrcpyA(val, "apple");
11402     r = MsiGetProductPropertyA(hprod, "IDontExist", val, &size);
11403     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11404     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11405     ok(size == 0, "Expected 0, got %d\n", size);
11406
11407     r = MsiSetPropertyA(hprod, "NewProperty", "value");
11408     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11409
11410     /* non-product property set */
11411     size = MAX_PATH;
11412     lstrcpyA(val, "apple");
11413     r = MsiGetProductPropertyA(hprod, "NewProperty", val, &size);
11414     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11415     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11416     ok(size == 0, "Expected 0, got %d\n", size);
11417
11418     r = MsiSetPropertyA(hprod, "ProductCode", "value");
11419     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11420
11421     /* non-product property that is also a product property set */
11422     size = MAX_PATH;
11423     lstrcpyA(val, "apple");
11424     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11425     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11426     ok(!lstrcmpA(val, prodcode),
11427        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11428     ok(size == lstrlenA(prodcode),
11429        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11430
11431     MsiCloseHandle(hprod);
11432
11433     RegDeleteValueA(props, "LocalPackage");
11434     RegDeleteKeyA(props, "");
11435     RegCloseKey(props);
11436     RegDeleteKeyA(userkey, "");
11437     RegCloseKey(userkey);
11438     RegDeleteKeyA(prodkey, "");
11439     RegCloseKey(prodkey);
11440     DeleteFileA(msifile);
11441 }
11442
11443 static void test_MsiSetProperty(void)
11444 {
11445     MSIHANDLE hpkg, hdb, hrec;
11446     CHAR buf[MAX_PATH];
11447     LPCSTR query;
11448     DWORD size;
11449     UINT r;
11450
11451     hpkg = package_from_db(create_package_db());
11452     ok(hpkg != 0, "Expected a valid package\n");
11453
11454     /* invalid hInstall */
11455     r = MsiSetPropertyA(0, "Prop", "Val");
11456     ok(r == ERROR_INVALID_HANDLE,
11457        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11458
11459     /* invalid hInstall */
11460     r = MsiSetPropertyA(0xdeadbeef, "Prop", "Val");
11461     ok(r == ERROR_INVALID_HANDLE,
11462        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11463
11464     /* szName is NULL */
11465     r = MsiSetPropertyA(hpkg, NULL, "Val");
11466     ok(r == ERROR_INVALID_PARAMETER,
11467        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11468
11469     /* both szName and szValue are NULL */
11470     r = MsiSetPropertyA(hpkg, NULL, NULL);
11471     ok(r == ERROR_INVALID_PARAMETER,
11472        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11473
11474     /* szName is empty */
11475     r = MsiSetPropertyA(hpkg, "", "Val");
11476     ok(r == ERROR_FUNCTION_FAILED,
11477        "Expected ERROR_FUNCTION_FAILED, got %d\n", r);
11478
11479     /* szName is empty and szValue is NULL */
11480     r = MsiSetPropertyA(hpkg, "", NULL);
11481     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11482
11483     /* set a property */
11484     r = MsiSetPropertyA(hpkg, "Prop", "Val");
11485     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11486
11487     /* get the property */
11488     size = MAX_PATH;
11489     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11490     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11491     ok(!lstrcmpA(buf, "Val"), "Expected \"Val\", got \"%s\"\n", buf);
11492     ok(size == 3, "Expected 3, got %d\n", size);
11493
11494     /* update the property */
11495     r = MsiSetPropertyA(hpkg, "Prop", "Nuvo");
11496     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11497
11498     /* get the property */
11499     size = MAX_PATH;
11500     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11501     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11502     ok(!lstrcmpA(buf, "Nuvo"), "Expected \"Nuvo\", got \"%s\"\n", buf);
11503     ok(size == 4, "Expected 4, got %d\n", size);
11504
11505     hdb = MsiGetActiveDatabase(hpkg);
11506     ok(hdb != 0, "Expected a valid database handle\n");
11507
11508     /* set prop is not in the _Property table */
11509     query = "SELECT * FROM `_Property` WHERE `Property` = 'Prop'";
11510     r = do_query(hdb, query, &hrec);
11511     ok(r == ERROR_BAD_QUERY_SYNTAX,
11512        "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11513
11514     /* set prop is not in the Property table */
11515     query = "SELECT * FROM `Property` WHERE `Property` = 'Prop'";
11516     r = do_query(hdb, query, &hrec);
11517     ok(r == ERROR_BAD_QUERY_SYNTAX,
11518        "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11519
11520     MsiCloseHandle(hdb);
11521
11522     /* szValue is an empty string */
11523     r = MsiSetPropertyA(hpkg, "Prop", "");
11524     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11525
11526     /* try to get the property */
11527     size = MAX_PATH;
11528     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11529     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11530     ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
11531     ok(size == 0, "Expected 0, got %d\n", size);
11532
11533     /* reset the property */
11534     r = MsiSetPropertyA(hpkg, "Prop", "BlueTap");
11535     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11536
11537     /* delete the property */
11538     r = MsiSetPropertyA(hpkg, "Prop", NULL);
11539     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11540
11541     /* try to get the property */
11542     size = MAX_PATH;
11543     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11544     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11545     ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
11546     ok(size == 0, "Expected 0, got %d\n", size);
11547
11548     MsiCloseHandle(hpkg);
11549     DeleteFileA(msifile);
11550 }
11551
11552 static void test_MsiApplyMultiplePatches(void)
11553 {
11554     UINT r, type = GetDriveType(NULL);
11555
11556     if (!pMsiApplyMultiplePatchesA) {
11557         win_skip("MsiApplyMultiplePatchesA not found\n");
11558         return;
11559     }
11560
11561     r = pMsiApplyMultiplePatchesA(NULL, NULL, NULL);
11562     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11563
11564     r = pMsiApplyMultiplePatchesA("", NULL, NULL);
11565     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11566
11567     r = pMsiApplyMultiplePatchesA(";", NULL, NULL);
11568     todo_wine
11569     {
11570         if (type == DRIVE_FIXED)
11571             ok(r == ERROR_PATH_NOT_FOUND,
11572                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11573         else
11574             ok(r == ERROR_INVALID_NAME,
11575                "Expected ERROR_INVALID_NAME, got %u\n", r);
11576     }
11577
11578     r = pMsiApplyMultiplePatchesA("  ;", NULL, NULL);
11579     todo_wine
11580     {
11581         if (type == DRIVE_FIXED)
11582             ok(r == ERROR_PATCH_PACKAGE_OPEN_FAILED,
11583                "Expected ERROR_PATCH_PACKAGE_OPEN_FAILED, got %u\n", r);
11584         else
11585             ok(r == ERROR_INVALID_NAME,
11586                "Expected ERROR_INVALID_NAME, got %u\n", r);
11587     }
11588
11589     r = pMsiApplyMultiplePatchesA(";;", NULL, NULL);
11590     todo_wine
11591     {
11592         if (type == DRIVE_FIXED)
11593             ok(r == ERROR_PATH_NOT_FOUND,
11594                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11595         else
11596             ok(r == ERROR_INVALID_NAME,
11597                "Expected ERROR_INVALID_NAME, got %u\n", r);
11598     }
11599
11600     r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;", NULL, NULL);
11601     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11602
11603     r = pMsiApplyMultiplePatchesA(";nosuchpatchpackage", NULL, NULL);
11604     todo_wine
11605     {
11606         if (type == DRIVE_FIXED)
11607             ok(r == ERROR_PATH_NOT_FOUND,
11608                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11609         else
11610             ok(r == ERROR_INVALID_NAME,
11611                "Expected ERROR_INVALID_NAME, got %u\n", r);
11612     }
11613
11614     r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;nosuchpatchpackage", NULL, NULL);
11615     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11616
11617     r = pMsiApplyMultiplePatchesA("  nosuchpatchpackage  ;  nosuchpatchpackage  ", NULL, NULL);
11618     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11619 }
11620
11621 static void test_MsiApplyPatch(void)
11622 {
11623     UINT r;
11624
11625     r = MsiApplyPatch(NULL, NULL, INSTALLTYPE_DEFAULT, NULL);
11626     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11627
11628     r = MsiApplyPatch("", NULL, INSTALLTYPE_DEFAULT, NULL);
11629     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11630 }
11631
11632 START_TEST(package)
11633 {
11634     init_functionpointers();
11635
11636     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
11637
11638     test_createpackage();
11639     test_doaction();
11640     test_gettargetpath_bad();
11641     test_settargetpath();
11642     test_props();
11643     test_property_table();
11644     test_condition();
11645     test_msipackage();
11646     test_formatrecord2();
11647     test_states();
11648     test_getproperty();
11649     test_removefiles();
11650     test_appsearch();
11651     test_appsearch_complocator();
11652     test_appsearch_reglocator();
11653     test_appsearch_inilocator();
11654     test_appsearch_drlocator();
11655     test_featureparents();
11656     test_installprops();
11657     test_launchconditions();
11658     test_ccpsearch();
11659     test_complocator();
11660     test_MsiGetSourcePath();
11661     test_shortlongsource();
11662     test_sourcedir();
11663     test_access();
11664     test_emptypackage();
11665     test_MsiGetProductProperty();
11666     test_MsiSetProperty();
11667     test_MsiApplyMultiplePatches();
11668     test_MsiApplyPatch();
11669 }