msi: Register more patch details.
[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 #include <srrestoreptapi.h>
30
31 #include "wine/test.h"
32
33 static const char msifile[] = "winetest-package.msi";
34 char CURR_DIR[MAX_PATH];
35
36 static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR);
37
38 static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
39
40 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
41 static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*);
42
43 static void init_functionpointers(void)
44 {
45     HMODULE hmsi = GetModuleHandleA("msi.dll");
46     HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
47     HMODULE hsrclient;
48
49 #define GET_PROC(mod, func) \
50     p ## func = (void*)GetProcAddress(mod, #func);
51
52     GET_PROC(hmsi, MsiApplyMultiplePatchesA);
53
54     GET_PROC(hadvapi32, ConvertSidToStringSidA);
55
56     hsrclient = LoadLibraryA("srclient.dll");
57     GET_PROC(hsrclient, SRRemoveRestorePoint);
58     GET_PROC(hsrclient, SRSetRestorePointA);
59 #undef GET_PROC
60 }
61
62
63 static LPSTR get_user_sid(LPSTR *usersid)
64 {
65     HANDLE token;
66     BYTE buf[1024];
67     DWORD size;
68     PTOKEN_USER user;
69
70     if (!pConvertSidToStringSidA)
71     {
72         win_skip("ConvertSidToStringSidA is not available\n");
73         return NULL;
74     }
75
76     *usersid = NULL;
77     OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
78     size = sizeof(buf);
79     GetTokenInformation(token, TokenUser, buf, size, &size);
80     user = (PTOKEN_USER)buf;
81     pConvertSidToStringSidA(user->User.Sid, usersid);
82     ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError());
83     CloseHandle(token);
84     return *usersid;
85 }
86
87 /* RegDeleteTreeW from dlls/advapi32/registry.c */
88 static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
89 {
90     LONG ret;
91     DWORD dwMaxSubkeyLen, dwMaxValueLen;
92     DWORD dwMaxLen, dwSize;
93     WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
94     HKEY hSubKey = hKey;
95
96     if(lpszSubKey)
97     {
98         ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
99         if (ret) return ret;
100     }
101
102     ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
103             &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
104     if (ret) goto cleanup;
105
106     dwMaxSubkeyLen++;
107     dwMaxValueLen++;
108     dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
109     if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
110     {
111         /* Name too big: alloc a buffer for it */
112         if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
113         {
114             ret = ERROR_NOT_ENOUGH_MEMORY;
115             goto cleanup;
116         }
117     }
118
119     /* Recursively delete all the subkeys */
120     while (TRUE)
121     {
122         dwSize = dwMaxLen;
123         if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
124                           NULL, NULL, NULL)) break;
125
126         ret = package_RegDeleteTreeW(hSubKey, lpszName);
127         if (ret) goto cleanup;
128     }
129
130     if (lpszSubKey)
131         ret = RegDeleteKeyW(hKey, lpszSubKey);
132     else
133         while (TRUE)
134         {
135             dwSize = dwMaxLen;
136             if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
137                   NULL, NULL, NULL, NULL)) break;
138
139             ret = RegDeleteValueW(hKey, lpszName);
140             if (ret) goto cleanup;
141         }
142
143 cleanup:
144     if (lpszName != szNameBuf)
145         HeapFree(GetProcessHeap(), 0, lpszName);
146     if(lpszSubKey)
147         RegCloseKey(hSubKey);
148     return ret;
149 }
150
151 static BOOL squash_guid(LPCWSTR in, LPWSTR out)
152 {
153     DWORD i,n=1;
154     GUID guid;
155
156     if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid)))
157         return FALSE;
158
159     for(i=0; i<8; i++)
160         out[7-i] = in[n++];
161     n++;
162     for(i=0; i<4; i++)
163         out[11-i] = in[n++];
164     n++;
165     for(i=0; i<4; i++)
166         out[15-i] = in[n++];
167     n++;
168     for(i=0; i<2; i++)
169     {
170         out[17+i*2] = in[n++];
171         out[16+i*2] = in[n++];
172     }
173     n++;
174     for( ; i<8; i++)
175     {
176         out[17+i*2] = in[n++];
177         out[16+i*2] = in[n++];
178     }
179     out[32]=0;
180     return TRUE;
181 }
182
183 static void create_test_guid(LPSTR prodcode, LPSTR squashed)
184 {
185     WCHAR guidW[MAX_PATH];
186     WCHAR squashedW[MAX_PATH];
187     GUID guid;
188     HRESULT hr;
189     int size;
190
191     hr = CoCreateGuid(&guid);
192     ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
193
194     size = StringFromGUID2(&guid, guidW, MAX_PATH);
195     ok(size == 39, "Expected 39, got %d\n", hr);
196
197     WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL);
198     squash_guid(guidW, squashedW);
199     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
200 }
201
202 static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context,
203                                LPCSTR guid, LPSTR usersid, BOOL dir)
204 {
205     WCHAR guidW[MAX_PATH];
206     WCHAR squashedW[MAX_PATH];
207     CHAR squashed[MAX_PATH];
208     CHAR comppath[MAX_PATH];
209     CHAR prodpath[MAX_PATH];
210     CHAR path[MAX_PATH];
211     LPCSTR prod = NULL;
212     HKEY hkey;
213
214     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
215     squash_guid(guidW, squashedW);
216     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
217
218     if (context == MSIINSTALLCONTEXT_MACHINE)
219     {
220         prod = "3D0DAE300FACA1300AD792060BCDAA92";
221         sprintf(comppath,
222                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
223                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
224         lstrcpyA(prodpath,
225                  "SOFTWARE\\Classes\\Installer\\"
226                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
227     }
228     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
229     {
230         prod = "7D2F387510109040002000060BECB6AB";
231         sprintf(comppath,
232                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
233                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
234         sprintf(prodpath,
235                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
236                 "Installer\\%s\\Installer\\Products\\"
237                 "7D2F387510109040002000060BECB6AB", usersid);
238     }
239     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
240     {
241         prod = "7D2F387510109040002000060BECB6AB";
242         sprintf(comppath,
243                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
244                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
245         sprintf(prodpath,
246                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
247                 "Installer\\Managed\\%s\\Installer\\Products\\"
248                 "7D2F387510109040002000060BECB6AB", usersid);
249     }
250
251     RegCreateKeyA(HKEY_LOCAL_MACHINE, comppath, &hkey);
252
253     lstrcpyA(path, CURR_DIR);
254     lstrcatA(path, "\\");
255     if (!dir) lstrcatA(path, filename);
256
257     RegSetValueExA(hkey, prod, 0, REG_SZ, (LPBYTE)path, lstrlenA(path));
258     RegCloseKey(hkey);
259
260     RegCreateKeyA(HKEY_LOCAL_MACHINE, prodpath, &hkey);
261     RegCloseKey(hkey);
262 }
263
264 static void delete_component_path(LPCSTR guid, MSIINSTALLCONTEXT context, LPSTR usersid)
265 {
266     WCHAR guidW[MAX_PATH];
267     WCHAR squashedW[MAX_PATH];
268     WCHAR substrW[MAX_PATH];
269     CHAR squashed[MAX_PATH];
270     CHAR comppath[MAX_PATH];
271     CHAR prodpath[MAX_PATH];
272
273     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
274     squash_guid(guidW, squashedW);
275     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
276
277     if (context == MSIINSTALLCONTEXT_MACHINE)
278     {
279         sprintf(comppath,
280                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
281                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
282         lstrcpyA(prodpath,
283                  "SOFTWARE\\Classes\\Installer\\"
284                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
285     }
286     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
287     {
288         sprintf(comppath,
289                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
290                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
291         sprintf(prodpath,
292                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
293                 "Installer\\%s\\Installer\\Products\\"
294                 "7D2F387510109040002000060BECB6AB", usersid);
295     }
296     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
297     {
298         sprintf(comppath,
299                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
300                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
301         sprintf(prodpath,
302                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
303                 "Installer\\Managed\\%s\\Installer\\Products\\"
304                 "7D2F387510109040002000060BECB6AB", usersid);
305     }
306
307     MultiByteToWideChar(CP_ACP, 0, comppath, -1, substrW, MAX_PATH);
308     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
309
310     MultiByteToWideChar(CP_ACP, 0, prodpath, -1, substrW, MAX_PATH);
311     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
312 }
313
314 static UINT do_query(MSIHANDLE hdb, const char *query, MSIHANDLE *phrec)
315 {
316     MSIHANDLE hview = 0;
317     UINT r, ret;
318
319     /* open a select query */
320     r = MsiDatabaseOpenView(hdb, query, &hview);
321     if (r != ERROR_SUCCESS)
322         return r;
323     r = MsiViewExecute(hview, 0);
324     if (r != ERROR_SUCCESS)
325         return r;
326     ret = MsiViewFetch(hview, phrec);
327     r = MsiViewClose(hview);
328     if (r != ERROR_SUCCESS)
329         return r;
330     r = MsiCloseHandle(hview);
331     if (r != ERROR_SUCCESS)
332         return r;
333     return ret;
334 }
335
336 static UINT run_query( MSIHANDLE hdb, const char *query )
337 {
338     MSIHANDLE hview = 0;
339     UINT r;
340
341     r = MsiDatabaseOpenView(hdb, query, &hview);
342     if( r != ERROR_SUCCESS )
343         return r;
344
345     r = MsiViewExecute(hview, 0);
346     if( r == ERROR_SUCCESS )
347         r = MsiViewClose(hview);
348     MsiCloseHandle(hview);
349     return r;
350 }
351
352 static UINT create_component_table( MSIHANDLE hdb )
353 {
354     return run_query( hdb,
355             "CREATE TABLE `Component` ( "
356             "`Component` CHAR(72) NOT NULL, "
357             "`ComponentId` CHAR(38), "
358             "`Directory_` CHAR(72) NOT NULL, "
359             "`Attributes` SHORT NOT NULL, "
360             "`Condition` CHAR(255), "
361             "`KeyPath` CHAR(72) "
362             "PRIMARY KEY `Component`)" );
363 }
364
365 static UINT create_feature_table( MSIHANDLE hdb )
366 {
367     return run_query( hdb,
368             "CREATE TABLE `Feature` ( "
369             "`Feature` CHAR(38) NOT NULL, "
370             "`Feature_Parent` CHAR(38), "
371             "`Title` CHAR(64), "
372             "`Description` CHAR(255), "
373             "`Display` SHORT NOT NULL, "
374             "`Level` SHORT NOT NULL, "
375             "`Directory_` CHAR(72), "
376             "`Attributes` SHORT NOT NULL "
377             "PRIMARY KEY `Feature`)" );
378 }
379
380 static UINT create_feature_components_table( MSIHANDLE hdb )
381 {
382     return run_query( hdb,
383             "CREATE TABLE `FeatureComponents` ( "
384             "`Feature_` CHAR(38) NOT NULL, "
385             "`Component_` CHAR(72) NOT NULL "
386             "PRIMARY KEY `Feature_`, `Component_` )" );
387 }
388
389 static UINT create_file_table( MSIHANDLE hdb )
390 {
391     return run_query( hdb,
392             "CREATE TABLE `File` ("
393             "`File` CHAR(72) NOT NULL, "
394             "`Component_` CHAR(72) NOT NULL, "
395             "`FileName` CHAR(255) NOT NULL, "
396             "`FileSize` LONG NOT NULL, "
397             "`Version` CHAR(72), "
398             "`Language` CHAR(20), "
399             "`Attributes` SHORT, "
400             "`Sequence` SHORT NOT NULL "
401             "PRIMARY KEY `File`)" );
402 }
403
404 static UINT create_remove_file_table( MSIHANDLE hdb )
405 {
406     return run_query( hdb,
407             "CREATE TABLE `RemoveFile` ("
408             "`FileKey` CHAR(72) NOT NULL, "
409             "`Component_` CHAR(72) NOT NULL, "
410             "`FileName` CHAR(255) LOCALIZABLE, "
411             "`DirProperty` CHAR(72) NOT NULL, "
412             "`InstallMode` SHORT NOT NULL "
413             "PRIMARY KEY `FileKey`)" );
414 }
415
416 static UINT create_appsearch_table( MSIHANDLE hdb )
417 {
418     return run_query( hdb,
419             "CREATE TABLE `AppSearch` ("
420             "`Property` CHAR(72) NOT NULL, "
421             "`Signature_` CHAR(72) NOT NULL "
422             "PRIMARY KEY `Property`, `Signature_`)" );
423 }
424
425 static UINT create_reglocator_table( MSIHANDLE hdb )
426 {
427     return run_query( hdb,
428             "CREATE TABLE `RegLocator` ("
429             "`Signature_` CHAR(72) NOT NULL, "
430             "`Root` SHORT NOT NULL, "
431             "`Key` CHAR(255) NOT NULL, "
432             "`Name` CHAR(255), "
433             "`Type` SHORT "
434             "PRIMARY KEY `Signature_`)" );
435 }
436
437 static UINT create_signature_table( MSIHANDLE hdb )
438 {
439     return run_query( hdb,
440             "CREATE TABLE `Signature` ("
441             "`Signature` CHAR(72) NOT NULL, "
442             "`FileName` CHAR(255) NOT NULL, "
443             "`MinVersion` CHAR(20), "
444             "`MaxVersion` CHAR(20), "
445             "`MinSize` LONG, "
446             "`MaxSize` LONG, "
447             "`MinDate` LONG, "
448             "`MaxDate` LONG, "
449             "`Languages` CHAR(255) "
450             "PRIMARY KEY `Signature`)" );
451 }
452
453 static UINT create_launchcondition_table( MSIHANDLE hdb )
454 {
455     return run_query( hdb,
456             "CREATE TABLE `LaunchCondition` ("
457             "`Condition` CHAR(255) NOT NULL, "
458             "`Description` CHAR(255) NOT NULL "
459             "PRIMARY KEY `Condition`)" );
460 }
461
462 static UINT create_property_table( MSIHANDLE hdb )
463 {
464     return run_query( hdb,
465             "CREATE TABLE `Property` ("
466             "`Property` CHAR(72) NOT NULL, "
467             "`Value` CHAR(0) "
468             "PRIMARY KEY `Property`)" );
469 }
470
471 static UINT create_install_execute_sequence_table( MSIHANDLE hdb )
472 {
473     return run_query( hdb,
474             "CREATE TABLE `InstallExecuteSequence` ("
475             "`Action` CHAR(72) NOT NULL, "
476             "`Condition` CHAR(255), "
477             "`Sequence` SHORT "
478             "PRIMARY KEY `Action`)" );
479 }
480
481 static UINT create_media_table( MSIHANDLE hdb )
482 {
483     return run_query( hdb,
484             "CREATE TABLE `Media` ("
485             "`DiskId` SHORT NOT NULL, "
486             "`LastSequence` SHORT NOT NULL, "
487             "`DiskPrompt` CHAR(64), "
488             "`Cabinet` CHAR(255), "
489             "`VolumeLabel` CHAR(32), "
490             "`Source` CHAR(72) "
491             "PRIMARY KEY `DiskId`)" );
492 }
493
494 static UINT create_ccpsearch_table( MSIHANDLE hdb )
495 {
496     return run_query( hdb,
497             "CREATE TABLE `CCPSearch` ("
498             "`Signature_` CHAR(72) NOT NULL "
499             "PRIMARY KEY `Signature_`)" );
500 }
501
502 static UINT create_drlocator_table( MSIHANDLE hdb )
503 {
504     return run_query( hdb,
505             "CREATE TABLE `DrLocator` ("
506             "`Signature_` CHAR(72) NOT NULL, "
507             "`Parent` CHAR(72), "
508             "`Path` CHAR(255), "
509             "`Depth` SHORT "
510             "PRIMARY KEY `Signature_`, `Parent`, `Path`)" );
511 }
512
513 static UINT create_complocator_table( MSIHANDLE hdb )
514 {
515     return run_query( hdb,
516             "CREATE TABLE `CompLocator` ("
517             "`Signature_` CHAR(72) NOT NULL, "
518             "`ComponentId` CHAR(38) NOT NULL, "
519             "`Type` SHORT "
520             "PRIMARY KEY `Signature_`)" );
521 }
522
523 static UINT create_inilocator_table( MSIHANDLE hdb )
524 {
525     return run_query( hdb,
526             "CREATE TABLE `IniLocator` ("
527             "`Signature_` CHAR(72) NOT NULL, "
528             "`FileName` CHAR(255) NOT NULL, "
529             "`Section` CHAR(96)NOT NULL, "
530             "`Key` CHAR(128)NOT NULL, "
531             "`Field` SHORT, "
532             "`Type` SHORT "
533             "PRIMARY KEY `Signature_`)" );
534 }
535
536 #define make_add_entry(type, qtext) \
537     static UINT add##_##type##_##entry( MSIHANDLE hdb, const char *values ) \
538     { \
539         char insert[] = qtext; \
540         char *query; \
541         UINT sz, r; \
542         sz = strlen(values) + sizeof insert; \
543         query = HeapAlloc(GetProcessHeap(),0,sz); \
544         sprintf(query,insert,values); \
545         r = run_query( hdb, query ); \
546         HeapFree(GetProcessHeap(), 0, query); \
547         return r; \
548     }
549
550 make_add_entry(component,
551                "INSERT INTO `Component`  "
552                "(`Component`, `ComponentId`, `Directory_`, "
553                "`Attributes`, `Condition`, `KeyPath`) VALUES( %s )")
554
555 make_add_entry(directory,
556                "INSERT INTO `Directory` "
557                "(`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )")
558
559 make_add_entry(feature,
560                "INSERT INTO `Feature` "
561                "(`Feature`, `Feature_Parent`, `Title`, `Description`, "
562                "`Display`, `Level`, `Directory_`, `Attributes`) VALUES( %s )")
563
564 make_add_entry(feature_components,
565                "INSERT INTO `FeatureComponents` "
566                "(`Feature_`, `Component_`) VALUES( %s )")
567
568 make_add_entry(file,
569                "INSERT INTO `File` "
570                "(`File`, `Component_`, `FileName`, `FileSize`, "
571                "`Version`, `Language`, `Attributes`, `Sequence`) VALUES( %s )")
572
573 make_add_entry(appsearch,
574                "INSERT INTO `AppSearch` "
575                "(`Property`, `Signature_`) VALUES( %s )")
576
577 make_add_entry(reglocator,
578                "INSERT INTO `RegLocator` "
579                "(`Signature_`, `Root`, `Key`, `Name`, `Type`) VALUES( %s )")
580
581 make_add_entry(signature,
582                "INSERT INTO `Signature` "
583                "(`Signature`, `FileName`, `MinVersion`, `MaxVersion`,"
584                " `MinSize`, `MaxSize`, `MinDate`, `MaxDate`, `Languages`) "
585                "VALUES( %s )")
586
587 make_add_entry(launchcondition,
588                "INSERT INTO `LaunchCondition` "
589                "(`Condition`, `Description`) VALUES( %s )")
590
591 make_add_entry(property,
592                "INSERT INTO `Property` (`Property`, `Value`) VALUES( %s )")
593
594 make_add_entry(install_execute_sequence,
595                "INSERT INTO `InstallExecuteSequence` "
596                "(`Action`, `Condition`, `Sequence`) VALUES( %s )")
597
598 make_add_entry(media,
599                "INSERT INTO `Media` "
600                "(`DiskId`, `LastSequence`, `DiskPrompt`, "
601                "`Cabinet`, `VolumeLabel`, `Source`) VALUES( %s )")
602
603 make_add_entry(ccpsearch,
604                "INSERT INTO `CCPSearch` (`Signature_`) VALUES( %s )")
605
606 make_add_entry(drlocator,
607                "INSERT INTO `DrLocator` "
608                "(`Signature_`, `Parent`, `Path`, `Depth`) VALUES( %s )")
609
610 make_add_entry(complocator,
611                "INSERT INTO `CompLocator` "
612                "(`Signature_`, `ComponentId`, `Type`) VALUES( %s )")
613
614 make_add_entry(inilocator,
615                "INSERT INTO `IniLocator` "
616                "(`Signature_`, `FileName`, `Section`, `Key`, `Field`, `Type`) "
617                "VALUES( %s )")
618
619 static UINT set_summary_info(MSIHANDLE hdb)
620 {
621     UINT res;
622     MSIHANDLE suminfo;
623
624     /* build summary info */
625     res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo);
626     ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
627
628     res = MsiSummaryInfoSetProperty(suminfo,2, VT_LPSTR, 0,NULL,
629                         "Installation Database");
630     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
631
632     res = MsiSummaryInfoSetProperty(suminfo,3, VT_LPSTR, 0,NULL,
633                         "Installation Database");
634     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
635
636     res = MsiSummaryInfoSetProperty(suminfo,4, VT_LPSTR, 0,NULL,
637                         "Wine Hackers");
638     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
639
640     res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL,
641                     ";1033");
642     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
643
644     res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL,
645                     "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
646     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
647
648     res = MsiSummaryInfoSetProperty(suminfo, 14, VT_I4, 100, NULL, NULL);
649     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
650
651     res = MsiSummaryInfoSetProperty(suminfo, 15, VT_I4, 0, NULL, NULL);
652     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
653
654     res = MsiSummaryInfoPersist(suminfo);
655     ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
656
657     res = MsiCloseHandle( suminfo);
658     ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
659
660     return res;
661 }
662
663
664 static MSIHANDLE create_package_db(void)
665 {
666     MSIHANDLE hdb = 0;
667     UINT res;
668
669     DeleteFile(msifile);
670
671     /* create an empty database */
672     res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb );
673     ok( res == ERROR_SUCCESS , "Failed to create database\n" );
674     if( res != ERROR_SUCCESS )
675         return hdb;
676
677     res = MsiDatabaseCommit( hdb );
678     ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
679
680     res = set_summary_info(hdb);
681
682     res = run_query( hdb,
683             "CREATE TABLE `Directory` ( "
684             "`Directory` CHAR(255) NOT NULL, "
685             "`Directory_Parent` CHAR(255), "
686             "`DefaultDir` CHAR(255) NOT NULL "
687             "PRIMARY KEY `Directory`)" );
688     ok( res == ERROR_SUCCESS , "Failed to create directory table\n" );
689
690     return hdb;
691 }
692
693 static MSIHANDLE package_from_db(MSIHANDLE hdb)
694 {
695     UINT res;
696     CHAR szPackage[10];
697     MSIHANDLE hPackage;
698
699     sprintf(szPackage,"#%i",hdb);
700     res = MsiOpenPackage(szPackage,&hPackage);
701     if (res != ERROR_SUCCESS)
702         return 0;
703
704     res = MsiCloseHandle(hdb);
705     if (res != ERROR_SUCCESS)
706         return 0;
707
708     return hPackage;
709 }
710
711 static void create_test_file(const CHAR *name)
712 {
713     HANDLE file;
714     DWORD written;
715
716     file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
717     ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
718     WriteFile(file, name, strlen(name), &written, NULL);
719     WriteFile(file, "\n", strlen("\n"), &written, NULL);
720     CloseHandle(file);
721 }
722
723 typedef struct _tagVS_VERSIONINFO
724 {
725     WORD wLength;
726     WORD wValueLength;
727     WORD wType;
728     WCHAR szKey[1];
729     WORD wPadding1[1];
730     VS_FIXEDFILEINFO Value;
731     WORD wPadding2[1];
732     WORD wChildren[1];
733 } VS_VERSIONINFO;
734
735 #define roundoffs(a, b, r) (((BYTE *)(b) - (BYTE *)(a) + ((r) - 1)) & ~((r) - 1))
736 #define roundpos(a, b, r) (((BYTE *)(a)) + roundoffs(a, b, r))
737
738 static BOOL create_file_with_version(const CHAR *name, LONG ms, LONG ls)
739 {
740     VS_VERSIONINFO *pVerInfo;
741     VS_FIXEDFILEINFO *pFixedInfo;
742     LPBYTE buffer, ofs;
743     CHAR path[MAX_PATH];
744     DWORD handle, size;
745     HANDLE resource;
746     BOOL ret = FALSE;
747
748     GetSystemDirectory(path, MAX_PATH);
749     /* Some dlls can't be updated on Vista/W2K8 */
750     lstrcatA(path, "\\version.dll");
751
752     CopyFileA(path, name, FALSE);
753
754     size = GetFileVersionInfoSize(path, &handle);
755     buffer = HeapAlloc(GetProcessHeap(), 0, size);
756
757     GetFileVersionInfoA(path, 0, size, buffer);
758
759     pVerInfo = (VS_VERSIONINFO *)buffer;
760     ofs = (BYTE *)&pVerInfo->szKey[lstrlenW(pVerInfo->szKey) + 1];
761     pFixedInfo = (VS_FIXEDFILEINFO *)roundpos(pVerInfo, ofs, 4);
762
763     pFixedInfo->dwFileVersionMS = ms;
764     pFixedInfo->dwFileVersionLS = ls;
765     pFixedInfo->dwProductVersionMS = ms;
766     pFixedInfo->dwProductVersionLS = ls;
767
768     resource = BeginUpdateResource(name, FALSE);
769     if (!resource)
770         goto done;
771
772     if (!UpdateResource(resource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO),
773                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), buffer, size))
774         goto done;
775
776     if (!EndUpdateResource(resource, FALSE))
777         goto done;
778
779     ret = TRUE;
780
781 done:
782     HeapFree(GetProcessHeap(), 0, buffer);
783     return ret;
784 }
785
786 static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status)
787 {
788     RESTOREPOINTINFOA spec;
789
790     spec.dwEventType = event_type;
791     spec.dwRestorePtType = APPLICATION_INSTALL;
792     spec.llSequenceNumber = status->llSequenceNumber;
793     lstrcpyA(spec.szDescription, "msitest restore point");
794
795     return pSRSetRestorePointA(&spec, status);
796 }
797
798 static void remove_restore_point(DWORD seq_number)
799 {
800     DWORD res;
801
802     res = pSRRemoveRestorePoint(seq_number);
803     if (res != ERROR_SUCCESS)
804         trace("Failed to remove the restore point : %08x\n", res);
805 }
806
807 static void test_createpackage(void)
808 {
809     MSIHANDLE hPackage = 0;
810     UINT res;
811
812     hPackage = package_from_db(create_package_db());
813     ok( hPackage != 0, " Failed to create package\n");
814
815     res = MsiCloseHandle( hPackage);
816     ok( res == ERROR_SUCCESS , "Failed to close package\n" );
817     DeleteFile(msifile);
818 }
819
820 static void test_doaction( void )
821 {
822     MSIHANDLE hpkg;
823     UINT r;
824
825     r = MsiDoAction( -1, NULL );
826     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
827
828     hpkg = package_from_db(create_package_db());
829     ok( hpkg, "failed to create package\n");
830
831     r = MsiDoAction(hpkg, NULL);
832     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
833
834     r = MsiDoAction(0, "boo");
835     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
836
837     r = MsiDoAction(hpkg, "boo");
838     ok( r == ERROR_FUNCTION_NOT_CALLED, "wrong return val\n");
839
840     MsiCloseHandle( hpkg );
841     DeleteFile(msifile);
842 }
843
844 static void test_gettargetpath_bad(void)
845 {
846     static const WCHAR boo[] = {'b','o','o',0};
847     static const WCHAR empty[] = {0};
848     char buffer[0x80];
849     WCHAR bufferW[0x80];
850     MSIHANDLE hpkg;
851     DWORD sz;
852     UINT r;
853
854     hpkg = package_from_db(create_package_db());
855     ok( hpkg, "failed to create package\n");
856
857     r = MsiGetTargetPath( 0, NULL, NULL, NULL );
858     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
859
860     r = MsiGetTargetPath( 0, NULL, NULL, &sz );
861     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
862
863     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
864     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
865
866     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
867     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
868
869     r = MsiGetTargetPath( hpkg, "boo", NULL, NULL );
870     ok( r == ERROR_DIRECTORY, "wrong return val\n");
871
872     r = MsiGetTargetPath( hpkg, "boo", buffer, NULL );
873     ok( r == ERROR_DIRECTORY, "wrong return val\n");
874
875     sz = 0;
876     r = MsiGetTargetPath( hpkg, "", buffer, &sz );
877     ok( r == ERROR_DIRECTORY, "wrong return val\n");
878
879     r = MsiGetTargetPathW( 0, NULL, NULL, NULL );
880     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
881
882     r = MsiGetTargetPathW( 0, NULL, NULL, &sz );
883     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
884
885     r = MsiGetTargetPathW( 0, boo, NULL, NULL );
886     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
887
888     r = MsiGetTargetPathW( 0, boo, NULL, NULL );
889     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
890
891     r = MsiGetTargetPathW( hpkg, boo, NULL, NULL );
892     ok( r == ERROR_DIRECTORY, "wrong return val\n");
893
894     r = MsiGetTargetPathW( hpkg, boo, bufferW, NULL );
895     ok( r == ERROR_DIRECTORY, "wrong return val\n");
896
897     sz = 0;
898     r = MsiGetTargetPathW( hpkg, empty, bufferW, &sz );
899     ok( r == ERROR_DIRECTORY, "wrong return val\n");
900
901     MsiCloseHandle( hpkg );
902     DeleteFile(msifile);
903 }
904
905 static void query_file_path(MSIHANDLE hpkg, LPCSTR file, LPSTR buff)
906 {
907     UINT r;
908     DWORD size;
909     MSIHANDLE rec;
910
911     rec = MsiCreateRecord( 1 );
912     ok(rec, "MsiCreate record failed\n");
913
914     r = MsiRecordSetString( rec, 0, file );
915     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
916
917     size = MAX_PATH;
918     r = MsiFormatRecord( hpkg, rec, buff, &size );
919     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
920
921     MsiCloseHandle( rec );
922 }
923
924 static void test_settargetpath(void)
925 {
926     char tempdir[MAX_PATH+8], buffer[MAX_PATH], file[MAX_PATH];
927     DWORD sz;
928     MSIHANDLE hpkg;
929     UINT r;
930     MSIHANDLE hdb;
931
932     hdb = create_package_db();
933     ok ( hdb, "failed to create package database\n" );
934
935     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" );
936     ok( r == S_OK, "failed to add directory entry: %d\n" , r );
937
938     r = create_component_table( hdb );
939     ok( r == S_OK, "cannot create Component table: %d\n", r );
940
941     r = add_component_entry( hdb, "'RootComp', '{83e2694d-0864-4124-9323-6d37630912a1}', 'TARGETDIR', 8, '', 'RootFile'" );
942     ok( r == S_OK, "cannot add dummy component: %d\n", r );
943
944     r = add_component_entry( hdb, "'TestComp', '{A3FB59C8-C293-4F7E-B8C5-F0E1D8EEE4E5}', 'TestDir', 0, '', 'TestFile'" );
945     ok( r == S_OK, "cannot add test component: %d\n", r );
946
947     r = create_feature_table( hdb );
948     ok( r == S_OK, "cannot create Feature table: %d\n", r );
949
950     r = add_feature_entry( hdb, "'TestFeature', '', '', '', 0, 1, '', 0" );
951     ok( r == ERROR_SUCCESS, "cannot add TestFeature to Feature table: %d\n", r );
952
953     r = create_feature_components_table( hdb );
954     ok( r == S_OK, "cannot create FeatureComponents table: %d\n", r );
955
956     r = add_feature_components_entry( hdb, "'TestFeature', 'RootComp'" );
957     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
958
959     r = add_feature_components_entry( hdb, "'TestFeature', 'TestComp'" );
960     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
961
962     add_directory_entry( hdb, "'TestParent', 'TARGETDIR', 'TestParent'" );
963     add_directory_entry( hdb, "'TestDir', 'TestParent', 'TestDir'" );
964
965     r = create_file_table( hdb );
966     ok( r == S_OK, "cannot create File table: %d\n", r );
967
968     r = add_file_entry( hdb, "'RootFile', 'RootComp', 'rootfile.txt', 0, '', '1033', 8192, 1" );
969     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
970
971     r = add_file_entry( hdb, "'TestFile', 'TestComp', 'testfile.txt', 0, '', '1033', 8192, 1" );
972     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
973
974     hpkg = package_from_db( hdb );
975     ok( hpkg, "failed to create package\n");
976
977     r = MsiDoAction( hpkg, "CostInitialize");
978     ok( r == ERROR_SUCCESS, "cost init failed\n");
979
980     r = MsiDoAction( hpkg, "FileCost");
981     ok( r == ERROR_SUCCESS, "file cost failed\n");
982
983     r = MsiDoAction( hpkg, "CostFinalize");
984     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
985
986     r = MsiSetTargetPath( 0, NULL, NULL );
987     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
988
989     r = MsiSetTargetPath( 0, "boo", "C:\\bogusx" );
990     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
991
992     r = MsiSetTargetPath( hpkg, "boo", NULL );
993     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
994
995     r = MsiSetTargetPath( hpkg, "boo", "c:\\bogusx" );
996     ok( r == ERROR_DIRECTORY, "wrong return val\n");
997
998     sz = sizeof tempdir - 1;
999     r = MsiGetTargetPath( hpkg, "TARGETDIR", tempdir, &sz );
1000     sprintf( file, "%srootfile.txt", tempdir );
1001     buffer[0] = 0;
1002     query_file_path( hpkg, "[#RootFile]", buffer );
1003     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1004     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer );
1005
1006     GetTempFileName( tempdir, "_wt", 0, buffer );
1007     sprintf( tempdir, "%s\\subdir", buffer );
1008
1009     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
1010     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
1011         "MsiSetTargetPath on file returned %d\n", r );
1012
1013     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
1014     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
1015         "MsiSetTargetPath on 'subdir' of file returned %d\n", r );
1016
1017     DeleteFile( buffer );
1018
1019     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
1020     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
1021
1022     r = GetFileAttributes( buffer );
1023     ok ( r == INVALID_FILE_ATTRIBUTES, "file/directory exists after MsiSetTargetPath. Attributes: %08X\n", r );
1024
1025     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
1026     ok( r == ERROR_SUCCESS, "MsiSetTargetPath on subsubdir returned %d\n", r );
1027
1028     sz = sizeof buffer - 1;
1029     lstrcat( tempdir, "\\" );
1030     r = MsiGetTargetPath( hpkg, "TARGETDIR", buffer, &sz );
1031     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1032     ok( !lstrcmp(buffer, tempdir), "Expected %s, got %s\n", tempdir, buffer);
1033
1034     sprintf( file, "%srootfile.txt", tempdir );
1035     query_file_path( hpkg, "[#RootFile]", buffer );
1036     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer);
1037
1038     r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two" );
1039     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
1040
1041     query_file_path( hpkg, "[#TestFile]", buffer );
1042     ok( !lstrcmpi(buffer, "C:\\one\\two\\TestDir\\testfile.txt"),
1043         "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer );
1044
1045     sz = sizeof buffer - 1;
1046     r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz );
1047     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1048     ok( !lstrcmpi(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer);
1049
1050     r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two\\three" );
1051     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
1052
1053     sz = sizeof buffer - 1;
1054     r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz );
1055     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1056     ok( !lstrcmpi(buffer, "C:\\one\\two\\three\\"), "Expected C:\\one\\two\\three\\, got %s\n", buffer);
1057
1058     MsiCloseHandle( hpkg );
1059 }
1060
1061 static void test_condition(void)
1062 {
1063     MSICONDITION r;
1064     MSIHANDLE hpkg;
1065
1066     hpkg = package_from_db(create_package_db());
1067     ok( hpkg, "failed to create package\n");
1068
1069     r = MsiEvaluateCondition(0, NULL);
1070     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1071
1072     r = MsiEvaluateCondition(hpkg, NULL);
1073     ok( r == MSICONDITION_NONE, "wrong return val\n");
1074
1075     r = MsiEvaluateCondition(hpkg, "");
1076     ok( r == MSICONDITION_NONE, "wrong return val\n");
1077
1078     r = MsiEvaluateCondition(hpkg, "1");
1079     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1080
1081     r = MsiEvaluateCondition(hpkg, "0");
1082     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1083
1084     r = MsiEvaluateCondition(hpkg, "-1");
1085     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1086
1087     r = MsiEvaluateCondition(hpkg, "0 = 0");
1088     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1089
1090     r = MsiEvaluateCondition(hpkg, "0 <> 0");
1091     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1092
1093     r = MsiEvaluateCondition(hpkg, "0 = 1");
1094     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1095
1096     r = MsiEvaluateCondition(hpkg, "0 > 1");
1097     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1098
1099     r = MsiEvaluateCondition(hpkg, "0 ~> 1");
1100     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1101
1102     r = MsiEvaluateCondition(hpkg, "1 > 1");
1103     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1104
1105     r = MsiEvaluateCondition(hpkg, "1 ~> 1");
1106     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1107
1108     r = MsiEvaluateCondition(hpkg, "0 >= 1");
1109     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1110
1111     r = MsiEvaluateCondition(hpkg, "0 ~>= 1");
1112     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1113
1114     r = MsiEvaluateCondition(hpkg, "1 >= 1");
1115     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1116
1117     r = MsiEvaluateCondition(hpkg, "1 ~>= 1");
1118     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1119
1120     r = MsiEvaluateCondition(hpkg, "0 < 1");
1121     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1122
1123     r = MsiEvaluateCondition(hpkg, "0 ~< 1");
1124     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1125
1126     r = MsiEvaluateCondition(hpkg, "1 < 1");
1127     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1128
1129     r = MsiEvaluateCondition(hpkg, "1 ~< 1");
1130     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1131
1132     r = MsiEvaluateCondition(hpkg, "0 <= 1");
1133     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1134
1135     r = MsiEvaluateCondition(hpkg, "0 ~<= 1");
1136     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1137
1138     r = MsiEvaluateCondition(hpkg, "1 <= 1");
1139     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1140
1141     r = MsiEvaluateCondition(hpkg, "1 ~<= 1");
1142     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1143
1144     r = MsiEvaluateCondition(hpkg, "0 >=");
1145     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1146
1147     r = MsiEvaluateCondition(hpkg, " ");
1148     ok( r == MSICONDITION_NONE, "wrong return val\n");
1149
1150     r = MsiEvaluateCondition(hpkg, "LicView <> \"1\"");
1151     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1152
1153     r = MsiEvaluateCondition(hpkg, "LicView <> \"0\"");
1154     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1155
1156     r = MsiEvaluateCondition(hpkg, "LicView <> LicView");
1157     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1158
1159     r = MsiEvaluateCondition(hpkg, "not 0");
1160     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1161
1162     r = MsiEvaluateCondition(hpkg, "not LicView");
1163     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1164
1165     r = MsiEvaluateCondition(hpkg, "\"Testing\" ~<< \"Testing\"");
1166     ok (r == MSICONDITION_TRUE, "wrong return val\n");
1167
1168     r = MsiEvaluateCondition(hpkg, "LicView ~<< \"Testing\"");
1169     ok (r == MSICONDITION_FALSE, "wrong return val\n");
1170
1171     r = MsiEvaluateCondition(hpkg, "Not LicView ~<< \"Testing\"");
1172     ok (r == MSICONDITION_TRUE, "wrong return val\n");
1173
1174     r = MsiEvaluateCondition(hpkg, "not \"A\"");
1175     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1176
1177     r = MsiEvaluateCondition(hpkg, "~not \"A\"");
1178     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1179
1180     r = MsiEvaluateCondition(hpkg, "\"0\"");
1181     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1182
1183     r = MsiEvaluateCondition(hpkg, "1 and 2");
1184     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1185
1186     r = MsiEvaluateCondition(hpkg, "not 0 and 3");
1187     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1188
1189     r = MsiEvaluateCondition(hpkg, "not 0 and 0");
1190     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1191
1192     r = MsiEvaluateCondition(hpkg, "not 0 or 1");
1193     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1194
1195     r = MsiEvaluateCondition(hpkg, "(0)");
1196     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1197
1198     r = MsiEvaluateCondition(hpkg, "(((((1))))))");
1199     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1200
1201     r = MsiEvaluateCondition(hpkg, "(((((1)))))");
1202     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1203
1204     r = MsiEvaluateCondition(hpkg, " \"A\" < \"B\" ");
1205     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1206
1207     r = MsiEvaluateCondition(hpkg, " \"A\" > \"B\" ");
1208     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1209
1210     r = MsiEvaluateCondition(hpkg, " \"1\" > \"12\" ");
1211     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1212
1213     r = MsiEvaluateCondition(hpkg, " \"100\" < \"21\" ");
1214     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1215
1216     r = MsiEvaluateCondition(hpkg, "0 < > 0");
1217     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1218
1219     r = MsiEvaluateCondition(hpkg, "(1<<1) == 2");
1220     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1221
1222     r = MsiEvaluateCondition(hpkg, " \"A\" = \"a\" ");
1223     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1224
1225     r = MsiEvaluateCondition(hpkg, " \"A\" ~ = \"a\" ");
1226     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1227
1228     r = MsiEvaluateCondition(hpkg, " \"A\" ~= \"a\" ");
1229     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1230
1231     r = MsiEvaluateCondition(hpkg, " \"A\" ~= 1 ");
1232     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1233
1234     r = MsiEvaluateCondition(hpkg, " \"A\" = 1 ");
1235     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1236
1237     r = MsiEvaluateCondition(hpkg, " 1 ~= 1 ");
1238     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1239
1240     r = MsiEvaluateCondition(hpkg, " 1 ~= \"1\" ");
1241     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1242
1243     r = MsiEvaluateCondition(hpkg, " 1 = \"1\" ");
1244     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1245
1246     r = MsiEvaluateCondition(hpkg, " 0 = \"1\" ");
1247     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1248
1249     r = MsiEvaluateCondition(hpkg, " 0 < \"100\" ");
1250     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1251
1252     r = MsiEvaluateCondition(hpkg, " 100 > \"0\" ");
1253     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1254
1255     r = MsiEvaluateCondition(hpkg, "1 XOR 1");
1256     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1257
1258     r = MsiEvaluateCondition(hpkg, "1 IMP 1");
1259     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1260
1261     r = MsiEvaluateCondition(hpkg, "1 IMP 0");
1262     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1263
1264     r = MsiEvaluateCondition(hpkg, "0 IMP 0");
1265     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1266
1267     r = MsiEvaluateCondition(hpkg, "0 EQV 0");
1268     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1269
1270     r = MsiEvaluateCondition(hpkg, "0 EQV 1");
1271     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1272
1273     r = MsiEvaluateCondition(hpkg, "1 IMP 1 OR 0");
1274     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1275
1276     r = MsiEvaluateCondition(hpkg, "1 IMPL 1");
1277     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1278
1279     r = MsiEvaluateCondition(hpkg, "\"ASFD\" >< \"S\" ");
1280     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1281
1282     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"s\" ");
1283     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1284
1285     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"\" ");
1286     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1287
1288     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"sss\" ");
1289     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1290
1291     MsiSetProperty(hpkg, "mm", "5" );
1292
1293     r = MsiEvaluateCondition(hpkg, "mm = 5");
1294     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1295
1296     r = MsiEvaluateCondition(hpkg, "mm < 6");
1297     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1298
1299     r = MsiEvaluateCondition(hpkg, "mm <= 5");
1300     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1301
1302     r = MsiEvaluateCondition(hpkg, "mm > 4");
1303     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1304
1305     r = MsiEvaluateCondition(hpkg, "mm < 12");
1306     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1307
1308     r = MsiEvaluateCondition(hpkg, "mm = \"5\"");
1309     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1310
1311     r = MsiEvaluateCondition(hpkg, "0 = \"\"");
1312     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1313
1314     r = MsiEvaluateCondition(hpkg, "0 AND \"\"");
1315     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1316
1317     r = MsiEvaluateCondition(hpkg, "1 AND \"\"");
1318     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1319
1320     r = MsiEvaluateCondition(hpkg, "1 AND \"1\"");
1321     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1322
1323     r = MsiEvaluateCondition(hpkg, "3 >< 1");
1324     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1325
1326     r = MsiEvaluateCondition(hpkg, "3 >< 4");
1327     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1328
1329     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 0");
1330     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1331
1332     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1");
1333     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1334
1335     r = MsiEvaluateCondition(hpkg, "NOT 1 OR 0");
1336     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1337
1338     r = MsiEvaluateCondition(hpkg, "0 AND 1 OR 1");
1339     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1340
1341     r = MsiEvaluateCondition(hpkg, "0 AND 0 OR 1");
1342     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1343
1344     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1 OR 0");
1345     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1346
1347     r = MsiEvaluateCondition(hpkg, "_1 = _1");
1348     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1349
1350     r = MsiEvaluateCondition(hpkg, "( 1 AND 1 ) = 2");
1351     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1352
1353     r = MsiEvaluateCondition(hpkg, "NOT ( 1 AND 1 )");
1354     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1355
1356     r = MsiEvaluateCondition(hpkg, "NOT A AND (BBBBBBBBBB=2 OR CCC=1) AND Ddddddddd");
1357     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1358
1359     r = MsiEvaluateCondition(hpkg, "Installed<>\"\"");
1360     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1361
1362     r = MsiEvaluateCondition(hpkg, "NOT 1 AND 0");
1363     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1364
1365     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1366     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1367
1368     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1369     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1370
1371     r = MsiEvaluateCondition(hpkg, "bandalmael<0");
1372     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1373
1374     r = MsiEvaluateCondition(hpkg, "bandalmael>0");
1375     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1376
1377     r = MsiEvaluateCondition(hpkg, "bandalmael>=0");
1378     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1379
1380     r = MsiEvaluateCondition(hpkg, "bandalmael<=0");
1381     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1382
1383     r = MsiEvaluateCondition(hpkg, "bandalmael~<>0");
1384     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1385
1386     MsiSetProperty(hpkg, "bandalmael", "0" );
1387     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1388     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1389
1390     MsiSetProperty(hpkg, "bandalmael", "" );
1391     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1392     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1393
1394     MsiSetProperty(hpkg, "bandalmael", "asdf" );
1395     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1396     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1397
1398     MsiSetProperty(hpkg, "bandalmael", "0asdf" );
1399     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1400     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1401
1402     MsiSetProperty(hpkg, "bandalmael", "0 " );
1403     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1404     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1405
1406     MsiSetProperty(hpkg, "bandalmael", "-0" );
1407     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1408     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1409
1410     MsiSetProperty(hpkg, "bandalmael", "0000000000000" );
1411     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1412     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1413
1414     MsiSetProperty(hpkg, "bandalmael", "--0" );
1415     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1416     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1417
1418     MsiSetProperty(hpkg, "bandalmael", "0x00" );
1419     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1420     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1421
1422     MsiSetProperty(hpkg, "bandalmael", "-" );
1423     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1424     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1425
1426     MsiSetProperty(hpkg, "bandalmael", "+0" );
1427     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1428     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1429
1430     MsiSetProperty(hpkg, "bandalmael", "0.0" );
1431     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1432     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1433     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1434     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1435
1436     MsiSetProperty(hpkg, "one", "hi");
1437     MsiSetProperty(hpkg, "two", "hithere");
1438     r = MsiEvaluateCondition(hpkg, "one >< two");
1439     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1440
1441     MsiSetProperty(hpkg, "one", "hithere");
1442     MsiSetProperty(hpkg, "two", "hi");
1443     r = MsiEvaluateCondition(hpkg, "one >< two");
1444     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1445
1446     MsiSetProperty(hpkg, "one", "hello");
1447     MsiSetProperty(hpkg, "two", "hi");
1448     r = MsiEvaluateCondition(hpkg, "one >< two");
1449     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1450
1451     MsiSetProperty(hpkg, "one", "hellohithere");
1452     MsiSetProperty(hpkg, "two", "hi");
1453     r = MsiEvaluateCondition(hpkg, "one >< two");
1454     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1455
1456     MsiSetProperty(hpkg, "one", "");
1457     MsiSetProperty(hpkg, "two", "hi");
1458     r = MsiEvaluateCondition(hpkg, "one >< two");
1459     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1460
1461     MsiSetProperty(hpkg, "one", "hi");
1462     MsiSetProperty(hpkg, "two", "");
1463     r = MsiEvaluateCondition(hpkg, "one >< two");
1464     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1465
1466     MsiSetProperty(hpkg, "one", "");
1467     MsiSetProperty(hpkg, "two", "");
1468     r = MsiEvaluateCondition(hpkg, "one >< two");
1469     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1470
1471     MsiSetProperty(hpkg, "one", "1234");
1472     MsiSetProperty(hpkg, "two", "1");
1473     r = MsiEvaluateCondition(hpkg, "one >< two");
1474     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1475
1476     MsiSetProperty(hpkg, "one", "one 1234");
1477     MsiSetProperty(hpkg, "two", "1");
1478     r = MsiEvaluateCondition(hpkg, "one >< two");
1479     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1480
1481     MsiSetProperty(hpkg, "one", "hithere");
1482     MsiSetProperty(hpkg, "two", "hi");
1483     r = MsiEvaluateCondition(hpkg, "one << two");
1484     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1485
1486     MsiSetProperty(hpkg, "one", "hi");
1487     MsiSetProperty(hpkg, "two", "hithere");
1488     r = MsiEvaluateCondition(hpkg, "one << two");
1489     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1490
1491     MsiSetProperty(hpkg, "one", "hi");
1492     MsiSetProperty(hpkg, "two", "hi");
1493     r = MsiEvaluateCondition(hpkg, "one << two");
1494     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1495
1496     MsiSetProperty(hpkg, "one", "abcdhithere");
1497     MsiSetProperty(hpkg, "two", "hi");
1498     r = MsiEvaluateCondition(hpkg, "one << two");
1499     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1500
1501     MsiSetProperty(hpkg, "one", "");
1502     MsiSetProperty(hpkg, "two", "hi");
1503     r = MsiEvaluateCondition(hpkg, "one << two");
1504     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1505
1506     MsiSetProperty(hpkg, "one", "hithere");
1507     MsiSetProperty(hpkg, "two", "");
1508     r = MsiEvaluateCondition(hpkg, "one << two");
1509     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1510
1511     MsiSetProperty(hpkg, "one", "");
1512     MsiSetProperty(hpkg, "two", "");
1513     r = MsiEvaluateCondition(hpkg, "one << two");
1514     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1515
1516     MsiSetProperty(hpkg, "one", "1234");
1517     MsiSetProperty(hpkg, "two", "1");
1518     r = MsiEvaluateCondition(hpkg, "one << two");
1519     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1520
1521     MsiSetProperty(hpkg, "one", "1234 one");
1522     MsiSetProperty(hpkg, "two", "1");
1523     r = MsiEvaluateCondition(hpkg, "one << two");
1524     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1525
1526     MsiSetProperty(hpkg, "one", "hithere");
1527     MsiSetProperty(hpkg, "two", "there");
1528     r = MsiEvaluateCondition(hpkg, "one >> two");
1529     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1530
1531     MsiSetProperty(hpkg, "one", "hithere");
1532     MsiSetProperty(hpkg, "two", "hi");
1533     r = MsiEvaluateCondition(hpkg, "one >> two");
1534     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1535
1536     MsiSetProperty(hpkg, "one", "there");
1537     MsiSetProperty(hpkg, "two", "hithere");
1538     r = MsiEvaluateCondition(hpkg, "one >> two");
1539     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1540
1541     MsiSetProperty(hpkg, "one", "there");
1542     MsiSetProperty(hpkg, "two", "there");
1543     r = MsiEvaluateCondition(hpkg, "one >> two");
1544     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1545
1546     MsiSetProperty(hpkg, "one", "abcdhithere");
1547     MsiSetProperty(hpkg, "two", "hi");
1548     r = MsiEvaluateCondition(hpkg, "one >> two");
1549     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1550
1551     MsiSetProperty(hpkg, "one", "");
1552     MsiSetProperty(hpkg, "two", "there");
1553     r = MsiEvaluateCondition(hpkg, "one >> two");
1554     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1555
1556     MsiSetProperty(hpkg, "one", "there");
1557     MsiSetProperty(hpkg, "two", "");
1558     r = MsiEvaluateCondition(hpkg, "one >> two");
1559     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1560
1561     MsiSetProperty(hpkg, "one", "");
1562     MsiSetProperty(hpkg, "two", "");
1563     r = MsiEvaluateCondition(hpkg, "one >> two");
1564     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1565
1566     MsiSetProperty(hpkg, "one", "1234");
1567     MsiSetProperty(hpkg, "two", "4");
1568     r = MsiEvaluateCondition(hpkg, "one >> two");
1569     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1570
1571     MsiSetProperty(hpkg, "one", "one 1234");
1572     MsiSetProperty(hpkg, "two", "4");
1573     r = MsiEvaluateCondition(hpkg, "one >> two");
1574     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1575
1576     MsiSetProperty(hpkg, "MsiNetAssemblySupport", NULL);  /* make sure it's empty */
1577
1578     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1579     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1580
1581     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport > \"1.1.4322\"");
1582     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1583
1584     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport >= \"1.1.4322\"");
1585     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1586
1587     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <= \"1.1.4322\"");
1588     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1589
1590     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <> \"1.1.4322\"");
1591     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1592
1593     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport ~< \"1.1.4322\"");
1594     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1595
1596     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"abcd\"");
1597     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1598
1599     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a1.1.4322\"");
1600     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1601
1602     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322a\"");
1603     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1604
1605     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0000001.1.4322\"");
1606     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1607
1608     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1\"");
1609     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1610
1611     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1.1\"");
1612     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1613
1614     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1");
1615     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1616
1617     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1\"");
1618     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1619
1620     r = MsiEvaluateCondition(hpkg, "\"2\" < \"12.1\"");
1621     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1622
1623     r = MsiEvaluateCondition(hpkg, "\"02.1\" < \"2.11\"");
1624     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1625
1626     r = MsiEvaluateCondition(hpkg, "\"02.1.1\" < \"2.1\"");
1627     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1628
1629     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1630     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1631
1632     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1633     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1634
1635     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0\"");
1636     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1637
1638     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"-1\"");
1639     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1640
1641     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a\"");
1642     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1643
1644     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1645     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1646
1647     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1648     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1649
1650     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"/\"");
1651     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1652
1653     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \" \"");
1654     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1655
1656     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"azAZ_\"");
1657     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1658
1659     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]\"");
1660     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1661
1662     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]a\"");
1663     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1664
1665     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]\"");
1666     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1667
1668     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]a\"");
1669     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1670
1671     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a}\"");
1672     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1673
1674     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a\"");
1675     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1676
1677     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a\"");
1678     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1679
1680     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a{\"");
1681     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1682
1683     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a]\"");
1684     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1685
1686     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"A\"");
1687     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1688
1689     MsiSetProperty(hpkg, "MsiNetAssemblySupport", "1.1.4322");
1690     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1691     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1692
1693     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.14322\"");
1694     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1695
1696     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.5\"");
1697     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1698
1699     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1700     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1701
1702     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1703     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1704
1705     MsiSetProperty(hpkg, "one", "1");
1706     r = MsiEvaluateCondition(hpkg, "one < \"1\"");
1707     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1708
1709     MsiSetProperty(hpkg, "X", "5.0");
1710
1711     r = MsiEvaluateCondition(hpkg, "X != \"\"");
1712     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1713
1714     r = MsiEvaluateCondition(hpkg, "X =\"5.0\"");
1715     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1716
1717     r = MsiEvaluateCondition(hpkg, "X =\"5.1\"");
1718     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1719
1720     r = MsiEvaluateCondition(hpkg, "X =\"6.0\"");
1721     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1722
1723     r = MsiEvaluateCondition(hpkg, "X =\"5.0\" or X =\"5.1\" or X =\"6.0\"");
1724     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1725
1726     r = MsiEvaluateCondition(hpkg, "(X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1727     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1728
1729     r = MsiEvaluateCondition(hpkg, "X !=\"\" and (X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1730     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1731
1732     /* feature doesn't exist */
1733     r = MsiEvaluateCondition(hpkg, "&nofeature");
1734     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1735
1736     MsiSetProperty(hpkg, "A", "2");
1737     MsiSetProperty(hpkg, "X", "50");
1738
1739     r = MsiEvaluateCondition(hpkg, "2 <= X");
1740     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1741
1742     r = MsiEvaluateCondition(hpkg, "A <= X");
1743     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1744
1745     r = MsiEvaluateCondition(hpkg, "A <= 50");
1746     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1747
1748     MsiSetProperty(hpkg, "X", "50val");
1749
1750     r = MsiEvaluateCondition(hpkg, "2 <= X");
1751     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1752
1753     r = MsiEvaluateCondition(hpkg, "A <= X");
1754     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1755
1756     MsiSetProperty(hpkg, "A", "7");
1757     MsiSetProperty(hpkg, "X", "50");
1758
1759     r = MsiEvaluateCondition(hpkg, "7 <= X");
1760     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1761
1762     r = MsiEvaluateCondition(hpkg, "A <= X");
1763     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1764
1765     r = MsiEvaluateCondition(hpkg, "A <= 50");
1766     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1767
1768     MsiSetProperty(hpkg, "X", "50val");
1769
1770     r = MsiEvaluateCondition(hpkg, "2 <= X");
1771     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1772
1773     r = MsiEvaluateCondition(hpkg, "A <= X");
1774     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1775
1776     MsiCloseHandle( hpkg );
1777     DeleteFile(msifile);
1778 }
1779
1780 static BOOL check_prop_empty( MSIHANDLE hpkg, const char * prop)
1781 {
1782     UINT r;
1783     DWORD sz;
1784     char buffer[2];
1785
1786     sz = sizeof buffer;
1787     strcpy(buffer,"x");
1788     r = MsiGetProperty( hpkg, prop, buffer, &sz );
1789     return r == ERROR_SUCCESS && buffer[0] == 0 && sz == 0;
1790 }
1791
1792 static void test_props(void)
1793 {
1794     MSIHANDLE hpkg, hdb;
1795     UINT r;
1796     DWORD sz;
1797     char buffer[0x100];
1798
1799     hdb = create_package_db();
1800     r = run_query( hdb,
1801             "CREATE TABLE `Property` ( "
1802             "`Property` CHAR(255) NOT NULL, "
1803             "`Value` CHAR(255) "
1804             "PRIMARY KEY `Property`)" );
1805     ok( r == ERROR_SUCCESS , "Failed\n" );
1806
1807     r = run_query(hdb,
1808             "INSERT INTO `Property` "
1809             "(`Property`, `Value`) "
1810             "VALUES( 'MetadataCompName', 'Photoshop.dll' )");
1811     ok( r == ERROR_SUCCESS , "Failed\n" );
1812
1813     hpkg = package_from_db( hdb );
1814     ok( hpkg, "failed to create package\n");
1815
1816     /* test invalid values */
1817     r = MsiGetProperty( 0, NULL, NULL, NULL );
1818     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1819
1820     r = MsiGetProperty( hpkg, NULL, NULL, NULL );
1821     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1822
1823     r = MsiGetProperty( hpkg, "boo", NULL, NULL );
1824     ok( r == ERROR_SUCCESS, "wrong return val\n");
1825
1826     r = MsiGetProperty( hpkg, "boo", buffer, NULL );
1827     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1828
1829     /* test retrieving an empty/nonexistent property */
1830     sz = sizeof buffer;
1831     r = MsiGetProperty( hpkg, "boo", NULL, &sz );
1832     ok( r == ERROR_SUCCESS, "wrong return val\n");
1833     ok( sz == 0, "wrong size returned\n");
1834
1835     check_prop_empty( hpkg, "boo");
1836     sz = 0;
1837     strcpy(buffer,"x");
1838     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1839     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1840     ok( !strcmp(buffer,"x"), "buffer was changed\n");
1841     ok( sz == 0, "wrong size returned\n");
1842
1843     sz = 1;
1844     strcpy(buffer,"x");
1845     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1846     ok( r == ERROR_SUCCESS, "wrong return val\n");
1847     ok( buffer[0] == 0, "buffer was not changed\n");
1848     ok( sz == 0, "wrong size returned\n");
1849
1850     /* set the property to something */
1851     r = MsiSetProperty( 0, NULL, NULL );
1852     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
1853
1854     r = MsiSetProperty( hpkg, NULL, NULL );
1855     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1856
1857     r = MsiSetProperty( hpkg, "", NULL );
1858     ok( r == ERROR_SUCCESS, "wrong return val\n");
1859
1860     /* try set and get some illegal property identifiers */
1861     r = MsiSetProperty( hpkg, "", "asdf" );
1862     ok( r == ERROR_FUNCTION_FAILED, "wrong return val\n");
1863
1864     r = MsiSetProperty( hpkg, "=", "asdf" );
1865     ok( r == ERROR_SUCCESS, "wrong return val\n");
1866
1867     r = MsiSetProperty( hpkg, " ", "asdf" );
1868     ok( r == ERROR_SUCCESS, "wrong return val\n");
1869
1870     r = MsiSetProperty( hpkg, "'", "asdf" );
1871     ok( r == ERROR_SUCCESS, "wrong return val\n");
1872
1873     sz = sizeof buffer;
1874     buffer[0]=0;
1875     r = MsiGetProperty( hpkg, "'", buffer, &sz );
1876     ok( r == ERROR_SUCCESS, "wrong return val\n");
1877     ok( !strcmp(buffer,"asdf"), "buffer was not changed\n");
1878
1879     /* set empty values */
1880     r = MsiSetProperty( hpkg, "boo", NULL );
1881     ok( r == ERROR_SUCCESS, "wrong return val\n");
1882     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1883
1884     r = MsiSetProperty( hpkg, "boo", "" );
1885     ok( r == ERROR_SUCCESS, "wrong return val\n");
1886     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1887
1888     /* set a non-empty value */
1889     r = MsiSetProperty( hpkg, "boo", "xyz" );
1890     ok( r == ERROR_SUCCESS, "wrong return val\n");
1891
1892     sz = 1;
1893     strcpy(buffer,"x");
1894     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1895     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1896     ok( buffer[0] == 0, "buffer was not changed\n");
1897     ok( sz == 3, "wrong size returned\n");
1898
1899     sz = 4;
1900     strcpy(buffer,"x");
1901     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1902     ok( r == ERROR_SUCCESS, "wrong return val\n");
1903     ok( !strcmp(buffer,"xyz"), "buffer was not changed\n");
1904     ok( sz == 3, "wrong size returned\n");
1905
1906     sz = 3;
1907     strcpy(buffer,"x");
1908     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1909     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1910     ok( !strcmp(buffer,"xy"), "buffer was not changed\n");
1911     ok( sz == 3, "wrong size returned\n");
1912
1913     r = MsiSetProperty(hpkg, "SourceDir", "foo");
1914     ok( r == ERROR_SUCCESS, "wrong return val\n");
1915
1916     sz = 4;
1917     r = MsiGetProperty(hpkg, "SOURCEDIR", buffer, &sz);
1918     ok( r == ERROR_SUCCESS, "wrong return val\n");
1919     ok( !strcmp(buffer,""), "buffer wrong\n");
1920     ok( sz == 0, "wrong size returned\n");
1921
1922     sz = 4;
1923     r = MsiGetProperty(hpkg, "SOMERANDOMNAME", buffer, &sz);
1924     ok( r == ERROR_SUCCESS, "wrong return val\n");
1925     ok( !strcmp(buffer,""), "buffer wrong\n");
1926     ok( sz == 0, "wrong size returned\n");
1927
1928     sz = 4;
1929     r = MsiGetProperty(hpkg, "SourceDir", buffer, &sz);
1930     ok( r == ERROR_SUCCESS, "wrong return val\n");
1931     ok( !strcmp(buffer,"foo"), "buffer wrong\n");
1932     ok( sz == 3, "wrong size returned\n");
1933
1934     r = MsiSetProperty(hpkg, "MetadataCompName", "Photoshop.dll");
1935     ok( r == ERROR_SUCCESS, "wrong return val\n");
1936
1937     sz = 0;
1938     r = MsiGetProperty(hpkg, "MetadataCompName", NULL, &sz );
1939     ok( r == ERROR_SUCCESS, "return wrong\n");
1940     ok( sz == 13, "size wrong (%d)\n", sz);
1941
1942     sz = 13;
1943     r = MsiGetProperty(hpkg, "MetadataCompName", buffer, &sz );
1944     ok( r == ERROR_MORE_DATA, "return wrong\n");
1945     ok( !strcmp(buffer,"Photoshop.dl"), "buffer wrong\n");
1946
1947     r = MsiSetProperty(hpkg, "property", "value");
1948     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1949
1950     sz = 6;
1951     r = MsiGetProperty(hpkg, "property", buffer, &sz);
1952     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1953     ok( !strcmp(buffer, "value"), "Expected value, got %s\n", buffer);
1954
1955     r = MsiSetProperty(hpkg, "property", NULL);
1956     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1957
1958     sz = 6;
1959     r = MsiGetProperty(hpkg, "property", buffer, &sz);
1960     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1961     ok( !strlen(buffer), "Expected empty string, got %s\n", buffer);
1962
1963     MsiCloseHandle( hpkg );
1964     DeleteFile(msifile);
1965 }
1966
1967 static BOOL find_prop_in_property(MSIHANDLE hdb, LPCSTR prop, LPCSTR val)
1968 {
1969     MSIHANDLE hview, hrec;
1970     BOOL found;
1971     CHAR buffer[MAX_PATH];
1972     DWORD sz;
1973     UINT r;
1974
1975     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
1976     ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
1977     r = MsiViewExecute(hview, 0);
1978     ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
1979
1980     found = FALSE;
1981     while (r == ERROR_SUCCESS && !found)
1982     {
1983         r = MsiViewFetch(hview, &hrec);
1984         if (r != ERROR_SUCCESS) break;
1985
1986         sz = MAX_PATH;
1987         r = MsiRecordGetString(hrec, 1, buffer, &sz);
1988         if (r == ERROR_SUCCESS && !lstrcmpA(buffer, prop))
1989         {
1990             sz = MAX_PATH;
1991             r = MsiRecordGetString(hrec, 2, buffer, &sz);
1992             if (r == ERROR_SUCCESS && !lstrcmpA(buffer, val))
1993                 found = TRUE;
1994         }
1995
1996         MsiCloseHandle(hrec);
1997     }
1998
1999     MsiViewClose(hview);
2000     MsiCloseHandle(hview);
2001
2002     return found;
2003 }
2004
2005 static void test_property_table(void)
2006 {
2007     const char *query;
2008     UINT r;
2009     MSIHANDLE hpkg, hdb, hrec;
2010     char buffer[MAX_PATH], package[10];
2011     DWORD sz;
2012     BOOL found;
2013
2014     hdb = create_package_db();
2015     ok( hdb, "failed to create package\n");
2016
2017     hpkg = package_from_db(hdb);
2018     ok( hpkg, "failed to create package\n");
2019
2020     MsiCloseHandle(hdb);
2021
2022     hdb = MsiGetActiveDatabase(hpkg);
2023
2024     query = "CREATE TABLE `_Property` ( "
2025         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
2026     r = run_query(hdb, query);
2027     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
2028
2029     MsiCloseHandle(hdb);
2030     MsiCloseHandle(hpkg);
2031     DeleteFile(msifile);
2032
2033     hdb = create_package_db();
2034     ok( hdb, "failed to create package\n");
2035
2036     query = "CREATE TABLE `_Property` ( "
2037         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
2038     r = run_query(hdb, query);
2039     ok(r == ERROR_SUCCESS, "failed to create table\n");
2040
2041     query = "ALTER `_Property` ADD `foo` INTEGER";
2042     r = run_query(hdb, query);
2043     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
2044
2045     query = "ALTER TABLE `_Property` ADD `foo` INTEGER";
2046     r = run_query(hdb, query);
2047     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
2048
2049     query = "ALTER TABLE `_Property` ADD `extra` INTEGER";
2050     r = run_query(hdb, query);
2051     ok(r == ERROR_SUCCESS, "failed to add column\n");
2052
2053     sprintf(package, "#%i", hdb);
2054     r = MsiOpenPackage(package, &hpkg);
2055     todo_wine ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n");
2056     if (r == ERROR_SUCCESS)
2057         MsiCloseHandle(hpkg);
2058
2059     r = MsiCloseHandle(hdb);
2060     ok(r == ERROR_SUCCESS, "MsiCloseHandle failed %u\n", r);
2061
2062     hdb = create_package_db();
2063     ok (hdb, "failed to create package database\n");
2064
2065     r = create_property_table(hdb);
2066     ok(r == ERROR_SUCCESS, "cannot create Property table: %d\n", r);
2067
2068     r = add_property_entry(hdb, "'prop', 'val'");
2069     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2070
2071     hpkg = package_from_db(hdb);
2072     ok(hpkg, "failed to create package\n");
2073
2074     MsiCloseHandle(hdb);
2075
2076     sz = MAX_PATH;
2077     r = MsiGetProperty(hpkg, "prop", buffer, &sz);
2078     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2079     ok(!lstrcmp(buffer, "val"), "Expected val, got %s\n", buffer);
2080
2081     hdb = MsiGetActiveDatabase(hpkg);
2082
2083     found = find_prop_in_property(hdb, "prop", "val");
2084     ok(found, "prop should be in the _Property table\n");
2085
2086     r = add_property_entry(hdb, "'dantes', 'mercedes'");
2087     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2088
2089     query = "SELECT * FROM `_Property` WHERE `Property` = 'dantes'";
2090     r = do_query(hdb, query, &hrec);
2091     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
2092
2093     found = find_prop_in_property(hdb, "dantes", "mercedes");
2094     ok(found == FALSE, "dantes should not be in the _Property table\n");
2095
2096     sz = MAX_PATH;
2097     lstrcpy(buffer, "aaa");
2098     r = MsiGetProperty(hpkg, "dantes", buffer, &sz);
2099     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2100     ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer);
2101
2102     r = MsiSetProperty(hpkg, "dantes", "mercedes");
2103     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2104
2105     found = find_prop_in_property(hdb, "dantes", "mercedes");
2106     ok(found == TRUE, "dantes should be in the _Property table\n");
2107
2108     MsiCloseHandle(hdb);
2109     MsiCloseHandle(hpkg);
2110     DeleteFile(msifile);
2111 }
2112
2113 static UINT try_query_param( MSIHANDLE hdb, LPCSTR szQuery, MSIHANDLE hrec )
2114 {
2115     MSIHANDLE htab = 0;
2116     UINT res;
2117
2118     res = MsiDatabaseOpenView( hdb, szQuery, &htab );
2119     if( res == ERROR_SUCCESS )
2120     {
2121         UINT r;
2122
2123         r = MsiViewExecute( htab, hrec );
2124         if( r != ERROR_SUCCESS )
2125         {
2126             res = r;
2127             fprintf(stderr,"MsiViewExecute failed %08x\n", res);
2128         }
2129
2130         r = MsiViewClose( htab );
2131         if( r != ERROR_SUCCESS )
2132             res = r;
2133
2134         r = MsiCloseHandle( htab );
2135         if( r != ERROR_SUCCESS )
2136             res = r;
2137     }
2138     return res;
2139 }
2140
2141 static UINT try_query( MSIHANDLE hdb, LPCSTR szQuery )
2142 {
2143     return try_query_param( hdb, szQuery, 0 );
2144 }
2145
2146 static void set_summary_str(MSIHANDLE hdb, DWORD pid, LPCSTR value)
2147 {
2148     MSIHANDLE summary;
2149     UINT r;
2150
2151     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2152     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2153
2154     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_LPSTR, 0, NULL, value);
2155     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2156
2157     r = MsiSummaryInfoPersist(summary);
2158     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2159
2160     MsiCloseHandle(summary);
2161 }
2162
2163 static void set_summary_dword(MSIHANDLE hdb, DWORD pid, DWORD value)
2164 {
2165     MSIHANDLE summary;
2166     UINT r;
2167
2168     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2169     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2170
2171     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_I4, value, NULL, NULL);
2172     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2173
2174     r = MsiSummaryInfoPersist(summary);
2175     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2176
2177     MsiCloseHandle(summary);
2178 }
2179
2180 static void test_msipackage(void)
2181 {
2182     MSIHANDLE hdb = 0, hpack = 100;
2183     UINT r;
2184     const char *query;
2185     char name[10];
2186
2187     /* NULL szPackagePath */
2188     r = MsiOpenPackage(NULL, &hpack);
2189     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2190
2191     /* empty szPackagePath */
2192     r = MsiOpenPackage("", &hpack);
2193     todo_wine
2194     {
2195         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2196     }
2197
2198     if (r == ERROR_SUCCESS)
2199         MsiCloseHandle(hpack);
2200
2201     /* nonexistent szPackagePath */
2202     r = MsiOpenPackage("nonexistent", &hpack);
2203     ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r);
2204
2205     /* NULL hProduct */
2206     r = MsiOpenPackage(msifile, NULL);
2207     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2208
2209     name[0]='#';
2210     name[1]=0;
2211     r = MsiOpenPackage(name, &hpack);
2212     ok(r == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", r);
2213
2214     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2215     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2216
2217     /* database exists, but is emtpy */
2218     sprintf(name, "#%d", hdb);
2219     r = MsiOpenPackage(name, &hpack);
2220     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2221        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2222
2223     query = "CREATE TABLE `Property` ( "
2224             "`Property` CHAR(72), `Value` CHAR(0) "
2225             "PRIMARY KEY `Property`)";
2226     r = try_query(hdb, query);
2227     ok(r == ERROR_SUCCESS, "failed to create Properties table\n");
2228
2229     query = "CREATE TABLE `InstallExecuteSequence` ("
2230             "`Action` CHAR(72), `Condition` CHAR(0), `Sequence` INTEGER "
2231             "PRIMARY KEY `Action`)";
2232     r = try_query(hdb, query);
2233     ok(r == ERROR_SUCCESS, "failed to create InstallExecuteSequence table\n");
2234
2235     /* a few key tables exist */
2236     sprintf(name, "#%d", hdb);
2237     r = MsiOpenPackage(name, &hpack);
2238     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2239        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2240
2241     MsiCloseHandle(hdb);
2242     DeleteFile(msifile);
2243
2244     /* start with a clean database to show what constitutes a valid package */
2245     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2246     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2247
2248     sprintf(name, "#%d", hdb);
2249
2250     /* The following summary information props must exist:
2251      *  - PID_REVNUMBER
2252      *  - PID_PAGECOUNT
2253      */
2254
2255     set_summary_dword(hdb, PID_PAGECOUNT, 100);
2256     r = MsiOpenPackage(name, &hpack);
2257     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2258        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2259
2260     set_summary_str(hdb, PID_REVNUMBER, "{004757CD-5092-49c2-AD20-28E1CE0DF5F2}");
2261     r = MsiOpenPackage(name, &hpack);
2262     ok(r == ERROR_SUCCESS,
2263        "Expected ERROR_SUCCESS, got %d\n", r);
2264
2265     MsiCloseHandle(hpack);
2266     MsiCloseHandle(hdb);
2267     DeleteFile(msifile);
2268 }
2269
2270 static void test_formatrecord2(void)
2271 {
2272     MSIHANDLE hpkg, hrec ;
2273     char buffer[0x100];
2274     DWORD sz;
2275     UINT r;
2276
2277     hpkg = package_from_db(create_package_db());
2278     ok( hpkg, "failed to create package\n");
2279
2280     r = MsiSetProperty(hpkg, "Manufacturer", " " );
2281     ok( r == ERROR_SUCCESS, "set property failed\n");
2282
2283     hrec = MsiCreateRecord(2);
2284     ok(hrec, "create record failed\n");
2285
2286     r = MsiRecordSetString( hrec, 0, "[ProgramFilesFolder][Manufacturer]\\asdf");
2287     ok( r == ERROR_SUCCESS, "format record failed\n");
2288
2289     buffer[0] = 0;
2290     sz = sizeof buffer;
2291     r = MsiFormatRecord( hpkg, hrec, buffer, &sz );
2292
2293     r = MsiRecordSetString(hrec, 0, "[foo][1]");
2294     r = MsiRecordSetString(hrec, 1, "hoo");
2295     sz = sizeof buffer;
2296     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2297     ok( sz == 3, "size wrong\n");
2298     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2299     ok( r == ERROR_SUCCESS, "format failed\n");
2300
2301     r = MsiRecordSetString(hrec, 0, "x[~]x");
2302     sz = sizeof buffer;
2303     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2304     ok( sz == 3, "size wrong\n");
2305     ok( 0 == strcmp(buffer,"x"), "wrong output %s\n",buffer);
2306     ok( r == ERROR_SUCCESS, "format failed\n");
2307
2308     r = MsiRecordSetString(hrec, 0, "[foo.$%}][1]");
2309     r = MsiRecordSetString(hrec, 1, "hoo");
2310     sz = sizeof buffer;
2311     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2312     ok( sz == 3, "size wrong\n");
2313     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2314     ok( r == ERROR_SUCCESS, "format failed\n");
2315
2316     r = MsiRecordSetString(hrec, 0, "[\\[]");
2317     sz = sizeof buffer;
2318     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2319     ok( sz == 1, "size wrong\n");
2320     ok( 0 == strcmp(buffer,"["), "wrong output %s\n",buffer);
2321     ok( r == ERROR_SUCCESS, "format failed\n");
2322
2323     SetEnvironmentVariable("FOO", "BAR");
2324     r = MsiRecordSetString(hrec, 0, "[%FOO]");
2325     sz = sizeof buffer;
2326     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2327     ok( sz == 3, "size wrong\n");
2328     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2329     ok( r == ERROR_SUCCESS, "format failed\n");
2330
2331     r = MsiRecordSetString(hrec, 0, "[[1]]");
2332     r = MsiRecordSetString(hrec, 1, "%FOO");
2333     sz = sizeof buffer;
2334     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2335     ok( sz == 3, "size wrong\n");
2336     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2337     ok( r == ERROR_SUCCESS, "format failed\n");
2338
2339     MsiCloseHandle( hrec );
2340     MsiCloseHandle( hpkg );
2341     DeleteFile(msifile);
2342 }
2343
2344 static void test_states(void)
2345 {
2346     MSIHANDLE hpkg;
2347     UINT r;
2348     MSIHANDLE hdb;
2349     INSTALLSTATE state, action;
2350
2351     static const CHAR msifile2[] = "winetest2-package.msi";
2352     static const CHAR msifile3[] = "winetest3-package.msi";
2353     static const CHAR msifile4[] = "winetest4-package.msi";
2354
2355     hdb = create_package_db();
2356     ok ( hdb, "failed to create package database\n" );
2357
2358     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
2359     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
2360
2361     r = create_property_table( hdb );
2362     ok( r == ERROR_SUCCESS, "cannot create Property table: %d\n", r );
2363
2364     r = add_property_entry( hdb, "'ProductCode', '{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}'" );
2365     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2366
2367     r = add_property_entry( hdb, "'ProductLanguage', '1033'" );
2368     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2369
2370     r = add_property_entry( hdb, "'ProductName', 'MSITEST'" );
2371     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2372
2373     r = add_property_entry( hdb, "'ProductVersion', '1.1.1'" );
2374     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2375
2376     r = create_install_execute_sequence_table( hdb );
2377     ok( r == ERROR_SUCCESS, "cannot create InstallExecuteSequence table: %d\n", r );
2378
2379     r = add_install_execute_sequence_entry( hdb, "'CostInitialize', '', '800'" );
2380     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2381
2382     r = add_install_execute_sequence_entry( hdb, "'FileCost', '', '900'" );
2383     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2384
2385     r = add_install_execute_sequence_entry( hdb, "'CostFinalize', '', '1000'" );
2386     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2387
2388     r = add_install_execute_sequence_entry( hdb, "'InstallValidate', '', '1400'" );
2389     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2390
2391     r = add_install_execute_sequence_entry( hdb, "'InstallInitialize', '', '1500'" );
2392     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2393
2394     r = add_install_execute_sequence_entry( hdb, "'ProcessComponents', '', '1600'" );
2395     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2396
2397     r = add_install_execute_sequence_entry( hdb, "'UnpublishFeatures', '', '1800'" );
2398     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2399
2400     r = add_install_execute_sequence_entry( hdb, "'RegisterProduct', '', '6100'" );
2401     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2402
2403     r = add_install_execute_sequence_entry( hdb, "'PublishFeatures', '', '6300'" );
2404     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2405
2406     r = add_install_execute_sequence_entry( hdb, "'PublishProduct', '', '6400'" );
2407     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2408
2409     r = add_install_execute_sequence_entry( hdb, "'InstallFinalize', '', '6600'" );
2410     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2411
2412     r = create_media_table( hdb );
2413     ok( r == ERROR_SUCCESS, "cannot create media table: %d\n", r );
2414
2415     r = add_media_entry( hdb, "'1', '3', '', '', 'DISK1', ''");
2416     ok( r == ERROR_SUCCESS, "cannot add media entry: %d\n", r );
2417
2418     r = create_feature_table( hdb );
2419     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
2420
2421     r = create_component_table( hdb );
2422     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
2423
2424     /* msidbFeatureAttributesFavorLocal */
2425     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
2426     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2427
2428     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
2429     r = add_component_entry( hdb, "'alpha', '{467EC132-739D-4784-A37B-677AA43DBC94}', 'TARGETDIR', 0, '', 'alpha_file'" );
2430     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2431
2432     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
2433     r = add_component_entry( hdb, "'beta', '{2C1F189C-24A6-4C34-B26B-994A6C026506}', 'TARGETDIR', 1, '', 'beta_file'" );
2434     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2435
2436     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
2437     r = add_component_entry( hdb, "'gamma', '{C271E2A4-DE2E-4F70-86D1-6984AF7DE2CA}', 'TARGETDIR', 2, '', 'gamma_file'" );
2438     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2439
2440     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSharedDllRefCount */
2441     r = add_component_entry( hdb, "'theta', '{4EB3129D-81A8-48D5-9801-75600FED3DD9}', 'TARGETDIR', 8, '', 'theta_file'" );
2442     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2443
2444     /* msidbFeatureAttributesFavorSource */
2445     r = add_feature_entry( hdb, "'two', '', '', '', 2, 1, '', 1" );
2446     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2447
2448     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
2449     r = add_component_entry( hdb, "'delta', '{938FD4F2-C648-4259-A03C-7AA3B45643F3}', 'TARGETDIR', 0, '', 'delta_file'" );
2450     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2451
2452     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2453     r = add_component_entry( hdb, "'epsilon', '{D59713B6-C11D-47F2-A395-1E5321781190}', 'TARGETDIR', 1, '', 'epsilon_file'" );
2454     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2455
2456     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
2457     r = add_component_entry( hdb, "'zeta', '{377D33AB-2FAA-42B9-A629-0C0DAE9B9C7A}', 'TARGETDIR', 2, '', 'zeta_file'" );
2458     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2459
2460     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSharedDllRefCount */
2461     r = add_component_entry( hdb, "'iota', '{5D36F871-B5ED-4801-9E0F-C46B9E5C9669}', 'TARGETDIR', 8, '', 'iota_file'" );
2462     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2463
2464     /* msidbFeatureAttributesFavorSource */
2465     r = add_feature_entry( hdb, "'three', '', '', '', 2, 1, '', 1" );
2466     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2467
2468     /* msidbFeatureAttributesFavorLocal */
2469     r = add_feature_entry( hdb, "'four', '', '', '', 2, 1, '', 0" );
2470     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2471
2472     /* disabled */
2473     r = add_feature_entry( hdb, "'five', '', '', '', 2, 0, '', 1" );
2474     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2475
2476     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2477     r = add_component_entry( hdb, "'eta', '{DD89003F-0DD4-41B8-81C0-3411A7DA2695}', 'TARGETDIR', 1, '', 'eta_file'" );
2478     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2479
2480     /* no feature parent:msidbComponentAttributesLocalOnly */
2481     r = add_component_entry( hdb, "'kappa', '{D6B93DC3-8DA5-4769-9888-42BFE156BB8B}', 'TARGETDIR', 1, '', 'kappa_file'" );
2482     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2483
2484     /* msidbFeatureAttributesFavorLocal:removed */
2485     r = add_feature_entry( hdb, "'six', '', '', '', 2, 1, '', 0" );
2486     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2487
2488     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesLocalOnly */
2489     r = add_component_entry( hdb, "'lambda', '{6528C5E4-02A4-4636-A214-7A66A6C35B64}', 'TARGETDIR', 0, '', 'lambda_file'" );
2490     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2491
2492     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSourceOnly */
2493     r = add_component_entry( hdb, "'mu', '{97014BAB-6C56-4013-9A63-2BF913B42519}', 'TARGETDIR', 1, '', 'mu_file'" );
2494     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2495
2496     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesOptional */
2497     r = add_component_entry( hdb, "'nu', '{943DD0D8-5808-4954-8526-3B8493FEDDCD}', 'TARGETDIR', 2, '', 'nu_file'" );
2498     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2499
2500     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSharedDllRefCount */
2501     r = add_component_entry( hdb, "'xi', '{D6CF9EF7-6FCF-4930-B34B-F938AEFF9BDB}', 'TARGETDIR', 8, '', 'xi_file'" );
2502     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2503
2504     /* msidbFeatureAttributesFavorSource:removed */
2505     r = add_feature_entry( hdb, "'seven', '', '', '', 2, 1, '', 1" );
2506     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2507
2508     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesLocalOnly */
2509     r = add_component_entry( hdb, "'omicron', '{7B57521D-15DB-4141-9AA6-01D934A4433F}', 'TARGETDIR', 0, '', 'omicron_file'" );
2510     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2511
2512     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSourceOnly */
2513     r = add_component_entry( hdb, "'pi', '{FB85346B-378E-4492-8769-792305471C81}', 'TARGETDIR', 1, '', 'pi_file'" );
2514     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2515
2516     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesOptional */
2517     r = add_component_entry( hdb, "'rho', '{798F2047-7B0C-4783-8BB0-D703E554114B}', 'TARGETDIR', 2, '', 'rho_file'" );
2518     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2519
2520     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSharedDllRefCount */
2521     r = add_component_entry( hdb, "'sigma', '{5CE9DDA8-B67B-4736-9D93-99D61C5B93E7}', 'TARGETDIR', 8, '', 'sigma_file'" );
2522     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2523
2524     /* msidbFeatureAttributesFavorLocal */
2525     r = add_feature_entry( hdb, "'eight', '', '', '', 2, 1, '', 0" );
2526     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2527
2528     r = add_component_entry( hdb, "'tau', '{07DEB510-677C-4A6F-A0A6-7CD8EFEA77ED}', 'TARGETDIR', 1, '', 'tau_file'" );
2529     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2530
2531     /* msidbFeatureAttributesFavorSource */
2532     r = add_feature_entry( hdb, "'nine', '', '', '', 2, 1, '', 1" );
2533     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2534
2535     r = add_component_entry( hdb, "'phi', '{9F0594C5-35AD-43EA-94DD-8DF73FAA664D}', 'TARGETDIR', 1, '', 'phi_file'" );
2536     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2537
2538     /* msidbFeatureAttributesFavorAdvertise */
2539     r = add_feature_entry( hdb, "'ten', '', '', '', 2, 1, '', 4" );
2540     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2541
2542     r = add_component_entry( hdb, "'chi', '{E6B539AB-5DA9-4236-A2D2-E341A50B4C38}', 'TARGETDIR', 1, '', 'chi_file'" );
2543     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2544
2545     r = create_feature_components_table( hdb );
2546     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
2547
2548     r = add_feature_components_entry( hdb, "'one', 'alpha'" );
2549     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2550
2551     r = add_feature_components_entry( hdb, "'one', 'beta'" );
2552     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2553
2554     r = add_feature_components_entry( hdb, "'one', 'gamma'" );
2555     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2556
2557     r = add_feature_components_entry( hdb, "'one', 'theta'" );
2558     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2559
2560     r = add_feature_components_entry( hdb, "'two', 'delta'" );
2561     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2562
2563     r = add_feature_components_entry( hdb, "'two', 'epsilon'" );
2564     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2565
2566     r = add_feature_components_entry( hdb, "'two', 'zeta'" );
2567     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2568
2569     r = add_feature_components_entry( hdb, "'two', 'iota'" );
2570     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2571
2572     r = add_feature_components_entry( hdb, "'three', 'eta'" );
2573     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2574
2575     r = add_feature_components_entry( hdb, "'four', 'eta'" );
2576     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2577
2578     r = add_feature_components_entry( hdb, "'five', 'eta'" );
2579     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2580
2581     r = add_feature_components_entry( hdb, "'six', 'lambda'" );
2582     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2583
2584     r = add_feature_components_entry( hdb, "'six', 'mu'" );
2585     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2586
2587     r = add_feature_components_entry( hdb, "'six', 'nu'" );
2588     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2589
2590     r = add_feature_components_entry( hdb, "'six', 'xi'" );
2591     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2592
2593     r = add_feature_components_entry( hdb, "'seven', 'omicron'" );
2594     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2595
2596     r = add_feature_components_entry( hdb, "'seven', 'pi'" );
2597     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2598
2599     r = add_feature_components_entry( hdb, "'seven', 'rho'" );
2600     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2601
2602     r = add_feature_components_entry( hdb, "'seven', 'sigma'" );
2603     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2604
2605     r = add_feature_components_entry( hdb, "'eight', 'tau'" );
2606     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2607
2608     r = add_feature_components_entry( hdb, "'nine', 'phi'" );
2609     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2610
2611     r = add_feature_components_entry( hdb, "'ten', 'chi'" );
2612     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2613
2614     r = create_file_table( hdb );
2615     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
2616
2617     r = add_file_entry( hdb, "'alpha_file', 'alpha', 'alpha.txt', 100, '', '1033', 8192, 1" );
2618     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2619
2620     r = add_file_entry( hdb, "'beta_file', 'beta', 'beta.txt', 0, '', '1033', 8192, 1" );
2621     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2622
2623     r = add_file_entry( hdb, "'gamma_file', 'gamma', 'gamma.txt', 0, '', '1033', 8192, 1" );
2624     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2625
2626     r = add_file_entry( hdb, "'theta_file', 'theta', 'theta.txt', 0, '', '1033', 8192, 1" );
2627     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2628
2629     r = add_file_entry( hdb, "'delta_file', 'delta', 'delta.txt', 0, '', '1033', 8192, 1" );
2630     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2631
2632     r = add_file_entry( hdb, "'epsilon_file', 'epsilon', 'epsilon.txt', 0, '', '1033', 8192, 1" );
2633     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2634
2635     r = add_file_entry( hdb, "'zeta_file', 'zeta', 'zeta.txt', 0, '', '1033', 8192, 1" );
2636     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2637
2638     r = add_file_entry( hdb, "'iota_file', 'iota', 'iota.txt', 0, '', '1033', 8192, 1" );
2639     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2640
2641     /* compressed file */
2642     r = add_file_entry( hdb, "'eta_file', 'eta', 'eta.txt', 0, '', '1033', 16384, 1" );
2643     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2644
2645     r = add_file_entry( hdb, "'kappa_file', 'kappa', 'kappa.txt', 0, '', '1033', 8192, 1" );
2646     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2647
2648     r = add_file_entry( hdb, "'lambda_file', 'lambda', 'lambda.txt', 100, '', '1033', 8192, 1" );
2649     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2650
2651     r = add_file_entry( hdb, "'mu_file', 'mu', 'mu.txt', 100, '', '1033', 8192, 1" );
2652     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2653
2654     r = add_file_entry( hdb, "'nu_file', 'nu', 'nu.txt', 100, '', '1033', 8192, 1" );
2655     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2656
2657     r = add_file_entry( hdb, "'xi_file', 'xi', 'xi.txt', 100, '', '1033', 8192, 1" );
2658     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2659
2660     r = add_file_entry( hdb, "'omicron_file', 'omicron', 'omicron.txt', 100, '', '1033', 8192, 1" );
2661     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2662
2663     r = add_file_entry( hdb, "'pi_file', 'pi', 'pi.txt', 100, '', '1033', 8192, 1" );
2664     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2665
2666     r = add_file_entry( hdb, "'rho_file', 'rho', 'rho.txt', 100, '', '1033', 8192, 1" );
2667     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2668
2669     r = add_file_entry( hdb, "'sigma_file', 'sigma', 'sigma.txt', 100, '', '1033', 8192, 1" );
2670     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2671
2672     r = add_file_entry( hdb, "'tau_file', 'tau', 'tau.txt', 100, '', '1033', 8192, 1" );
2673     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2674
2675     r = add_file_entry( hdb, "'phi_file', 'phi', 'phi.txt', 100, '', '1033', 8192, 1" );
2676     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2677
2678     r = add_file_entry( hdb, "'chi_file', 'chi', 'chi.txt', 100, '', '1033', 8192, 1" );
2679     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2680
2681     MsiDatabaseCommit(hdb);
2682
2683     /* these properties must not be in the saved msi file */
2684     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
2685     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2686
2687     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
2688     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2689
2690     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
2691     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2692
2693     r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'");
2694     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2695
2696     r = add_property_entry( hdb, "'REINSTALLMODE', 'omus'");
2697     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2698
2699     hpkg = package_from_db( hdb );
2700     ok( hpkg, "failed to create package\n");
2701
2702     MsiCloseHandle(hdb);
2703
2704     CopyFileA(msifile, msifile2, FALSE);
2705     CopyFileA(msifile, msifile3, FALSE);
2706     CopyFileA(msifile, msifile4, FALSE);
2707
2708     state = 0xdeadbee;
2709     action = 0xdeadbee;
2710     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2711     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2712     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2713     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2714
2715     state = 0xdeadbee;
2716     action = 0xdeadbee;
2717     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2718     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2719     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2720     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2721
2722     state = 0xdeadbee;
2723     action = 0xdeadbee;
2724     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2725     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2726     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2727     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2728
2729     state = 0xdeadbee;
2730     action = 0xdeadbee;
2731     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2732     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2733     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2734     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2735
2736     state = 0xdeadbee;
2737     action = 0xdeadbee;
2738     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2739     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2740     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2741     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2742
2743     state = 0xdeadbee;
2744     action = 0xdeadbee;
2745     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2746     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2747     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2748     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2749
2750     state = 0xdeadbee;
2751     action = 0xdeadbee;
2752     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2753     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2754     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2755     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2756
2757     state = 0xdeadbee;
2758     action = 0xdeadbee;
2759     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
2760     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2761     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2762     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2763
2764     state = 0xdeadbee;
2765     action = 0xdeadbee;
2766     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
2767     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2768     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2769     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2770
2771     state = 0xdeadbee;
2772     action = 0xdeadbee;
2773     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
2774     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2775     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2776     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2777
2778     state = 0xdeadbee;
2779     action = 0xdeadbee;
2780     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
2781     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2782     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2783     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2784
2785     state = 0xdeadbee;
2786     action = 0xdeadbee;
2787     r = MsiGetComponentState(hpkg, "beta", &state, &action);
2788     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2789     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2790     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2791
2792     state = 0xdeadbee;
2793     action = 0xdeadbee;
2794     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
2795     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2796     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2797     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2798
2799     state = 0xdeadbee;
2800     action = 0xdeadbee;
2801     r = MsiGetComponentState(hpkg, "theta", &state, &action);
2802     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2803     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2804     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2805
2806     state = 0xdeadbee;
2807     action = 0xdeadbee;
2808     r = MsiGetComponentState(hpkg, "delta", &state, &action);
2809     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2810     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2811     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2812
2813     state = 0xdeadbee;
2814     action = 0xdeadbee;
2815     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
2816     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2817     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2818     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2819
2820     state = 0xdeadbee;
2821     action = 0xdeadbee;
2822     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
2823     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2824     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2825     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2826
2827     state = 0xdeadbee;
2828     action = 0xdeadbee;
2829     r = MsiGetComponentState(hpkg, "iota", &state, &action);
2830     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2831     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2832     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2833
2834     state = 0xdeadbee;
2835     action = 0xdeadbee;
2836     r = MsiGetComponentState(hpkg, "eta", &state, &action);
2837     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2838     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2839     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2840
2841     state = 0xdeadbee;
2842     action = 0xdeadbee;
2843     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
2844     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2845     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2846     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2847
2848     state = 0xdeadbee;
2849     action = 0xdeadbee;
2850     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
2851     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2852     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2853     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2854
2855     state = 0xdeadbee;
2856     action = 0xdeadbee;
2857     r = MsiGetComponentState(hpkg, "mu", &state, &action);
2858     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2859     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2860     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2861
2862     state = 0xdeadbee;
2863     action = 0xdeadbee;
2864     r = MsiGetComponentState(hpkg, "nu", &state, &action);
2865     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2866     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2867     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2868
2869     state = 0xdeadbee;
2870     action = 0xdeadbee;
2871     r = MsiGetComponentState(hpkg, "xi", &state, &action);
2872     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2873     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2874     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2875
2876     state = 0xdeadbee;
2877     action = 0xdeadbee;
2878     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
2879     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2880     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2881     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2882
2883     state = 0xdeadbee;
2884     action = 0xdeadbee;
2885     r = MsiGetComponentState(hpkg, "pi", &state, &action);
2886     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2887     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2888     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2889
2890     state = 0xdeadbee;
2891     action = 0xdeadbee;
2892     r = MsiGetComponentState(hpkg, "rho", &state, &action);
2893     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2894     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2895     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2896
2897     state = 0xdeadbee;
2898     action = 0xdeadbee;
2899     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
2900     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2901     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2902     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2903
2904     state = 0xdeadbee;
2905     action = 0xdeadbee;
2906     r = MsiGetComponentState(hpkg, "tau", &state, &action);
2907     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2908     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2909     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2910
2911     state = 0xdeadbee;
2912     action = 0xdeadbee;
2913     r = MsiGetComponentState(hpkg, "phi", &state, &action);
2914     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2915     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2916     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2917
2918     state = 0xdeadbee;
2919     action = 0xdeadbee;
2920     r = MsiGetComponentState(hpkg, "chi", &state, &action);
2921     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2922     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2923     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2924
2925     r = MsiDoAction( hpkg, "CostInitialize");
2926     ok( r == ERROR_SUCCESS, "cost init failed\n");
2927
2928     state = 0xdeadbee;
2929     action = 0xdeadbee;
2930     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2931     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2932     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2933     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2934
2935     state = 0xdeadbee;
2936     action = 0xdeadbee;
2937     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2938     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2939     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2940     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2941
2942     state = 0xdeadbee;
2943     action = 0xdeadbee;
2944     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2945     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2946     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2947     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2948
2949     state = 0xdeadbee;
2950     action = 0xdeadbee;
2951     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2952     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2953     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2954     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2955
2956     state = 0xdeadbee;
2957     action = 0xdeadbee;
2958     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2959     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2960     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2961     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2962
2963     state = 0xdeadbee;
2964     action = 0xdeadbee;
2965     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2966     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2967     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2968     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2969
2970     state = 0xdeadbee;
2971     action = 0xdeadbee;
2972     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2973     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2974     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2975     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2976
2977     state = 0xdeadbee;
2978     action = 0xdeadbee;
2979     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
2980     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2981     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2982     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2983
2984     state = 0xdeadbee;
2985     action = 0xdeadbee;
2986     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
2987     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2988     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2989     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2990
2991     state = 0xdeadbee;
2992     action = 0xdeadbee;
2993     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
2994     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2995     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2996     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2997
2998     state = 0xdeadbee;
2999     action = 0xdeadbee;
3000     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3001     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3002     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3003     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3004
3005     state = 0xdeadbee;
3006     action = 0xdeadbee;
3007     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3008     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3009     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3010     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3011
3012     state = 0xdeadbee;
3013     action = 0xdeadbee;
3014     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3015     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3016     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3017     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3018
3019     state = 0xdeadbee;
3020     action = 0xdeadbee;
3021     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3022     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3023     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3024     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3025
3026     state = 0xdeadbee;
3027     action = 0xdeadbee;
3028     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3029     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3030     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3031     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3032
3033     state = 0xdeadbee;
3034     action = 0xdeadbee;
3035     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3036     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3037     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3038     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3039
3040     state = 0xdeadbee;
3041     action = 0xdeadbee;
3042     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3043     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3044     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3045     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3046
3047     state = 0xdeadbee;
3048     action = 0xdeadbee;
3049     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3050     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3051     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3052     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3053
3054     state = 0xdeadbee;
3055     action = 0xdeadbee;
3056     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3057     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3058     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3059     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3060
3061     state = 0xdeadbee;
3062     action = 0xdeadbee;
3063     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3064     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3065     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3066     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3067
3068     state = 0xdeadbee;
3069     action = 0xdeadbee;
3070     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3071     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3072     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3073     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3074
3075     state = 0xdeadbee;
3076     action = 0xdeadbee;
3077     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3078     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3079     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3080     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3081
3082     state = 0xdeadbee;
3083     action = 0xdeadbee;
3084     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3085     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3086     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3087     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3088
3089     state = 0xdeadbee;
3090     action = 0xdeadbee;
3091     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3092     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3093     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3094     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3095
3096     state = 0xdeadbee;
3097     action = 0xdeadbee;
3098     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3099     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3100     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3101     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3102
3103     state = 0xdeadbee;
3104     action = 0xdeadbee;
3105     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3106     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3107     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3108     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3109
3110     state = 0xdeadbee;
3111     action = 0xdeadbee;
3112     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3113     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3114     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3115     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3116
3117     state = 0xdeadbee;
3118     action = 0xdeadbee;
3119     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3120     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3121     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3122     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3123
3124     state = 0xdeadbee;
3125     action = 0xdeadbee;
3126     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3127     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3128     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3129     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3130
3131     state = 0xdeadbee;
3132     action = 0xdeadbee;
3133     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3134     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3135     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3136     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3137
3138     state = 0xdeadbee;
3139     action = 0xdeadbee;
3140     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3141     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3142     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3143     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3144
3145     r = MsiDoAction( hpkg, "FileCost");
3146     ok( r == ERROR_SUCCESS, "file cost failed\n");
3147
3148     state = 0xdeadbee;
3149     action = 0xdeadbee;
3150     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3151     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3152     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3153     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3154
3155     state = 0xdeadbee;
3156     action = 0xdeadbee;
3157     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3158     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3159     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3160     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3161
3162     state = 0xdeadbee;
3163     action = 0xdeadbee;
3164     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3165     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3166     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3167     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3168
3169     state = 0xdeadbee;
3170     action = 0xdeadbee;
3171     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3172     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3173     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3174     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3175
3176     state = 0xdeadbee;
3177     action = 0xdeadbee;
3178     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3179     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3180     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3181     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3182
3183     state = 0xdeadbee;
3184     action = 0xdeadbee;
3185     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3186     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3187     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3188     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3189
3190     state = 0xdeadbee;
3191     action = 0xdeadbee;
3192     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3193     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3194     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3195     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3196
3197     state = 0xdeadbee;
3198     action = 0xdeadbee;
3199     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3200     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3201     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3202     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3203
3204     state = 0xdeadbee;
3205     action = 0xdeadbee;
3206     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3207     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3208     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3209     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3210
3211     state = 0xdeadbee;
3212     action = 0xdeadbee;
3213     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3214     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3215     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3216     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3217
3218     state = 0xdeadbee;
3219     action = 0xdeadbee;
3220     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3221     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3222     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3223     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3224
3225     state = 0xdeadbee;
3226     action = 0xdeadbee;
3227     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3228     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3229     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3230     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3231
3232     state = 0xdeadbee;
3233     action = 0xdeadbee;
3234     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3235     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3236     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3237     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3238
3239     state = 0xdeadbee;
3240     action = 0xdeadbee;
3241     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3242     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3243     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3244     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3245
3246     state = 0xdeadbee;
3247     action = 0xdeadbee;
3248     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3249     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3250     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3251     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3252
3253     state = 0xdeadbee;
3254     action = 0xdeadbee;
3255     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3256     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3257     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3258     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3259
3260     state = 0xdeadbee;
3261     action = 0xdeadbee;
3262     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3263     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3264     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3265     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3266
3267     state = 0xdeadbee;
3268     action = 0xdeadbee;
3269     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3270     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3271     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3272     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3273
3274     state = 0xdeadbee;
3275     action = 0xdeadbee;
3276     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3277     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3278     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3279     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3280
3281     state = 0xdeadbee;
3282     action = 0xdeadbee;
3283     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3284     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3285     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3286     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3287
3288     state = 0xdeadbee;
3289     action = 0xdeadbee;
3290     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3291     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3292     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3293     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3294
3295     state = 0xdeadbee;
3296     action = 0xdeadbee;
3297     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3298     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3299     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3300     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3301
3302     state = 0xdeadbee;
3303     action = 0xdeadbee;
3304     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3305     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3306     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3307     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3308
3309     state = 0xdeadbee;
3310     action = 0xdeadbee;
3311     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3312     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3313     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3314     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3315
3316     state = 0xdeadbee;
3317     action = 0xdeadbee;
3318     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3319     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3320     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3321     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3322
3323     state = 0xdeadbee;
3324     action = 0xdeadbee;
3325     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3326     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3327     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3328     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3329
3330     state = 0xdeadbee;
3331     action = 0xdeadbee;
3332     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3333     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3334     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3335     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3336
3337     state = 0xdeadbee;
3338     action = 0xdeadbee;
3339     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3340     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3341     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3342     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3343
3344     state = 0xdeadbee;
3345     action = 0xdeadbee;
3346     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3347     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3348     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3349     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3350
3351     state = 0xdeadbee;
3352     action = 0xdeadbee;
3353     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3354     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3355     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3356     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3357
3358     state = 0xdeadbee;
3359     action = 0xdeadbee;
3360     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3361     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3362     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3363     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3364
3365     r = MsiDoAction( hpkg, "CostFinalize");
3366     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
3367
3368     state = 0xdeadbee;
3369     action = 0xdeadbee;
3370     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3371     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3372     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3373     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3374
3375     state = 0xdeadbee;
3376     action = 0xdeadbee;
3377     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3378     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3379     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3380     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3381
3382     state = 0xdeadbee;
3383     action = 0xdeadbee;
3384     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3385     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3386     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3387     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3388
3389     state = 0xdeadbee;
3390     action = 0xdeadbee;
3391     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3392     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3393     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3394     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3395
3396     state = 0xdeadbee;
3397     action = 0xdeadbee;
3398     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3399     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3400     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3401     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3402
3403     state = 0xdeadbee;
3404     action = 0xdeadbee;
3405     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3406     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3407     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3408     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3409
3410     state = 0xdeadbee;
3411     action = 0xdeadbee;
3412     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3413     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3414     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3415     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3416
3417     state = 0xdeadbee;
3418     action = 0xdeadbee;
3419     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3420     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3421     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3422     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3423
3424     state = 0xdeadbee;
3425     action = 0xdeadbee;
3426     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3427     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3428     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3429     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3430
3431     state = 0xdeadbee;
3432     action = 0xdeadbee;
3433     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3434     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3435     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3436     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3437
3438     state = 0xdeadbee;
3439     action = 0xdeadbee;
3440     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3441     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3442     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3443     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3444
3445     state = 0xdeadbee;
3446     action = 0xdeadbee;
3447     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3448     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3449     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3450     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3451
3452     state = 0xdeadbee;
3453     action = 0xdeadbee;
3454     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3455     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3456     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3457     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3458
3459     state = 0xdeadbee;
3460     action = 0xdeadbee;
3461     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3462     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3463     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3464     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3465
3466     state = 0xdeadbee;
3467     action = 0xdeadbee;
3468     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3469     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3470     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3471     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3472
3473     state = 0xdeadbee;
3474     action = 0xdeadbee;
3475     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3476     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3477     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3478     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3479
3480     state = 0xdeadbee;
3481     action = 0xdeadbee;
3482     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3483     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3484     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3485     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3486
3487     state = 0xdeadbee;
3488     action = 0xdeadbee;
3489     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3490     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3491     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3492     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3493
3494     state = 0xdeadbee;
3495     action = 0xdeadbee;
3496     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3497     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3498     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3499     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3500
3501     state = 0xdeadbee;
3502     action = 0xdeadbee;
3503     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3504     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3505     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3506     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3507
3508     state = 0xdeadbee;
3509     action = 0xdeadbee;
3510     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3511     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3512     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3513     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3514
3515     state = 0xdeadbee;
3516     action = 0xdeadbee;
3517     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3518     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3519     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3520     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3521
3522     state = 0xdeadbee;
3523     action = 0xdeadbee;
3524     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3525     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3526     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3527     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3528
3529     state = 0xdeadbee;
3530     action = 0xdeadbee;
3531     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3532     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3533     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3534     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3535
3536     state = 0xdeadbee;
3537     action = 0xdeadbee;
3538     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3539     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3540     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3541     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3542
3543     state = 0xdeadbee;
3544     action = 0xdeadbee;
3545     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3546     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3547     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3548     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3549
3550     state = 0xdeadbee;
3551     action = 0xdeadbee;
3552     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3553     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3554     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3555     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3556
3557     state = 0xdeadbee;
3558     action = 0xdeadbee;
3559     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3560     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3561     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3562     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3563
3564     state = 0xdeadbee;
3565     action = 0xdeadbee;
3566     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3567     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3568     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3569     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3570
3571     state = 0xdeadbee;
3572     action = 0xdeadbee;
3573     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3574     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3575     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3576     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3577
3578     state = 0xdeadbee;
3579     action = 0xdeadbee;
3580     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3581     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3582     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3583     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3584
3585     MsiCloseHandle( hpkg );
3586
3587     /* publish the features and components */
3588     r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven REINSTALL=eight,nine,ten");
3589     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3590
3591     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
3592     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
3593
3594     /* these properties must not be in the saved msi file */
3595     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
3596     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3597
3598     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
3599     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3600
3601     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
3602     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3603
3604     r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'");
3605     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3606
3607     hpkg = package_from_db( hdb );
3608     ok( hpkg, "failed to create package\n");
3609
3610     MsiCloseHandle(hdb);
3611
3612     state = 0xdeadbee;
3613     action = 0xdeadbee;
3614     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3615     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3616     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3617     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3618
3619     state = 0xdeadbee;
3620     action = 0xdeadbee;
3621     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3622     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3623     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3624     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3625
3626     state = 0xdeadbee;
3627     action = 0xdeadbee;
3628     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3629     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3630     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3631     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3632
3633     state = 0xdeadbee;
3634     action = 0xdeadbee;
3635     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3636     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3637     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3638     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3639
3640     state = 0xdeadbee;
3641     action = 0xdeadbee;
3642     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3643     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3644     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3645     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3646
3647     state = 0xdeadbee;
3648     action = 0xdeadbee;
3649     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3650     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3651     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3652     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3653
3654     state = 0xdeadbee;
3655     action = 0xdeadbee;
3656     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3657     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3658     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3659     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3660
3661     state = 0xdeadbee;
3662     action = 0xdeadbee;
3663     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3664     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3665     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3666     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3667
3668     state = 0xdeadbee;
3669     action = 0xdeadbee;
3670     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3671     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3672     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3673     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3674
3675     state = 0xdeadbee;
3676     action = 0xdeadbee;
3677     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3678     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3679     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3680     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3681
3682     state = 0xdeadbee;
3683     action = 0xdeadbee;
3684     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3685     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3686     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3687     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3688
3689     state = 0xdeadbee;
3690     action = 0xdeadbee;
3691     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3692     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3693     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3694     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3695
3696     state = 0xdeadbee;
3697     action = 0xdeadbee;
3698     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3699     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3700     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3701     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3702
3703     state = 0xdeadbee;
3704     action = 0xdeadbee;
3705     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3706     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3707     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3708     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3709
3710     state = 0xdeadbee;
3711     action = 0xdeadbee;
3712     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3713     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3714     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3715     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3716
3717     state = 0xdeadbee;
3718     action = 0xdeadbee;
3719     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3720     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3721     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3722     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3723
3724     state = 0xdeadbee;
3725     action = 0xdeadbee;
3726     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3727     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3728     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3729     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3730
3731     state = 0xdeadbee;
3732     action = 0xdeadbee;
3733     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3734     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3735     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3736     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3737
3738     state = 0xdeadbee;
3739     action = 0xdeadbee;
3740     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3741     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3742     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3743     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3744
3745     state = 0xdeadbee;
3746     action = 0xdeadbee;
3747     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3748     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3749     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3750     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3751
3752     state = 0xdeadbee;
3753     action = 0xdeadbee;
3754     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3755     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3756     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3757     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3758
3759     state = 0xdeadbee;
3760     action = 0xdeadbee;
3761     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3762     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3763     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3764     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3765
3766     state = 0xdeadbee;
3767     action = 0xdeadbee;
3768     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3769     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3770     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3771     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3772
3773     state = 0xdeadbee;
3774     action = 0xdeadbee;
3775     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3776     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3777     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3778     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3779
3780     state = 0xdeadbee;
3781     action = 0xdeadbee;
3782     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3783     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3784     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3785     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3786
3787     state = 0xdeadbee;
3788     action = 0xdeadbee;
3789     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3790     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3791     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3792     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3793
3794     state = 0xdeadbee;
3795     action = 0xdeadbee;
3796     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3797     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3798     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3799     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3800
3801     state = 0xdeadbee;
3802     action = 0xdeadbee;
3803     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3804     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3805     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3806     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3807
3808     state = 0xdeadbee;
3809     action = 0xdeadbee;
3810     r = MsiGetComponentState(hpkg, "tau", &state, &action);
3811     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3812     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3813     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3814
3815     state = 0xdeadbee;
3816     action = 0xdeadbee;
3817     r = MsiGetComponentState(hpkg, "phi", &state, &action);
3818     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3819     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3820     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3821
3822     state = 0xdeadbee;
3823     action = 0xdeadbee;
3824     r = MsiGetComponentState(hpkg, "chi", &state, &action);
3825     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3826     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3827     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3828
3829     r = MsiDoAction( hpkg, "CostInitialize");
3830     ok( r == ERROR_SUCCESS, "cost init failed\n");
3831
3832     state = 0xdeadbee;
3833     action = 0xdeadbee;
3834     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3835     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3836     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3837     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3838
3839     state = 0xdeadbee;
3840     action = 0xdeadbee;
3841     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3842     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3843     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3844     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3845
3846     state = 0xdeadbee;
3847     action = 0xdeadbee;
3848     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3849     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3850     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3851     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3852
3853     state = 0xdeadbee;
3854     action = 0xdeadbee;
3855     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3856     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3857     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3858     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3859
3860     state = 0xdeadbee;
3861     action = 0xdeadbee;
3862     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3863     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3864     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3865     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3866
3867     state = 0xdeadbee;
3868     action = 0xdeadbee;
3869     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3870     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3871     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3872     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3873
3874     state = 0xdeadbee;
3875     action = 0xdeadbee;
3876     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3877     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3878     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3879     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3880
3881     state = 0xdeadbee;
3882     action = 0xdeadbee;
3883     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
3884     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3885     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3886     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3887
3888     state = 0xdeadbee;
3889     action = 0xdeadbee;
3890     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
3891     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3892     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3893     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3894
3895     state = 0xdeadbee;
3896     action = 0xdeadbee;
3897     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
3898     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3899     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3900     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3901
3902     state = 0xdeadbee;
3903     action = 0xdeadbee;
3904     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3905     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3906     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3907     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3908
3909     state = 0xdeadbee;
3910     action = 0xdeadbee;
3911     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3912     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3913     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3914     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3915
3916     state = 0xdeadbee;
3917     action = 0xdeadbee;
3918     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3919     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3920     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3921     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3922
3923     state = 0xdeadbee;
3924     action = 0xdeadbee;
3925     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3926     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3927     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3928     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3929
3930     state = 0xdeadbee;
3931     action = 0xdeadbee;
3932     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3933     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3934     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3935     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3936
3937     state = 0xdeadbee;
3938     action = 0xdeadbee;
3939     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3940     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3941     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3942     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3943
3944     state = 0xdeadbee;
3945     action = 0xdeadbee;
3946     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3947     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3948     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3949     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3950
3951     state = 0xdeadbee;
3952     action = 0xdeadbee;
3953     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3954     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3955     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3956     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3957
3958     state = 0xdeadbee;
3959     action = 0xdeadbee;
3960     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3961     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3962     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3963     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3964
3965     state = 0xdeadbee;
3966     action = 0xdeadbee;
3967     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3968     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3969     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3970     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3971
3972     state = 0xdeadbee;
3973     action = 0xdeadbee;
3974     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3975     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3976     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3977     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3978
3979     state = 0xdeadbee;
3980     action = 0xdeadbee;
3981     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3982     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3983     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3984     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3985
3986     state = 0xdeadbee;
3987     action = 0xdeadbee;
3988     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3989     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3990     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3991     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3992
3993     state = 0xdeadbee;
3994     action = 0xdeadbee;
3995     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3996     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3997     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3998     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3999
4000     state = 0xdeadbee;
4001     action = 0xdeadbee;
4002     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4003     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4004     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4005     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4006
4007     state = 0xdeadbee;
4008     action = 0xdeadbee;
4009     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4010     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4011     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4012     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4013
4014     state = 0xdeadbee;
4015     action = 0xdeadbee;
4016     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4017     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4018     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4019     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4020
4021     state = 0xdeadbee;
4022     action = 0xdeadbee;
4023     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4024     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4025     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4026     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4027
4028     state = 0xdeadbee;
4029     action = 0xdeadbee;
4030     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4031     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4032     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4033     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4034
4035     state = 0xdeadbee;
4036     action = 0xdeadbee;
4037     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4038     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4039     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4040     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4041
4042     state = 0xdeadbee;
4043     action = 0xdeadbee;
4044     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4045     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4046     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4047     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4048
4049     r = MsiDoAction( hpkg, "FileCost");
4050     ok( r == ERROR_SUCCESS, "file cost failed\n");
4051
4052     state = 0xdeadbee;
4053     action = 0xdeadbee;
4054     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4055     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4056     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4057     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4058
4059     state = 0xdeadbee;
4060     action = 0xdeadbee;
4061     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4062     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4063     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4064     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4065
4066     state = 0xdeadbee;
4067     action = 0xdeadbee;
4068     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4069     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4070     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4071     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4072
4073     state = 0xdeadbee;
4074     action = 0xdeadbee;
4075     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4076     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4077     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4078     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4079
4080     state = 0xdeadbee;
4081     action = 0xdeadbee;
4082     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4083     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4084     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4085     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4086
4087     state = 0xdeadbee;
4088     action = 0xdeadbee;
4089     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4090     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4091     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4092     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4093
4094     state = 0xdeadbee;
4095     action = 0xdeadbee;
4096     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4097     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4098     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4099     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4100
4101     state = 0xdeadbee;
4102     action = 0xdeadbee;
4103     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4104     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4105     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4106     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4107
4108     state = 0xdeadbee;
4109     action = 0xdeadbee;
4110     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4111     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4112     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4113     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4114
4115     state = 0xdeadbee;
4116     action = 0xdeadbee;
4117     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4118     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4119     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4120     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4121
4122     state = 0xdeadbee;
4123     action = 0xdeadbee;
4124     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4125     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4126     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4127     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4128
4129     state = 0xdeadbee;
4130     action = 0xdeadbee;
4131     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4132     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4133     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4134     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4135
4136     state = 0xdeadbee;
4137     action = 0xdeadbee;
4138     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4139     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4140     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4141     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4142
4143     state = 0xdeadbee;
4144     action = 0xdeadbee;
4145     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4146     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4147     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4148     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4149
4150     state = 0xdeadbee;
4151     action = 0xdeadbee;
4152     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4153     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4154     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4155     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4156
4157     state = 0xdeadbee;
4158     action = 0xdeadbee;
4159     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4160     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4161     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4162     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4163
4164     state = 0xdeadbee;
4165     action = 0xdeadbee;
4166     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4167     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4168     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4169     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4170
4171     state = 0xdeadbee;
4172     action = 0xdeadbee;
4173     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4174     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4175     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4176     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4177
4178     state = 0xdeadbee;
4179     action = 0xdeadbee;
4180     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4181     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4182     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4183     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4184
4185     state = 0xdeadbee;
4186     action = 0xdeadbee;
4187     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4188     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4189     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4190     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4191
4192     state = 0xdeadbee;
4193     action = 0xdeadbee;
4194     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4195     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4196     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4197     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4198
4199     state = 0xdeadbee;
4200     action = 0xdeadbee;
4201     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4202     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4203     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4204     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4205
4206     state = 0xdeadbee;
4207     action = 0xdeadbee;
4208     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4209     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4210     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4211     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4212
4213     state = 0xdeadbee;
4214     action = 0xdeadbee;
4215     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4216     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4217     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4218     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4219
4220     state = 0xdeadbee;
4221     action = 0xdeadbee;
4222     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4223     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4224     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4225     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4226
4227     state = 0xdeadbee;
4228     action = 0xdeadbee;
4229     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4230     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4231     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4232     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4233
4234     state = 0xdeadbee;
4235     action = 0xdeadbee;
4236     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4237     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4238     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4239     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4240
4241     state = 0xdeadbee;
4242     action = 0xdeadbee;
4243     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4244     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4245     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4246     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4247
4248     state = 0xdeadbee;
4249     action = 0xdeadbee;
4250     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4251     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4252     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4253     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4254
4255     state = 0xdeadbee;
4256     action = 0xdeadbee;
4257     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4258     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4259     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4260     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4261
4262     r = MsiDoAction( hpkg, "CostFinalize");
4263     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
4264
4265     state = 0xdeadbee;
4266     action = 0xdeadbee;
4267     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4268     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4269     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4270     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4271
4272     state = 0xdeadbee;
4273     action = 0xdeadbee;
4274     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4275     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4276     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4277     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4278
4279     state = 0xdeadbee;
4280     action = 0xdeadbee;
4281     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4282     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4283     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4284     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4285
4286     state = 0xdeadbee;
4287     action = 0xdeadbee;
4288     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4289     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4290     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4291     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4292
4293     state = 0xdeadbee;
4294     action = 0xdeadbee;
4295     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4296     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4297     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4298     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4299
4300     state = 0xdeadbee;
4301     action = 0xdeadbee;
4302     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4303     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4304     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4305     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4306
4307     state = 0xdeadbee;
4308     action = 0xdeadbee;
4309     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4310     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4311     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4312     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4313
4314     state = 0xdeadbee;
4315     action = 0xdeadbee;
4316     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4317     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4318     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4319     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4320
4321     state = 0xdeadbee;
4322     action = 0xdeadbee;
4323     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4324     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4325     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4326     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4327
4328     state = 0xdeadbee;
4329     action = 0xdeadbee;
4330     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4331     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4332     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4333     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4334
4335     state = 0xdeadbee;
4336     action = 0xdeadbee;
4337     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4338     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4339     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4340     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4341
4342     state = 0xdeadbee;
4343     action = 0xdeadbee;
4344     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4345     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4346     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4347     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4348
4349     state = 0xdeadbee;
4350     action = 0xdeadbee;
4351     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4352     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4353     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4354     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4355
4356     state = 0xdeadbee;
4357     action = 0xdeadbee;
4358     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4359     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4360     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4361     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4362
4363     state = 0xdeadbee;
4364     action = 0xdeadbee;
4365     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4366     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4367     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4368     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4369
4370     state = 0xdeadbee;
4371     action = 0xdeadbee;
4372     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4373     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4374     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4375     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4376
4377     state = 0xdeadbee;
4378     action = 0xdeadbee;
4379     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4380     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4381     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4382     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4383
4384     state = 0xdeadbee;
4385     action = 0xdeadbee;
4386     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4387     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4388     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4389     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4390
4391     state = 0xdeadbee;
4392     action = 0xdeadbee;
4393     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4394     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4395     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4396     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4397
4398     state = 0xdeadbee;
4399     action = 0xdeadbee;
4400     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4401     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4402     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4403     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4404
4405     state = 0xdeadbee;
4406     action = 0xdeadbee;
4407     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4408     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4409     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4410     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4411
4412     state = 0xdeadbee;
4413     action = 0xdeadbee;
4414     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4415     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4416     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4417     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4418
4419     state = 0xdeadbee;
4420     action = 0xdeadbee;
4421     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4422     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4423     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4424     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4425
4426     state = 0xdeadbee;
4427     action = 0xdeadbee;
4428     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4429     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4430     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4431     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4432
4433     state = 0xdeadbee;
4434     action = 0xdeadbee;
4435     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4436     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4437     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4438     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4439
4440     state = 0xdeadbee;
4441     action = 0xdeadbee;
4442     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4443     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4444     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4445     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4446
4447     state = 0xdeadbee;
4448     action = 0xdeadbee;
4449     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4450     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4451     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4452     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4453
4454     state = 0xdeadbee;
4455     action = 0xdeadbee;
4456     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4457     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4458     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4459     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4460
4461     state = 0xdeadbee;
4462     action = 0xdeadbee;
4463     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4464     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4465     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4466     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4467
4468     state = 0xdeadbee;
4469     action = 0xdeadbee;
4470     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4471     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4472     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4473     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4474
4475     state = 0xdeadbee;
4476     action = 0xdeadbee;
4477     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4478     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4479     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4480     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4481
4482     MsiCloseHandle(hpkg);
4483
4484     /* uninstall the product */
4485     r = MsiInstallProduct(msifile, "REMOVE=ALL");
4486     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4487
4488     /* all features installed locally */
4489     r = MsiInstallProduct(msifile2, "ADDLOCAL=ALL");
4490     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4491
4492     r = MsiOpenDatabase(msifile2, MSIDBOPEN_DIRECT, &hdb);
4493     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
4494
4495     /* these properties must not be in the saved msi file */
4496     r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven,eight,nine,ten'");
4497     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
4498
4499     hpkg = package_from_db( hdb );
4500     ok( hpkg, "failed to create package\n");
4501
4502     state = 0xdeadbee;
4503     action = 0xdeadbee;
4504     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4505     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4506     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4507     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4508
4509     state = 0xdeadbee;
4510     action = 0xdeadbee;
4511     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4512     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4513     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4514     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4515
4516     state = 0xdeadbee;
4517     action = 0xdeadbee;
4518     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4519     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4520     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4521     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4522
4523     state = 0xdeadbee;
4524     action = 0xdeadbee;
4525     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4526     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4527     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4528     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4529
4530     state = 0xdeadbee;
4531     action = 0xdeadbee;
4532     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4533     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4534     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4535     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4536
4537     state = 0xdeadbee;
4538     action = 0xdeadbee;
4539     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4540     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4541     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4542     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4543
4544     state = 0xdeadbee;
4545     action = 0xdeadbee;
4546     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4547     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4548     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4549     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4550
4551     state = 0xdeadbee;
4552     action = 0xdeadbee;
4553     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4554     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4555     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4556     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4557
4558     state = 0xdeadbee;
4559     action = 0xdeadbee;
4560     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4561     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4562     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4563     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4564
4565     state = 0xdeadbee;
4566     action = 0xdeadbee;
4567     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4568     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4569     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4570     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4571
4572     state = 0xdeadbee;
4573     action = 0xdeadbee;
4574     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4575     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4576     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4577     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4578
4579     state = 0xdeadbee;
4580     action = 0xdeadbee;
4581     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4582     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4583     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4584     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4585
4586     state = 0xdeadbee;
4587     action = 0xdeadbee;
4588     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4589     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4590     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4591     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4592
4593     state = 0xdeadbee;
4594     action = 0xdeadbee;
4595     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4596     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4597     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4598     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4599
4600     state = 0xdeadbee;
4601     action = 0xdeadbee;
4602     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4603     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4604     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4605     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4606
4607     state = 0xdeadbee;
4608     action = 0xdeadbee;
4609     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4610     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4611     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4612     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4613
4614     state = 0xdeadbee;
4615     action = 0xdeadbee;
4616     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4617     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4618     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4619     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4620
4621     state = 0xdeadbee;
4622     action = 0xdeadbee;
4623     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4624     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4625     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4626     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4627
4628     state = 0xdeadbee;
4629     action = 0xdeadbee;
4630     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4631     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4632     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4633     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4634
4635     state = 0xdeadbee;
4636     action = 0xdeadbee;
4637     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4638     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4639     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4640     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4641
4642     state = 0xdeadbee;
4643     action = 0xdeadbee;
4644     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4645     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4646     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4647     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4648
4649     state = 0xdeadbee;
4650     action = 0xdeadbee;
4651     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4652     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4653     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4654     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4655
4656     state = 0xdeadbee;
4657     action = 0xdeadbee;
4658     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4659     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4660     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4661     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4662
4663     state = 0xdeadbee;
4664     action = 0xdeadbee;
4665     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4666     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4667     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4668     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4669
4670     state = 0xdeadbee;
4671     action = 0xdeadbee;
4672     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4673     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4674     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4675     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4676
4677     state = 0xdeadbee;
4678     action = 0xdeadbee;
4679     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4680     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4681     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4682     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4683
4684     state = 0xdeadbee;
4685     action = 0xdeadbee;
4686     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4687     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4688     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4689     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4690
4691     state = 0xdeadbee;
4692     action = 0xdeadbee;
4693     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4694     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4695     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4696     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4697
4698     state = 0xdeadbee;
4699     action = 0xdeadbee;
4700     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4701     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4702     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4703     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4704
4705     state = 0xdeadbee;
4706     action = 0xdeadbee;
4707     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4708     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4709     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4710     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4711
4712     state = 0xdeadbee;
4713     action = 0xdeadbee;
4714     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4715     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4716     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4717     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4718
4719     r = MsiDoAction( hpkg, "CostInitialize");
4720     ok( r == ERROR_SUCCESS, "cost init failed\n");
4721
4722     state = 0xdeadbee;
4723     action = 0xdeadbee;
4724     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4725     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4726     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4727     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4728
4729     state = 0xdeadbee;
4730     action = 0xdeadbee;
4731     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4732     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4733     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4734     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4735
4736     state = 0xdeadbee;
4737     action = 0xdeadbee;
4738     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4739     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4740     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4741     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4742
4743     state = 0xdeadbee;
4744     action = 0xdeadbee;
4745     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4746     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4747     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4748     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4749
4750     state = 0xdeadbee;
4751     action = 0xdeadbee;
4752     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4753     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4754     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4755     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4756
4757     state = 0xdeadbee;
4758     action = 0xdeadbee;
4759     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4760     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4761     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4762     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4763
4764     state = 0xdeadbee;
4765     action = 0xdeadbee;
4766     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4767     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4768     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4769     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4770
4771     state = 0xdeadbee;
4772     action = 0xdeadbee;
4773     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4774     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4775     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4776     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4777
4778     state = 0xdeadbee;
4779     action = 0xdeadbee;
4780     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
4781     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4782     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4783     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4784
4785     state = 0xdeadbee;
4786     action = 0xdeadbee;
4787     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
4788     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4789     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4790     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4791
4792     state = 0xdeadbee;
4793     action = 0xdeadbee;
4794     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4795     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4796     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4797     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4798
4799     state = 0xdeadbee;
4800     action = 0xdeadbee;
4801     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4802     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4803     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4804     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4805
4806     state = 0xdeadbee;
4807     action = 0xdeadbee;
4808     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4809     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4810     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4811     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4812
4813     state = 0xdeadbee;
4814     action = 0xdeadbee;
4815     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4816     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4817     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4818     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4819
4820     state = 0xdeadbee;
4821     action = 0xdeadbee;
4822     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4823     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4824     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4825     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4826
4827     state = 0xdeadbee;
4828     action = 0xdeadbee;
4829     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4830     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4831     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4832     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4833
4834     state = 0xdeadbee;
4835     action = 0xdeadbee;
4836     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4837     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4838     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4839     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4840
4841     state = 0xdeadbee;
4842     action = 0xdeadbee;
4843     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4844     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4845     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4846     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4847
4848     state = 0xdeadbee;
4849     action = 0xdeadbee;
4850     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4851     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4852     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4853     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4854
4855     state = 0xdeadbee;
4856     action = 0xdeadbee;
4857     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4858     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4859     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4860     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4861
4862     state = 0xdeadbee;
4863     action = 0xdeadbee;
4864     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4865     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4866     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4867     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4868
4869     state = 0xdeadbee;
4870     action = 0xdeadbee;
4871     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4872     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4873     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4874     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4875
4876     state = 0xdeadbee;
4877     action = 0xdeadbee;
4878     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4879     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4880     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4881     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4882
4883     state = 0xdeadbee;
4884     action = 0xdeadbee;
4885     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4886     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4887     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4888     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4889
4890     state = 0xdeadbee;
4891     action = 0xdeadbee;
4892     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4893     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4894     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4895     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4896
4897     state = 0xdeadbee;
4898     action = 0xdeadbee;
4899     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4900     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4901     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4902     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4903
4904     state = 0xdeadbee;
4905     action = 0xdeadbee;
4906     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4907     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4908     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4909     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4910
4911     state = 0xdeadbee;
4912     action = 0xdeadbee;
4913     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4914     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4915     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4916     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4917
4918     state = 0xdeadbee;
4919     action = 0xdeadbee;
4920     r = MsiGetComponentState(hpkg, "tau", &state, &action);
4921     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4922     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4923     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4924
4925     state = 0xdeadbee;
4926     action = 0xdeadbee;
4927     r = MsiGetComponentState(hpkg, "phi", &state, &action);
4928     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4929     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4930     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4931
4932     state = 0xdeadbee;
4933     action = 0xdeadbee;
4934     r = MsiGetComponentState(hpkg, "chi", &state, &action);
4935     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4936     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4937     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4938
4939     r = MsiDoAction( hpkg, "FileCost");
4940     ok( r == ERROR_SUCCESS, "file cost failed\n");
4941
4942     state = 0xdeadbee;
4943     action = 0xdeadbee;
4944     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4945     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4946     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4947     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4948
4949     state = 0xdeadbee;
4950     action = 0xdeadbee;
4951     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4952     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4953     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4954     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4955
4956     state = 0xdeadbee;
4957     action = 0xdeadbee;
4958     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4959     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4960     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4961     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4962
4963     state = 0xdeadbee;
4964     action = 0xdeadbee;
4965     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4966     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4967     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4968     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4969
4970     state = 0xdeadbee;
4971     action = 0xdeadbee;
4972     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4973     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4974     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4975     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4976
4977     state = 0xdeadbee;
4978     action = 0xdeadbee;
4979     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4980     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4981     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4982     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4983
4984     state = 0xdeadbee;
4985     action = 0xdeadbee;
4986     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4987     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4988     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4989     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4990
4991     state = 0xdeadbee;
4992     action = 0xdeadbee;
4993     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
4994     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4995     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4996     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4997
4998     state = 0xdeadbee;
4999     action = 0xdeadbee;
5000     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5001     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5002     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5003     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5004
5005     state = 0xdeadbee;
5006     action = 0xdeadbee;
5007     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5008     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5009     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5010     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5011
5012     state = 0xdeadbee;
5013     action = 0xdeadbee;
5014     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5015     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5016     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5017     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5018
5019     state = 0xdeadbee;
5020     action = 0xdeadbee;
5021     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5022     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5023     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5024     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5025
5026     state = 0xdeadbee;
5027     action = 0xdeadbee;
5028     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5029     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5030     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5031     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5032
5033     state = 0xdeadbee;
5034     action = 0xdeadbee;
5035     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5036     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5037     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5038     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5039
5040     state = 0xdeadbee;
5041     action = 0xdeadbee;
5042     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5043     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5044     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5045     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5046
5047     state = 0xdeadbee;
5048     action = 0xdeadbee;
5049     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5050     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5051     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5052     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5053
5054     state = 0xdeadbee;
5055     action = 0xdeadbee;
5056     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5057     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5058     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5059     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5060
5061     state = 0xdeadbee;
5062     action = 0xdeadbee;
5063     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5064     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5065     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5066     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5067
5068     state = 0xdeadbee;
5069     action = 0xdeadbee;
5070     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5071     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5072     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5073     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5074
5075     state = 0xdeadbee;
5076     action = 0xdeadbee;
5077     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5078     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5079     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5080     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5081
5082     state = 0xdeadbee;
5083     action = 0xdeadbee;
5084     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5085     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5086     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5087     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5088
5089     state = 0xdeadbee;
5090     action = 0xdeadbee;
5091     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5092     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5093     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5094     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5095
5096     state = 0xdeadbee;
5097     action = 0xdeadbee;
5098     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5099     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5100     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5101     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5102
5103     state = 0xdeadbee;
5104     action = 0xdeadbee;
5105     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5106     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5107     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5108     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5109
5110     state = 0xdeadbee;
5111     action = 0xdeadbee;
5112     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5113     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5114     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5115     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5116
5117     state = 0xdeadbee;
5118     action = 0xdeadbee;
5119     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5120     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5121     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5122     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5123
5124     state = 0xdeadbee;
5125     action = 0xdeadbee;
5126     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5127     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5128     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5129     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5130
5131     state = 0xdeadbee;
5132     action = 0xdeadbee;
5133     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5134     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5135     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5136     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5137
5138     state = 0xdeadbee;
5139     action = 0xdeadbee;
5140     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5141     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5142     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5143     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5144
5145     state = 0xdeadbee;
5146     action = 0xdeadbee;
5147     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5148     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5149     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5150     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5151
5152     state = 0xdeadbee;
5153     action = 0xdeadbee;
5154     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5155     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5156     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5157     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5158
5159     r = MsiDoAction( hpkg, "CostFinalize");
5160     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
5161
5162     state = 0xdeadbee;
5163     action = 0xdeadbee;
5164     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5165     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5166     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5167     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5168
5169     state = 0xdeadbee;
5170     action = 0xdeadbee;
5171     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5172     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5173     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5174     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5175
5176     state = 0xdeadbee;
5177     action = 0xdeadbee;
5178     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5179     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5180     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5181     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5182
5183     state = 0xdeadbee;
5184     action = 0xdeadbee;
5185     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5186     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5187     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5188     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5189
5190     state = 0xdeadbee;
5191     action = 0xdeadbee;
5192     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5193     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5194     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5195     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5196
5197     state = 0xdeadbee;
5198     action = 0xdeadbee;
5199     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5200     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5201     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5202     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5203
5204     state = 0xdeadbee;
5205     action = 0xdeadbee;
5206     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5207     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5208     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5209     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5210
5211     state = 0xdeadbee;
5212     action = 0xdeadbee;
5213     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5214     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5215     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5216     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5217
5218     state = 0xdeadbee;
5219     action = 0xdeadbee;
5220     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5221     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5222     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5223     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5224
5225     state = 0xdeadbee;
5226     action = 0xdeadbee;
5227     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5228     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5229     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5230     todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5231
5232     state = 0xdeadbee;
5233     action = 0xdeadbee;
5234     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5235     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5236     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5237     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5238
5239     state = 0xdeadbee;
5240     action = 0xdeadbee;
5241     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5242     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5243     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5244     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5245
5246     state = 0xdeadbee;
5247     action = 0xdeadbee;
5248     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5249     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5250     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5251     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5252
5253     state = 0xdeadbee;
5254     action = 0xdeadbee;
5255     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5256     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5257     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5258     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5259
5260     state = 0xdeadbee;
5261     action = 0xdeadbee;
5262     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5263     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5264     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5265     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5266
5267     state = 0xdeadbee;
5268     action = 0xdeadbee;
5269     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5270     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5271     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5272     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5273
5274     state = 0xdeadbee;
5275     action = 0xdeadbee;
5276     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5277     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5278     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5279     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5280
5281     state = 0xdeadbee;
5282     action = 0xdeadbee;
5283     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5284     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5285     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5286     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5287
5288     state = 0xdeadbee;
5289     action = 0xdeadbee;
5290     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5291     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5292     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5293     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5294
5295     state = 0xdeadbee;
5296     action = 0xdeadbee;
5297     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5298     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5299     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5300     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5301
5302     state = 0xdeadbee;
5303     action = 0xdeadbee;
5304     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5305     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5306     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5307     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5308
5309     state = 0xdeadbee;
5310     action = 0xdeadbee;
5311     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5312     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5313     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5314     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5315
5316     state = 0xdeadbee;
5317     action = 0xdeadbee;
5318     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5319     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5320     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5321     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5322
5323     state = 0xdeadbee;
5324     action = 0xdeadbee;
5325     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5326     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5327     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5328     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5329
5330     state = 0xdeadbee;
5331     action = 0xdeadbee;
5332     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5333     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5334     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5335     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5336
5337     state = 0xdeadbee;
5338     action = 0xdeadbee;
5339     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5340     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5341     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5342     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
5343
5344     state = 0xdeadbee;
5345     action = 0xdeadbee;
5346     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5347     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5348     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5349     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5350
5351     state = 0xdeadbee;
5352     action = 0xdeadbee;
5353     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5354     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5355     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5356     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5357
5358     state = 0xdeadbee;
5359     action = 0xdeadbee;
5360     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5361     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5362     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5363     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5364
5365     state = 0xdeadbee;
5366     action = 0xdeadbee;
5367     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5368     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5369     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5370     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5371
5372     state = 0xdeadbee;
5373     action = 0xdeadbee;
5374     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5375     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5376     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5377     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5378
5379     MsiCloseHandle(hpkg);
5380
5381     /* uninstall the product */
5382     r = MsiInstallProduct(msifile2, "REMOVE=ALL");
5383     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5384
5385     /* all features installed from source */
5386     r = MsiInstallProduct(msifile3, "ADDSOURCE=ALL");
5387     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5388
5389     r = MsiOpenDatabase(msifile3, MSIDBOPEN_DIRECT, &hdb);
5390     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
5391
5392     /* this property must not be in the saved msi file */
5393     r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'");
5394     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
5395
5396     hpkg = package_from_db( hdb );
5397     ok( hpkg, "failed to create package\n");
5398
5399     state = 0xdeadbee;
5400     action = 0xdeadbee;
5401     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5402     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5403     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5404     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5405
5406     state = 0xdeadbee;
5407     action = 0xdeadbee;
5408     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5409     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5410     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5411     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5412
5413     state = 0xdeadbee;
5414     action = 0xdeadbee;
5415     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5416     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5417     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5418     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5419
5420     state = 0xdeadbee;
5421     action = 0xdeadbee;
5422     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5423     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5424     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5425     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5426
5427     state = 0xdeadbee;
5428     action = 0xdeadbee;
5429     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5430     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5431     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5432     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5433
5434     state = 0xdeadbee;
5435     action = 0xdeadbee;
5436     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5437     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5438     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5439     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5440
5441     state = 0xdeadbee;
5442     action = 0xdeadbee;
5443     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5444     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5445     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5446     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5447
5448     state = 0xdeadbee;
5449     action = 0xdeadbee;
5450     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5451     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5452     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5453     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5454
5455     state = 0xdeadbee;
5456     action = 0xdeadbee;
5457     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5458     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5459     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5460     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5461
5462     state = 0xdeadbee;
5463     action = 0xdeadbee;
5464     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5465     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
5466     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5467     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5468
5469     state = 0xdeadbee;
5470     action = 0xdeadbee;
5471     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5472     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5473     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5474     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5475
5476     state = 0xdeadbee;
5477     action = 0xdeadbee;
5478     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5479     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5480     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5481     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5482
5483     state = 0xdeadbee;
5484     action = 0xdeadbee;
5485     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5486     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5487     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5488     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5489
5490     state = 0xdeadbee;
5491     action = 0xdeadbee;
5492     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5493     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5494     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5495     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5496
5497     state = 0xdeadbee;
5498     action = 0xdeadbee;
5499     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5500     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5501     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5502     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5503
5504     state = 0xdeadbee;
5505     action = 0xdeadbee;
5506     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5507     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5508     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5509     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5510
5511     state = 0xdeadbee;
5512     action = 0xdeadbee;
5513     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5514     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5515     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5516     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5517
5518     state = 0xdeadbee;
5519     action = 0xdeadbee;
5520     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5521     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5522     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5523     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5524
5525     state = 0xdeadbee;
5526     action = 0xdeadbee;
5527     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5528     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5529     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5530     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5531
5532     state = 0xdeadbee;
5533     action = 0xdeadbee;
5534     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5535     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5536     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5537     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5538
5539     state = 0xdeadbee;
5540     action = 0xdeadbee;
5541     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5542     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5543     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5544     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5545
5546     state = 0xdeadbee;
5547     action = 0xdeadbee;
5548     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5549     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5550     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5551     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5552
5553     state = 0xdeadbee;
5554     action = 0xdeadbee;
5555     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5556     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5557     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5558     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5559
5560     state = 0xdeadbee;
5561     action = 0xdeadbee;
5562     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5563     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5564     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5565     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5566
5567     state = 0xdeadbee;
5568     action = 0xdeadbee;
5569     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5570     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5571     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5572     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5573
5574     state = 0xdeadbee;
5575     action = 0xdeadbee;
5576     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5577     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5578     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5579     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5580
5581     state = 0xdeadbee;
5582     action = 0xdeadbee;
5583     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5584     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5585     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5586     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5587
5588     state = 0xdeadbee;
5589     action = 0xdeadbee;
5590     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5591     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5592     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5593     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5594
5595     state = 0xdeadbee;
5596     action = 0xdeadbee;
5597     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5598     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5599     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5600     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5601
5602     state = 0xdeadbee;
5603     action = 0xdeadbee;
5604     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5605     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5606     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5607     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5608
5609     state = 0xdeadbee;
5610     action = 0xdeadbee;
5611     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5612     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5613     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5614     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5615
5616     r = MsiDoAction( hpkg, "CostInitialize");
5617     ok( r == ERROR_SUCCESS, "cost init failed\n");
5618
5619     state = 0xdeadbee;
5620     action = 0xdeadbee;
5621     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5622     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5623     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5624     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5625
5626     state = 0xdeadbee;
5627     action = 0xdeadbee;
5628     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5629     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5630     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5631     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5632
5633     state = 0xdeadbee;
5634     action = 0xdeadbee;
5635     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5636     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5637     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5638     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5639
5640     state = 0xdeadbee;
5641     action = 0xdeadbee;
5642     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5643     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5644     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5645     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5646
5647     state = 0xdeadbee;
5648     action = 0xdeadbee;
5649     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5650     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5651     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5652     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5653
5654     state = 0xdeadbee;
5655     action = 0xdeadbee;
5656     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5657     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5658     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5659     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5660
5661     state = 0xdeadbee;
5662     action = 0xdeadbee;
5663     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5664     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5665     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5666     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5667
5668     state = 0xdeadbee;
5669     action = 0xdeadbee;
5670     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5671     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5672     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5673     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5674
5675     state = 0xdeadbee;
5676     action = 0xdeadbee;
5677     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5678     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5679     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5680     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5681
5682     state = 0xdeadbee;
5683     action = 0xdeadbee;
5684     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5685     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5686     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5687     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5688
5689     state = 0xdeadbee;
5690     action = 0xdeadbee;
5691     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5692     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5693     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5694     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5695
5696     state = 0xdeadbee;
5697     action = 0xdeadbee;
5698     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5699     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5700     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5701     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5702
5703     state = 0xdeadbee;
5704     action = 0xdeadbee;
5705     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5706     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5707     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5708     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5709
5710     state = 0xdeadbee;
5711     action = 0xdeadbee;
5712     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5713     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5714     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5715     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5716
5717     state = 0xdeadbee;
5718     action = 0xdeadbee;
5719     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5720     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5721     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5722     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5723
5724     state = 0xdeadbee;
5725     action = 0xdeadbee;
5726     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5727     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5728     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5729     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5730
5731     state = 0xdeadbee;
5732     action = 0xdeadbee;
5733     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5734     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5735     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5736     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5737
5738     state = 0xdeadbee;
5739     action = 0xdeadbee;
5740     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5741     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5742     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5743     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5744
5745     state = 0xdeadbee;
5746     action = 0xdeadbee;
5747     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5748     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5749     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5750     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5751
5752     state = 0xdeadbee;
5753     action = 0xdeadbee;
5754     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5755     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5756     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5757     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5758
5759     state = 0xdeadbee;
5760     action = 0xdeadbee;
5761     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5762     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5763     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5764     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5765
5766     state = 0xdeadbee;
5767     action = 0xdeadbee;
5768     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5769     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5770     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5771     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5772
5773     state = 0xdeadbee;
5774     action = 0xdeadbee;
5775     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5776     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5777     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5778     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5779
5780     state = 0xdeadbee;
5781     action = 0xdeadbee;
5782     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5783     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5784     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5785     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5786
5787     state = 0xdeadbee;
5788     action = 0xdeadbee;
5789     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5790     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5791     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5792     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5793
5794     state = 0xdeadbee;
5795     action = 0xdeadbee;
5796     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5797     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5798     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5799     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5800
5801     state = 0xdeadbee;
5802     action = 0xdeadbee;
5803     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5804     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5805     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5806     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5807
5808     state = 0xdeadbee;
5809     action = 0xdeadbee;
5810     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5811     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5812     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5813     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5814
5815     state = 0xdeadbee;
5816     action = 0xdeadbee;
5817     r = MsiGetComponentState(hpkg, "tau", &state, &action);
5818     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5819     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5820     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5821
5822     state = 0xdeadbee;
5823     action = 0xdeadbee;
5824     r = MsiGetComponentState(hpkg, "phi", &state, &action);
5825     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5826     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5827     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5828
5829     state = 0xdeadbee;
5830     action = 0xdeadbee;
5831     r = MsiGetComponentState(hpkg, "chi", &state, &action);
5832     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5833     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5834     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5835
5836     r = MsiDoAction( hpkg, "FileCost");
5837     ok( r == ERROR_SUCCESS, "file cost failed\n");
5838
5839     state = 0xdeadbee;
5840     action = 0xdeadbee;
5841     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5842     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5843     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5844     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5845
5846     state = 0xdeadbee;
5847     action = 0xdeadbee;
5848     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5849     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5850     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5851     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5852
5853     state = 0xdeadbee;
5854     action = 0xdeadbee;
5855     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5856     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5857     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5858     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5859
5860     state = 0xdeadbee;
5861     action = 0xdeadbee;
5862     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5863     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5864     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5865     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5866
5867     state = 0xdeadbee;
5868     action = 0xdeadbee;
5869     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5870     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5871     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5872     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5873
5874     state = 0xdeadbee;
5875     action = 0xdeadbee;
5876     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5877     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5878     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5879     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5880
5881     state = 0xdeadbee;
5882     action = 0xdeadbee;
5883     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5884     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5885     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5886     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5887
5888     state = 0xdeadbee;
5889     action = 0xdeadbee;
5890     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
5891     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5892     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5893     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5894
5895     state = 0xdeadbee;
5896     action = 0xdeadbee;
5897     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
5898     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5899     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5900     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5901
5902     state = 0xdeadbee;
5903     action = 0xdeadbee;
5904     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
5905     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5906     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5907     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5908
5909     state = 0xdeadbee;
5910     action = 0xdeadbee;
5911     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5912     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5913     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5914     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5915
5916     state = 0xdeadbee;
5917     action = 0xdeadbee;
5918     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5919     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5920     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5921     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5922
5923     state = 0xdeadbee;
5924     action = 0xdeadbee;
5925     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5926     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5927     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5928     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5929
5930     state = 0xdeadbee;
5931     action = 0xdeadbee;
5932     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5933     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5934     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5935     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5936
5937     state = 0xdeadbee;
5938     action = 0xdeadbee;
5939     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5940     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5941     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5942     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5943
5944     state = 0xdeadbee;
5945     action = 0xdeadbee;
5946     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5947     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5948     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5949     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5950
5951     state = 0xdeadbee;
5952     action = 0xdeadbee;
5953     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5954     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5955     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5956     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5957
5958     state = 0xdeadbee;
5959     action = 0xdeadbee;
5960     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5961     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5962     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5963     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5964
5965     state = 0xdeadbee;
5966     action = 0xdeadbee;
5967     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5968     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5969     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5970     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5971
5972     state = 0xdeadbee;
5973     action = 0xdeadbee;
5974     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5975     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5976     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5977     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5978
5979     state = 0xdeadbee;
5980     action = 0xdeadbee;
5981     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5982     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5983     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5984     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5985
5986     state = 0xdeadbee;
5987     action = 0xdeadbee;
5988     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5989     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5990     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5991     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5992
5993     state = 0xdeadbee;
5994     action = 0xdeadbee;
5995     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5996     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5997     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5998     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5999
6000     state = 0xdeadbee;
6001     action = 0xdeadbee;
6002     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6003     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6004     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6005     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6006
6007     state = 0xdeadbee;
6008     action = 0xdeadbee;
6009     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6010     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6011     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6012     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6013
6014     state = 0xdeadbee;
6015     action = 0xdeadbee;
6016     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6017     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6018     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6019     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6020
6021     state = 0xdeadbee;
6022     action = 0xdeadbee;
6023     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6024     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6025     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6026     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6027
6028     state = 0xdeadbee;
6029     action = 0xdeadbee;
6030     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6031     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6032     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6033     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6034
6035     state = 0xdeadbee;
6036     action = 0xdeadbee;
6037     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6038     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6039     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6040     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6041
6042     state = 0xdeadbee;
6043     action = 0xdeadbee;
6044     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6045     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6046     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6047     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6048
6049     state = 0xdeadbee;
6050     action = 0xdeadbee;
6051     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6052     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6053     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6054     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6055
6056     r = MsiDoAction( hpkg, "CostFinalize");
6057     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
6058
6059     state = 0xdeadbee;
6060     action = 0xdeadbee;
6061     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6062     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6063     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6064     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6065
6066     state = 0xdeadbee;
6067     action = 0xdeadbee;
6068     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6069     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6070     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6071     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6072
6073     state = 0xdeadbee;
6074     action = 0xdeadbee;
6075     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6076     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6077     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6078     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6079
6080     state = 0xdeadbee;
6081     action = 0xdeadbee;
6082     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6083     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6084     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6085     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6086
6087     state = 0xdeadbee;
6088     action = 0xdeadbee;
6089     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6090     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6091     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6092     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6093
6094     state = 0xdeadbee;
6095     action = 0xdeadbee;
6096     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6097     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6098     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6099     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6100
6101     state = 0xdeadbee;
6102     action = 0xdeadbee;
6103     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6104     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6105     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6106     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6107
6108     state = 0xdeadbee;
6109     action = 0xdeadbee;
6110     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6111     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6112     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6113     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6114
6115     state = 0xdeadbee;
6116     action = 0xdeadbee;
6117     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6118     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6119     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6120     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6121
6122     state = 0xdeadbee;
6123     action = 0xdeadbee;
6124     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6125     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6126     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6127     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6128
6129     state = 0xdeadbee;
6130     action = 0xdeadbee;
6131     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6132     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6133     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6134     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6135
6136     state = 0xdeadbee;
6137     action = 0xdeadbee;
6138     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6139     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6140     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6141     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6142
6143     state = 0xdeadbee;
6144     action = 0xdeadbee;
6145     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6146     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6147     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6148     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6149
6150     state = 0xdeadbee;
6151     action = 0xdeadbee;
6152     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6153     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6154     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6155     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6156
6157     state = 0xdeadbee;
6158     action = 0xdeadbee;
6159     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6160     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6161     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6162     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6163
6164     state = 0xdeadbee;
6165     action = 0xdeadbee;
6166     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6167     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6168     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6169     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6170
6171     state = 0xdeadbee;
6172     action = 0xdeadbee;
6173     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6174     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6175     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6176     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6177
6178     state = 0xdeadbee;
6179     action = 0xdeadbee;
6180     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6181     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6182     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6183     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6184
6185     state = 0xdeadbee;
6186     action = 0xdeadbee;
6187     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6188     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6189     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6190     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6191
6192     state = 0xdeadbee;
6193     action = 0xdeadbee;
6194     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6195     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6196     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6197     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6198
6199     state = 0xdeadbee;
6200     action = 0xdeadbee;
6201     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6202     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6203     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6204     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6205
6206     state = 0xdeadbee;
6207     action = 0xdeadbee;
6208     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6209     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6210     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6211     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6212
6213     state = 0xdeadbee;
6214     action = 0xdeadbee;
6215     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6216     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6217     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6218     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6219
6220     state = 0xdeadbee;
6221     action = 0xdeadbee;
6222     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6223     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6224     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6225     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6226
6227     state = 0xdeadbee;
6228     action = 0xdeadbee;
6229     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6230     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6231     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6232     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6233
6234     state = 0xdeadbee;
6235     action = 0xdeadbee;
6236     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6237     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6238     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6239     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6240
6241     state = 0xdeadbee;
6242     action = 0xdeadbee;
6243     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6244     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6245     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6246     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6247
6248     state = 0xdeadbee;
6249     action = 0xdeadbee;
6250     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6251     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6252     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6253     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6254
6255     state = 0xdeadbee;
6256     action = 0xdeadbee;
6257     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6258     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6259     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6260     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6261
6262     state = 0xdeadbee;
6263     action = 0xdeadbee;
6264     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6265     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6266     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6267     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6268
6269     state = 0xdeadbee;
6270     action = 0xdeadbee;
6271     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6272     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6273     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6274     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6275
6276     MsiCloseHandle(hpkg);
6277
6278     /* reinstall the product */
6279     r = MsiInstallProduct(msifile3, "REINSTALL=ALL");
6280     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6281
6282     r = MsiOpenDatabase(msifile4, MSIDBOPEN_DIRECT, &hdb);
6283     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
6284
6285     /* this property must not be in the saved msi file */
6286     r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'");
6287     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
6288
6289     hpkg = package_from_db( hdb );
6290     ok( hpkg, "failed to create package\n");
6291
6292     state = 0xdeadbee;
6293     action = 0xdeadbee;
6294     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6295     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6296     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6297     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6298
6299     state = 0xdeadbee;
6300     action = 0xdeadbee;
6301     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6302     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6303     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6304     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6305
6306     state = 0xdeadbee;
6307     action = 0xdeadbee;
6308     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6309     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6310     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6311     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6312
6313     state = 0xdeadbee;
6314     action = 0xdeadbee;
6315     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6316     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6317     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6318     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6319
6320     state = 0xdeadbee;
6321     action = 0xdeadbee;
6322     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6323     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6324     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6325     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6326
6327     state = 0xdeadbee;
6328     action = 0xdeadbee;
6329     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6330     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6331     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6332     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6333
6334     state = 0xdeadbee;
6335     action = 0xdeadbee;
6336     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6337     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6338     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6339     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6340
6341     state = 0xdeadbee;
6342     action = 0xdeadbee;
6343     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6344     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6345     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6346     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6347
6348     state = 0xdeadbee;
6349     action = 0xdeadbee;
6350     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6351     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6352     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6353     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6354
6355     state = 0xdeadbee;
6356     action = 0xdeadbee;
6357     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6358     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
6359     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6360     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6361
6362     state = 0xdeadbee;
6363     action = 0xdeadbee;
6364     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6365     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6366     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6367     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6368
6369     state = 0xdeadbee;
6370     action = 0xdeadbee;
6371     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6372     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6373     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6374     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6375
6376     state = 0xdeadbee;
6377     action = 0xdeadbee;
6378     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6379     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6380     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6381     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6382
6383     state = 0xdeadbee;
6384     action = 0xdeadbee;
6385     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6386     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6387     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6388     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6389
6390     state = 0xdeadbee;
6391     action = 0xdeadbee;
6392     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6393     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6394     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6395     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6396
6397     state = 0xdeadbee;
6398     action = 0xdeadbee;
6399     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6400     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6401     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6402     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6403
6404     state = 0xdeadbee;
6405     action = 0xdeadbee;
6406     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6407     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6408     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6409     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6410
6411     state = 0xdeadbee;
6412     action = 0xdeadbee;
6413     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6414     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6415     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6416     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6417
6418     state = 0xdeadbee;
6419     action = 0xdeadbee;
6420     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6421     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6422     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6423     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6424
6425     state = 0xdeadbee;
6426     action = 0xdeadbee;
6427     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6428     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6429     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6430     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6431
6432     state = 0xdeadbee;
6433     action = 0xdeadbee;
6434     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6435     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6436     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6437     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6438
6439     state = 0xdeadbee;
6440     action = 0xdeadbee;
6441     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6442     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6443     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6444     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6445
6446     state = 0xdeadbee;
6447     action = 0xdeadbee;
6448     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6449     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6450     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6451     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6452
6453     state = 0xdeadbee;
6454     action = 0xdeadbee;
6455     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6456     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6457     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6458     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6459
6460     state = 0xdeadbee;
6461     action = 0xdeadbee;
6462     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6463     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6464     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6465     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6466
6467     state = 0xdeadbee;
6468     action = 0xdeadbee;
6469     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6470     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6471     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6472     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6473
6474     state = 0xdeadbee;
6475     action = 0xdeadbee;
6476     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6477     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6478     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6479     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6480
6481     state = 0xdeadbee;
6482     action = 0xdeadbee;
6483     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6484     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6485     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6486     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6487
6488     state = 0xdeadbee;
6489     action = 0xdeadbee;
6490     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6491     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6492     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6493     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6494
6495     state = 0xdeadbee;
6496     action = 0xdeadbee;
6497     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6498     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6499     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6500     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6501
6502     state = 0xdeadbee;
6503     action = 0xdeadbee;
6504     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6505     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
6506     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
6507     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
6508
6509     r = MsiDoAction( hpkg, "CostInitialize");
6510     ok( r == ERROR_SUCCESS, "cost init failed\n");
6511
6512     state = 0xdeadbee;
6513     action = 0xdeadbee;
6514     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6515     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6516     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6517     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6518
6519     state = 0xdeadbee;
6520     action = 0xdeadbee;
6521     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6522     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6523     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6524     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6525
6526     state = 0xdeadbee;
6527     action = 0xdeadbee;
6528     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6529     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6530     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6531     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6532
6533     state = 0xdeadbee;
6534     action = 0xdeadbee;
6535     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6536     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6537     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6538     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6539
6540     state = 0xdeadbee;
6541     action = 0xdeadbee;
6542     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6543     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6544     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6545     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6546
6547     state = 0xdeadbee;
6548     action = 0xdeadbee;
6549     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6550     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6551     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6552     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6553
6554     state = 0xdeadbee;
6555     action = 0xdeadbee;
6556     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6557     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6558     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6559     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6560
6561     state = 0xdeadbee;
6562     action = 0xdeadbee;
6563     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6564     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6565     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6566     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6567
6568     state = 0xdeadbee;
6569     action = 0xdeadbee;
6570     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6571     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6572     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6573     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6574
6575     state = 0xdeadbee;
6576     action = 0xdeadbee;
6577     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6578     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6579     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6580     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6581
6582     state = 0xdeadbee;
6583     action = 0xdeadbee;
6584     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6585     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6586     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6587     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6588
6589     state = 0xdeadbee;
6590     action = 0xdeadbee;
6591     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6592     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6593     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6594     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6595
6596     state = 0xdeadbee;
6597     action = 0xdeadbee;
6598     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6599     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6600     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6601     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6602
6603     state = 0xdeadbee;
6604     action = 0xdeadbee;
6605     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6606     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6607     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6608     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6609
6610     state = 0xdeadbee;
6611     action = 0xdeadbee;
6612     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6613     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6614     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6615     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6616
6617     state = 0xdeadbee;
6618     action = 0xdeadbee;
6619     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6620     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6621     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6622     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6623
6624     state = 0xdeadbee;
6625     action = 0xdeadbee;
6626     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6627     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6628     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6629     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6630
6631     state = 0xdeadbee;
6632     action = 0xdeadbee;
6633     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6634     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6635     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6636     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6637
6638     state = 0xdeadbee;
6639     action = 0xdeadbee;
6640     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6641     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6642     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6643     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6644
6645     state = 0xdeadbee;
6646     action = 0xdeadbee;
6647     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6648     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6649     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6650     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6651
6652     state = 0xdeadbee;
6653     action = 0xdeadbee;
6654     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6655     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6656     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6657     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6658
6659     state = 0xdeadbee;
6660     action = 0xdeadbee;
6661     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6662     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6663     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6664     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6665
6666     state = 0xdeadbee;
6667     action = 0xdeadbee;
6668     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6669     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6670     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6671     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6672
6673     state = 0xdeadbee;
6674     action = 0xdeadbee;
6675     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6676     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6677     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6678     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6679
6680     state = 0xdeadbee;
6681     action = 0xdeadbee;
6682     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6683     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6684     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6685     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6686
6687     state = 0xdeadbee;
6688     action = 0xdeadbee;
6689     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6690     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6691     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6692     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6693
6694     state = 0xdeadbee;
6695     action = 0xdeadbee;
6696     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6697     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6698     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6699     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6700
6701     state = 0xdeadbee;
6702     action = 0xdeadbee;
6703     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6704     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6705     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6706     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6707
6708     state = 0xdeadbee;
6709     action = 0xdeadbee;
6710     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6711     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6712     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6713     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6714
6715     state = 0xdeadbee;
6716     action = 0xdeadbee;
6717     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6718     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6719     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6720     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6721
6722     state = 0xdeadbee;
6723     action = 0xdeadbee;
6724     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6725     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6726     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6727     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6728
6729     r = MsiDoAction( hpkg, "FileCost");
6730     ok( r == ERROR_SUCCESS, "file cost failed\n");
6731
6732     state = 0xdeadbee;
6733     action = 0xdeadbee;
6734     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6735     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6736     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6737     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6738
6739     state = 0xdeadbee;
6740     action = 0xdeadbee;
6741     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6742     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6743     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6744     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6745
6746     state = 0xdeadbee;
6747     action = 0xdeadbee;
6748     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6749     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6750     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6751     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6752
6753     state = 0xdeadbee;
6754     action = 0xdeadbee;
6755     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6756     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6757     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6758     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6759
6760     state = 0xdeadbee;
6761     action = 0xdeadbee;
6762     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6763     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6764     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6765     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6766
6767     state = 0xdeadbee;
6768     action = 0xdeadbee;
6769     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6770     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6771     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6772     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6773
6774     state = 0xdeadbee;
6775     action = 0xdeadbee;
6776     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6777     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6778     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6779     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6780
6781     state = 0xdeadbee;
6782     action = 0xdeadbee;
6783     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
6784     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6785     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6786     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6787
6788     state = 0xdeadbee;
6789     action = 0xdeadbee;
6790     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
6791     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6792     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6793     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6794
6795     state = 0xdeadbee;
6796     action = 0xdeadbee;
6797     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
6798     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6799     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6800     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6801
6802     state = 0xdeadbee;
6803     action = 0xdeadbee;
6804     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
6805     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6806     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6807     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6808
6809     state = 0xdeadbee;
6810     action = 0xdeadbee;
6811     r = MsiGetComponentState(hpkg, "beta", &state, &action);
6812     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6813     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6814     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6815
6816     state = 0xdeadbee;
6817     action = 0xdeadbee;
6818     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
6819     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6820     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6821     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6822
6823     state = 0xdeadbee;
6824     action = 0xdeadbee;
6825     r = MsiGetComponentState(hpkg, "theta", &state, &action);
6826     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6827     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6828     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6829
6830     state = 0xdeadbee;
6831     action = 0xdeadbee;
6832     r = MsiGetComponentState(hpkg, "delta", &state, &action);
6833     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6834     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6835     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6836
6837     state = 0xdeadbee;
6838     action = 0xdeadbee;
6839     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
6840     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6841     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6842     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6843
6844     state = 0xdeadbee;
6845     action = 0xdeadbee;
6846     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
6847     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6848     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6849     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6850
6851     state = 0xdeadbee;
6852     action = 0xdeadbee;
6853     r = MsiGetComponentState(hpkg, "iota", &state, &action);
6854     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6855     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6856     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6857
6858     state = 0xdeadbee;
6859     action = 0xdeadbee;
6860     r = MsiGetComponentState(hpkg, "eta", &state, &action);
6861     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6862     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6863     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6864
6865     state = 0xdeadbee;
6866     action = 0xdeadbee;
6867     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
6868     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6869     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6870     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6871
6872     state = 0xdeadbee;
6873     action = 0xdeadbee;
6874     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
6875     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6876     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6877     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6878
6879     state = 0xdeadbee;
6880     action = 0xdeadbee;
6881     r = MsiGetComponentState(hpkg, "mu", &state, &action);
6882     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6883     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6884     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6885
6886     state = 0xdeadbee;
6887     action = 0xdeadbee;
6888     r = MsiGetComponentState(hpkg, "nu", &state, &action);
6889     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6890     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6891     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6892
6893     state = 0xdeadbee;
6894     action = 0xdeadbee;
6895     r = MsiGetComponentState(hpkg, "xi", &state, &action);
6896     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6897     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6898     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6899
6900     state = 0xdeadbee;
6901     action = 0xdeadbee;
6902     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
6903     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6904     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6905     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6906
6907     state = 0xdeadbee;
6908     action = 0xdeadbee;
6909     r = MsiGetComponentState(hpkg, "pi", &state, &action);
6910     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6911     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6912     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6913
6914     state = 0xdeadbee;
6915     action = 0xdeadbee;
6916     r = MsiGetComponentState(hpkg, "rho", &state, &action);
6917     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6918     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6919     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6920
6921     state = 0xdeadbee;
6922     action = 0xdeadbee;
6923     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
6924     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6925     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6926     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6927
6928     state = 0xdeadbee;
6929     action = 0xdeadbee;
6930     r = MsiGetComponentState(hpkg, "tau", &state, &action);
6931     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6932     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6933     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6934
6935     state = 0xdeadbee;
6936     action = 0xdeadbee;
6937     r = MsiGetComponentState(hpkg, "phi", &state, &action);
6938     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6939     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6940     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6941
6942     state = 0xdeadbee;
6943     action = 0xdeadbee;
6944     r = MsiGetComponentState(hpkg, "chi", &state, &action);
6945     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6946     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
6947     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6948
6949     r = MsiDoAction( hpkg, "CostFinalize");
6950     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
6951
6952     state = 0xdeadbee;
6953     action = 0xdeadbee;
6954     r = MsiGetFeatureState(hpkg, "one", &state, &action);
6955     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6956     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6957     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6958
6959     state = 0xdeadbee;
6960     action = 0xdeadbee;
6961     r = MsiGetFeatureState(hpkg, "two", &state, &action);
6962     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6963     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6964     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6965
6966     state = 0xdeadbee;
6967     action = 0xdeadbee;
6968     r = MsiGetFeatureState(hpkg, "three", &state, &action);
6969     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6970     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6971     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6972
6973     state = 0xdeadbee;
6974     action = 0xdeadbee;
6975     r = MsiGetFeatureState(hpkg, "four", &state, &action);
6976     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6977     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
6978     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
6979
6980     state = 0xdeadbee;
6981     action = 0xdeadbee;
6982     r = MsiGetFeatureState(hpkg, "five", &state, &action);
6983     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6984     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
6985     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
6986
6987     state = 0xdeadbee;
6988     action = 0xdeadbee;
6989     r = MsiGetFeatureState(hpkg, "six", &state, &action);
6990     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6991     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6992     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
6993
6994     state = 0xdeadbee;
6995     action = 0xdeadbee;
6996     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
6997     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
6998     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
6999     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
7000
7001     state = 0xdeadbee;
7002     action = 0xdeadbee;
7003     r = MsiGetFeatureState(hpkg, "eight", &state, &action);
7004     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7005     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7006     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
7007
7008     state = 0xdeadbee;
7009     action = 0xdeadbee;
7010     r = MsiGetFeatureState(hpkg, "nine", &state, &action);
7011     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7012     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7013     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
7014
7015     state = 0xdeadbee;
7016     action = 0xdeadbee;
7017     r = MsiGetFeatureState(hpkg, "ten", &state, &action);
7018     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7019     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7020     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
7021
7022     state = 0xdeadbee;
7023     action = 0xdeadbee;
7024     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
7025     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7026     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7027     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7028
7029     state = 0xdeadbee;
7030     action = 0xdeadbee;
7031     r = MsiGetComponentState(hpkg, "beta", &state, &action);
7032     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7033     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7034     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7035
7036     state = 0xdeadbee;
7037     action = 0xdeadbee;
7038     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
7039     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7040     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7041     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7042
7043     state = 0xdeadbee;
7044     action = 0xdeadbee;
7045     r = MsiGetComponentState(hpkg, "theta", &state, &action);
7046     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7047     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7048     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7049
7050     state = 0xdeadbee;
7051     action = 0xdeadbee;
7052     r = MsiGetComponentState(hpkg, "delta", &state, &action);
7053     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7054     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7055     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7056
7057     state = 0xdeadbee;
7058     action = 0xdeadbee;
7059     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
7060     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7061     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7062     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7063
7064     state = 0xdeadbee;
7065     action = 0xdeadbee;
7066     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
7067     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7068     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7069     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7070
7071     state = 0xdeadbee;
7072     action = 0xdeadbee;
7073     r = MsiGetComponentState(hpkg, "iota", &state, &action);
7074     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7075     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7076     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7077
7078     state = 0xdeadbee;
7079     action = 0xdeadbee;
7080     r = MsiGetComponentState(hpkg, "eta", &state, &action);
7081     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7082     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7083     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7084
7085     state = 0xdeadbee;
7086     action = 0xdeadbee;
7087     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
7088     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7089     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7090     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7091
7092     state = 0xdeadbee;
7093     action = 0xdeadbee;
7094     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
7095     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7096     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7097     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7098
7099     state = 0xdeadbee;
7100     action = 0xdeadbee;
7101     r = MsiGetComponentState(hpkg, "mu", &state, &action);
7102     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7103     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7104     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7105
7106     state = 0xdeadbee;
7107     action = 0xdeadbee;
7108     r = MsiGetComponentState(hpkg, "nu", &state, &action);
7109     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7110     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7111     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7112
7113     state = 0xdeadbee;
7114     action = 0xdeadbee;
7115     r = MsiGetComponentState(hpkg, "xi", &state, &action);
7116     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7117     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7118     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7119
7120     state = 0xdeadbee;
7121     action = 0xdeadbee;
7122     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
7123     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7124     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7125     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7126
7127     state = 0xdeadbee;
7128     action = 0xdeadbee;
7129     r = MsiGetComponentState(hpkg, "pi", &state, &action);
7130     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7131     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7132     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7133
7134     state = 0xdeadbee;
7135     action = 0xdeadbee;
7136     r = MsiGetComponentState(hpkg, "rho", &state, &action);
7137     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7138     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7139     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7140
7141     state = 0xdeadbee;
7142     action = 0xdeadbee;
7143     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
7144     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7145     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7146     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
7147
7148     state = 0xdeadbee;
7149     action = 0xdeadbee;
7150     r = MsiGetComponentState(hpkg, "tau", &state, &action);
7151     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7152     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7153     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7154
7155     state = 0xdeadbee;
7156     action = 0xdeadbee;
7157     r = MsiGetComponentState(hpkg, "phi", &state, &action);
7158     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7159     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7160     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7161
7162     state = 0xdeadbee;
7163     action = 0xdeadbee;
7164     r = MsiGetComponentState(hpkg, "chi", &state, &action);
7165     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7166     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7167     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
7168
7169     MsiCloseHandle(hpkg);
7170
7171     /* uninstall the product */
7172     r = MsiInstallProduct(msifile4, "REMOVE=ALL");
7173     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7174
7175     DeleteFileA(msifile);
7176     DeleteFileA(msifile2);
7177     DeleteFileA(msifile3);
7178     DeleteFileA(msifile4);
7179 }
7180
7181 static void test_getproperty(void)
7182 {
7183     MSIHANDLE hPackage = 0;
7184     char prop[100];
7185     static CHAR empty[] = "";
7186     DWORD size;
7187     UINT r;
7188
7189     hPackage = package_from_db(create_package_db());
7190     ok( hPackage != 0, " Failed to create package\n");
7191
7192     /* set the property */
7193     r = MsiSetProperty(hPackage, "Name", "Value");
7194     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7195
7196     /* retrieve the size, NULL pointer */
7197     size = 0;
7198     r = MsiGetProperty(hPackage, "Name", NULL, &size);
7199     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7200     ok( size == 5, "Expected 5, got %d\n", size);
7201
7202     /* retrieve the size, empty string */
7203     size = 0;
7204     r = MsiGetProperty(hPackage, "Name", empty, &size);
7205     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
7206     ok( size == 5, "Expected 5, got %d\n", size);
7207
7208     /* don't change size */
7209     r = MsiGetProperty(hPackage, "Name", prop, &size);
7210     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
7211     ok( size == 5, "Expected 5, got %d\n", size);
7212     ok( !lstrcmp(prop, "Valu"), "Expected Valu, got %s\n", prop);
7213
7214     /* increase the size by 1 */
7215     size++;
7216     r = MsiGetProperty(hPackage, "Name", prop, &size);
7217     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7218     ok( size == 5, "Expected 5, got %d\n", size);
7219     ok( !lstrcmp(prop, "Value"), "Expected Value, got %s\n", prop);
7220
7221     r = MsiCloseHandle( hPackage);
7222     ok( r == ERROR_SUCCESS , "Failed to close package\n" );
7223     DeleteFile(msifile);
7224 }
7225
7226 static void test_removefiles(void)
7227 {
7228     MSIHANDLE hpkg;
7229     UINT r;
7230     MSIHANDLE hdb;
7231
7232     hdb = create_package_db();
7233     ok ( hdb, "failed to create package database\n" );
7234
7235     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
7236     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
7237
7238     r = create_feature_table( hdb );
7239     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
7240
7241     r = create_component_table( hdb );
7242     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
7243
7244     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
7245     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7246
7247     r = add_component_entry( hdb, "'hydrogen', '', 'TARGETDIR', 0, '', 'hydrogen_file'" );
7248     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7249
7250     r = add_component_entry( hdb, "'helium', '', 'TARGETDIR', 0, '', 'helium_file'" );
7251     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7252
7253     r = add_component_entry( hdb, "'lithium', '', 'TARGETDIR', 0, '', 'lithium_file'" );
7254     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7255
7256     r = add_component_entry( hdb, "'beryllium', '', 'TARGETDIR', 0, '', 'beryllium_file'" );
7257     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7258
7259     r = add_component_entry( hdb, "'boron', '', 'TARGETDIR', 0, '', 'boron_file'" );
7260     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7261
7262     r = add_component_entry( hdb, "'carbon', '', 'TARGETDIR', 0, '', 'carbon_file'" );
7263     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7264
7265     r = create_feature_components_table( hdb );
7266     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
7267
7268     r = add_feature_components_entry( hdb, "'one', 'hydrogen'" );
7269     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7270
7271     r = add_feature_components_entry( hdb, "'one', 'helium'" );
7272     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7273
7274     r = add_feature_components_entry( hdb, "'one', 'lithium'" );
7275     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7276
7277     r = add_feature_components_entry( hdb, "'one', 'beryllium'" );
7278     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7279
7280     r = add_feature_components_entry( hdb, "'one', 'boron'" );
7281     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7282
7283     r = add_feature_components_entry( hdb, "'one', 'carbon'" );
7284     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7285
7286     r = create_file_table( hdb );
7287     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
7288
7289     r = add_file_entry( hdb, "'hydrogen_file', 'hydrogen', 'hydrogen.txt', 0, '', '1033', 8192, 1" );
7290     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7291
7292     r = add_file_entry( hdb, "'helium_file', 'helium', 'helium.txt', 0, '', '1033', 8192, 1" );
7293     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7294
7295     r = add_file_entry( hdb, "'lithium_file', 'lithium', 'lithium.txt', 0, '', '1033', 8192, 1" );
7296     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7297
7298     r = add_file_entry( hdb, "'beryllium_file', 'beryllium', 'beryllium.txt', 0, '', '1033', 16384, 1" );
7299     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7300
7301     r = add_file_entry( hdb, "'boron_file', 'boron', 'boron.txt', 0, '', '1033', 16384, 1" );
7302     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7303
7304     r = add_file_entry( hdb, "'carbon_file', 'carbon', 'carbon.txt', 0, '', '1033', 16384, 1" );
7305     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7306
7307     r = create_remove_file_table( hdb );
7308     ok( r == ERROR_SUCCESS, "cannot create Remove File table: %d\n", r);
7309
7310     hpkg = package_from_db( hdb );
7311     ok( hpkg, "failed to create package\n");
7312
7313     MsiCloseHandle( hdb );
7314
7315     create_test_file( "hydrogen.txt" );
7316     create_test_file( "helium.txt" );
7317     create_test_file( "lithium.txt" );
7318     create_test_file( "beryllium.txt" );
7319     create_test_file( "boron.txt" );
7320     create_test_file( "carbon.txt" );
7321
7322     r = MsiSetProperty( hpkg, "TARGETDIR", CURR_DIR );
7323     ok( r == ERROR_SUCCESS, "set property failed\n");
7324
7325     r = MsiDoAction( hpkg, "CostInitialize");
7326     ok( r == ERROR_SUCCESS, "cost init failed\n");
7327
7328     r = MsiDoAction( hpkg, "FileCost");
7329     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7330
7331     r = MsiDoAction( hpkg, "CostFinalize");
7332     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7333
7334     r = MsiDoAction( hpkg, "InstallValidate");
7335     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7336
7337     r = MsiSetComponentState( hpkg, "hydrogen", INSTALLSTATE_ABSENT );
7338     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7339
7340     r = MsiSetComponentState( hpkg, "helium", INSTALLSTATE_LOCAL );
7341     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7342
7343     r = MsiSetComponentState( hpkg, "lithium", INSTALLSTATE_SOURCE );
7344     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7345
7346     r = MsiSetComponentState( hpkg, "beryllium", INSTALLSTATE_ABSENT );
7347     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7348
7349     r = MsiSetComponentState( hpkg, "boron", INSTALLSTATE_LOCAL );
7350     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7351
7352     r = MsiSetComponentState( hpkg, "carbon", INSTALLSTATE_SOURCE );
7353     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
7354
7355     r = MsiDoAction( hpkg, "RemoveFiles");
7356     ok( r == ERROR_SUCCESS, "remove files failed\n");
7357
7358     ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
7359     ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");    
7360     ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
7361     ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
7362     ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n");
7363     ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n");
7364
7365     MsiCloseHandle( hpkg );
7366     DeleteFileA(msifile);
7367 }
7368
7369 static void test_appsearch(void)
7370 {
7371     MSIHANDLE hpkg;
7372     UINT r;
7373     MSIHANDLE hdb;
7374     CHAR prop[MAX_PATH];
7375     DWORD size = MAX_PATH;
7376
7377     hdb = create_package_db();
7378     ok ( hdb, "failed to create package database\n" );
7379
7380     r = create_appsearch_table( hdb );
7381     ok( r == ERROR_SUCCESS, "cannot create AppSearch table: %d\n", r );
7382
7383     r = add_appsearch_entry( hdb, "'WEBBROWSERPROG', 'NewSignature1'" );
7384     ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r );
7385
7386     r = create_reglocator_table( hdb );
7387     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
7388
7389     r = add_reglocator_entry( hdb, "'NewSignature1', 0, 'htmlfile\\shell\\open\\command', '', 1" );
7390     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
7391
7392     r = create_signature_table( hdb );
7393     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
7394
7395     r = add_signature_entry( hdb, "'NewSignature1', 'FileName', '', '', '', '', '', '', ''" );
7396     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
7397
7398     hpkg = package_from_db( hdb );
7399     ok( hpkg, "failed to create package\n");
7400
7401     MsiCloseHandle( hdb );
7402
7403     r = MsiDoAction( hpkg, "AppSearch" );
7404     ok( r == ERROR_SUCCESS, "AppSearch failed: %d\n", r);
7405
7406     r = MsiGetPropertyA( hpkg, "WEBBROWSERPROG", prop, &size );
7407     ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
7408     todo_wine
7409     {
7410         ok( lstrlenA(prop) != 0, "Expected non-zero length\n");
7411     }
7412
7413     MsiCloseHandle( hpkg );
7414     DeleteFileA(msifile);
7415 }
7416
7417 static void test_appsearch_complocator(void)
7418 {
7419     MSIHANDLE hpkg, hdb;
7420     CHAR path[MAX_PATH];
7421     CHAR prop[MAX_PATH];
7422     LPSTR usersid;
7423     DWORD size;
7424     UINT r;
7425
7426     if (!get_user_sid(&usersid))
7427         return;
7428
7429     create_test_file("FileName1");
7430     create_test_file("FileName4");
7431     set_component_path("FileName1", MSIINSTALLCONTEXT_MACHINE,
7432                        "{A8AE6692-96BA-4198-8399-145D7D1D0D0E}", NULL, FALSE);
7433
7434     create_test_file("FileName2");
7435     set_component_path("FileName2", MSIINSTALLCONTEXT_USERUNMANAGED,
7436                        "{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}", usersid, FALSE);
7437
7438     create_test_file("FileName3");
7439     set_component_path("FileName3", MSIINSTALLCONTEXT_USERMANAGED,
7440                        "{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}", usersid, FALSE);
7441
7442     create_test_file("FileName5");
7443     set_component_path("FileName5", MSIINSTALLCONTEXT_MACHINE,
7444                        "{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}", NULL, TRUE);
7445
7446     create_test_file("FileName6");
7447     set_component_path("FileName6", MSIINSTALLCONTEXT_MACHINE,
7448                        "{C0ECD96F-7898-4410-9667-194BD8C1B648}", NULL, TRUE);
7449
7450     create_test_file("FileName7");
7451     set_component_path("FileName7", MSIINSTALLCONTEXT_MACHINE,
7452                        "{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}", NULL, FALSE);
7453
7454     /* dir is FALSE, but we're pretending it's a directory */
7455     set_component_path("IDontExist\\", MSIINSTALLCONTEXT_MACHINE,
7456                        "{91B7359B-07F2-4221-AA8D-DE102BB87A5F}", NULL, FALSE);
7457
7458     create_file_with_version("FileName8.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7459     set_component_path("FileName8.dll", MSIINSTALLCONTEXT_MACHINE,
7460                        "{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}", NULL, FALSE);
7461
7462     create_file_with_version("FileName9.dll", MAKELONG(1, 2), MAKELONG(3, 4));
7463     set_component_path("FileName9.dll", MSIINSTALLCONTEXT_MACHINE,
7464                        "{A204DF48-7346-4635-BA2E-66247DBAC9DF}", NULL, FALSE);
7465
7466     create_file_with_version("FileName10.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7467     set_component_path("FileName10.dll", MSIINSTALLCONTEXT_MACHINE,
7468                        "{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}", NULL, FALSE);
7469
7470     hdb = create_package_db();
7471     ok(hdb, "Expected a valid database handle\n");
7472
7473     r = create_appsearch_table(hdb);
7474     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7475
7476     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
7477     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7478
7479     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
7480     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7481
7482     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
7483     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7484
7485     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
7486     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7487
7488     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
7489     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7490
7491     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
7492     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7493
7494     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
7495     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7496
7497     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
7498     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7499
7500     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
7501     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7502
7503     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
7504     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7505
7506     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
7507     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7508
7509     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
7510     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7511
7512     r = create_complocator_table(hdb);
7513     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7514
7515     /* published component, machine, file, signature, misdbLocatorTypeFile */
7516     r = add_complocator_entry(hdb, "'NewSignature1', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 1");
7517     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7518
7519     /* published component, user-unmanaged, file, signature, misdbLocatorTypeFile */
7520     r = add_complocator_entry(hdb, "'NewSignature2', '{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}', 1");
7521     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7522
7523     /* published component, user-managed, file, signature, misdbLocatorTypeFile */
7524     r = add_complocator_entry(hdb, "'NewSignature3', '{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}', 1");
7525     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7526
7527     /* published component, machine, file, signature, misdbLocatorTypeDirectory */
7528     r = add_complocator_entry(hdb, "'NewSignature4', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 0");
7529     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7530
7531     /* published component, machine, dir, signature, misdbLocatorTypeDirectory */
7532     r = add_complocator_entry(hdb, "'NewSignature5', '{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}', 0");
7533     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7534
7535     /* published component, machine, dir, no signature, misdbLocatorTypeDirectory */
7536     r = add_complocator_entry(hdb, "'NewSignature6', '{C0ECD96F-7898-4410-9667-194BD8C1B648}', 0");
7537     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7538
7539     /* published component, machine, file, no signature, misdbLocatorTypeFile */
7540     r = add_complocator_entry(hdb, "'NewSignature7', '{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}', 1");
7541     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7542
7543     /* unpublished component, no signature, misdbLocatorTypeDir */
7544     r = add_complocator_entry(hdb, "'NewSignature8', '{FB671D5B-5083-4048-90E0-481C48D8F3A5}', 0");
7545     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7546
7547     /* published component, no signature, dir does not exist misdbLocatorTypeDir */
7548     r = add_complocator_entry(hdb, "'NewSignature9', '{91B7359B-07F2-4221-AA8D-DE102BB87A5F}', 0");
7549     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7550
7551     /* published component, signature w/ ver, misdbLocatorTypeFile */
7552     r = add_complocator_entry(hdb, "'NewSignature10', '{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}', 1");
7553     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7554
7555     /* published component, signature w/ ver, ver > max, misdbLocatorTypeFile */
7556     r = add_complocator_entry(hdb, "'NewSignature11', '{A204DF48-7346-4635-BA2E-66247DBAC9DF}', 1");
7557     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7558
7559     /* published component, signature w/ ver, sig->name ignored, misdbLocatorTypeFile */
7560     r = add_complocator_entry(hdb, "'NewSignature12', '{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}', 1");
7561     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7562
7563     r = create_signature_table(hdb);
7564     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7565
7566     r = add_signature_entry(hdb, "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''");
7567     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7568
7569     r = add_signature_entry(hdb, "'NewSignature2', 'FileName2', '', '', '', '', '', '', ''");
7570     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7571
7572     r = add_signature_entry(hdb, "'NewSignature3', 'FileName3', '', '', '', '', '', '', ''");
7573     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7574
7575     r = add_signature_entry(hdb, "'NewSignature4', 'FileName4', '', '', '', '', '', '', ''");
7576     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7577
7578     r = add_signature_entry(hdb, "'NewSignature5', 'FileName5', '', '', '', '', '', '', ''");
7579     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7580
7581     r = add_signature_entry(hdb, "'NewSignature10', 'FileName8.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7582     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7583
7584     r = add_signature_entry(hdb, "'NewSignature11', 'FileName9.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7585     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7586
7587     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
7588     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7589
7590     hpkg = package_from_db(hdb);
7591     ok(hpkg, "Expected a valid package handle\n");
7592
7593     r = MsiSetPropertyA(hpkg, "SIGPROP8", "october");
7594     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7595
7596     r = MsiDoAction(hpkg, "AppSearch");
7597     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7598
7599     size = MAX_PATH;
7600     sprintf(path, "%s\\FileName1", CURR_DIR);
7601     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
7602     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7603     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7604
7605     size = MAX_PATH;
7606     sprintf(path, "%s\\FileName2", CURR_DIR);
7607     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
7608     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7609     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7610
7611     size = MAX_PATH;
7612     sprintf(path, "%s\\FileName3", CURR_DIR);
7613     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
7614     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7615     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7616
7617     size = MAX_PATH;
7618     sprintf(path, "%s\\FileName4", CURR_DIR);
7619     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
7620     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7621     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7622
7623     size = MAX_PATH;
7624     sprintf(path, "%s\\FileName5", CURR_DIR);
7625     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
7626     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7627     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7628
7629     size = MAX_PATH;
7630     sprintf(path, "%s\\", CURR_DIR);
7631     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
7632     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7633     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7634
7635     size = MAX_PATH;
7636     sprintf(path, "%s\\", CURR_DIR);
7637     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
7638     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7639     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7640
7641     size = MAX_PATH;
7642     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
7643     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7644     ok(!lstrcmpA(prop, "october"), "Expected \"october\", got \"%s\"\n", prop);
7645
7646     size = MAX_PATH;
7647     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
7648     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7649     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7650
7651     size = MAX_PATH;
7652     sprintf(path, "%s\\FileName8.dll", CURR_DIR);
7653     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
7654     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7655     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7656
7657     size = MAX_PATH;
7658     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
7659     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7660     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7661
7662     size = MAX_PATH;
7663     sprintf(path, "%s\\FileName10.dll", CURR_DIR);
7664     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
7665     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7666     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7667
7668     delete_component_path("{A8AE6692-96BA-4198-8399-145D7D1D0D0E}",
7669                           MSIINSTALLCONTEXT_MACHINE, NULL);
7670     delete_component_path("{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}",
7671                           MSIINSTALLCONTEXT_USERUNMANAGED, usersid);
7672     delete_component_path("{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}",
7673                           MSIINSTALLCONTEXT_USERMANAGED, usersid);
7674     delete_component_path("{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}",
7675                           MSIINSTALLCONTEXT_MACHINE, NULL);
7676     delete_component_path("{C0ECD96F-7898-4410-9667-194BD8C1B648}",
7677                           MSIINSTALLCONTEXT_MACHINE, NULL);
7678     delete_component_path("{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}",
7679                           MSIINSTALLCONTEXT_MACHINE, NULL);
7680     delete_component_path("{91B7359B-07F2-4221-AA8D-DE102BB87A5F}",
7681                           MSIINSTALLCONTEXT_MACHINE, NULL);
7682     delete_component_path("{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}",
7683                           MSIINSTALLCONTEXT_MACHINE, NULL);
7684     delete_component_path("{A204DF48-7346-4635-BA2E-66247DBAC9DF}",
7685                           MSIINSTALLCONTEXT_MACHINE, NULL);
7686     delete_component_path("{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}",
7687                           MSIINSTALLCONTEXT_MACHINE, NULL);
7688
7689     DeleteFileA("FileName1");
7690     DeleteFileA("FileName2");
7691     DeleteFileA("FileName3");
7692     DeleteFileA("FileName4");
7693     DeleteFileA("FileName5");
7694     DeleteFileA("FileName6");
7695     DeleteFileA("FileName7");
7696     DeleteFileA("FileName8.dll");
7697     DeleteFileA("FileName9.dll");
7698     DeleteFileA("FileName10.dll");
7699     MsiCloseHandle(hpkg);
7700     DeleteFileA(msifile);
7701     LocalFree(usersid);
7702 }
7703
7704 static void test_appsearch_reglocator(void)
7705 {
7706     MSIHANDLE hpkg, hdb;
7707     CHAR path[MAX_PATH];
7708     CHAR prop[MAX_PATH];
7709     DWORD binary[2];
7710     DWORD size, val;
7711     BOOL space, version;
7712     HKEY hklm, classes;
7713     HKEY hkcu, users;
7714     LPSTR pathdata;
7715     LPSTR pathvar;
7716     LPCSTR str;
7717     LPSTR ptr;
7718     LONG res;
7719     UINT r;
7720
7721     version = TRUE;
7722     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
7723         version = FALSE;
7724
7725     DeleteFileA("test.dll");
7726
7727     res = RegCreateKeyA(HKEY_CLASSES_ROOT, "Software\\Wine", &classes);
7728     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7729
7730     res = RegSetValueExA(classes, "Value1", 0, REG_SZ,
7731                          (const BYTE *)"regszdata", 10);
7732     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7733
7734     res = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine", &hkcu);
7735     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7736
7737     res = RegSetValueExA(hkcu, "Value1", 0, REG_SZ,
7738                          (const BYTE *)"regszdata", 10);
7739     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7740
7741     users = 0;
7742     res = RegCreateKeyA(HKEY_USERS, "S-1-5-18\\Software\\Wine", &users);
7743     ok(res == ERROR_SUCCESS ||
7744        broken(res == ERROR_INVALID_PARAMETER),
7745        "Expected ERROR_SUCCESS, got %d\n", res);
7746
7747     if (res == ERROR_SUCCESS)
7748     {
7749         res = RegSetValueExA(users, "Value1", 0, REG_SZ,
7750                              (const BYTE *)"regszdata", 10);
7751         ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7752     }
7753
7754     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine", &hklm);
7755     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7756
7757     res = RegSetValueA(hklm, NULL, REG_SZ, "defvalue", 8);
7758     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7759
7760     res = RegSetValueExA(hklm, "Value1", 0, REG_SZ,
7761                          (const BYTE *)"regszdata", 10);
7762     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7763
7764     val = 42;
7765     res = RegSetValueExA(hklm, "Value2", 0, REG_DWORD,
7766                          (const BYTE *)&val, sizeof(DWORD));
7767     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7768
7769     val = -42;
7770     res = RegSetValueExA(hklm, "Value3", 0, REG_DWORD,
7771                          (const BYTE *)&val, sizeof(DWORD));
7772     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7773
7774     res = RegSetValueExA(hklm, "Value4", 0, REG_EXPAND_SZ,
7775                          (const BYTE *)"%PATH%", 7);
7776     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7777
7778     res = RegSetValueExA(hklm, "Value5", 0, REG_EXPAND_SZ,
7779                          (const BYTE *)"my%NOVAR%", 10);
7780     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7781
7782     res = RegSetValueExA(hklm, "Value6", 0, REG_MULTI_SZ,
7783                          (const BYTE *)"one\0two\0", 9);
7784     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7785
7786     binary[0] = 0x1234abcd;
7787     binary[1] = 0x567890ef;
7788     res = RegSetValueExA(hklm, "Value7", 0, REG_BINARY,
7789                          (const BYTE *)binary, sizeof(binary));
7790     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7791
7792     res = RegSetValueExA(hklm, "Value8", 0, REG_SZ,
7793                          (const BYTE *)"#regszdata", 11);
7794     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7795
7796     create_test_file("FileName1");
7797     sprintf(path, "%s\\FileName1", CURR_DIR);
7798     res = RegSetValueExA(hklm, "Value9", 0, REG_SZ,
7799                          (const BYTE *)path, lstrlenA(path) + 1);
7800     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7801
7802     sprintf(path, "%s\\FileName2", CURR_DIR);
7803     res = RegSetValueExA(hklm, "Value10", 0, REG_SZ,
7804                          (const BYTE *)path, lstrlenA(path) + 1);
7805     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7806
7807     lstrcpyA(path, CURR_DIR);
7808     res = RegSetValueExA(hklm, "Value11", 0, REG_SZ,
7809                          (const BYTE *)path, lstrlenA(path) + 1);
7810     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7811
7812     res = RegSetValueExA(hklm, "Value12", 0, REG_SZ,
7813                          (const BYTE *)"", 1);
7814     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7815
7816     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7817     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
7818     res = RegSetValueExA(hklm, "Value13", 0, REG_SZ,
7819                          (const BYTE *)path, lstrlenA(path) + 1);
7820     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7821
7822     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
7823     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
7824     res = RegSetValueExA(hklm, "Value14", 0, REG_SZ,
7825                          (const BYTE *)path, lstrlenA(path) + 1);
7826     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7827
7828     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7829     sprintf(path, "%s\\FileName5.dll", CURR_DIR);
7830     res = RegSetValueExA(hklm, "Value15", 0, REG_SZ,
7831                          (const BYTE *)path, lstrlenA(path) + 1);
7832     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
7833
7834     sprintf(path, "\"%s\\FileName1\" -option", CURR_DIR);
7835     res = RegSetValueExA(hklm, "value16", 0, REG_SZ,
7836                          (const BYTE *)path, lstrlenA(path) + 1);
7837
7838     space = (strchr(CURR_DIR, ' ')) ? TRUE : FALSE;
7839     sprintf(path, "%s\\FileName1 -option", CURR_DIR);
7840     res = RegSetValueExA(hklm, "value17", 0, REG_SZ,
7841                          (const BYTE *)path, lstrlenA(path) + 1);
7842
7843     hdb = create_package_db();
7844     ok(hdb, "Expected a valid database handle\n");
7845
7846     r = create_appsearch_table(hdb);
7847     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7848
7849     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
7850     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7851
7852     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
7853     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7854
7855     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
7856     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7857
7858     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
7859     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7860
7861     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
7862     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7863
7864     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
7865     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7866
7867     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
7868     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7869
7870     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
7871     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7872
7873     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
7874     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7875
7876     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
7877     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7878
7879     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
7880     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7881
7882     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
7883     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7884
7885     r = add_appsearch_entry(hdb, "'SIGPROP13', 'NewSignature13'");
7886     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7887
7888     r = add_appsearch_entry(hdb, "'SIGPROP14', 'NewSignature14'");
7889     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7890
7891     r = add_appsearch_entry(hdb, "'SIGPROP15', 'NewSignature15'");
7892     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7893
7894     r = add_appsearch_entry(hdb, "'SIGPROP16', 'NewSignature16'");
7895     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7896
7897     r = add_appsearch_entry(hdb, "'SIGPROP17', 'NewSignature17'");
7898     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7899
7900     r = add_appsearch_entry(hdb, "'SIGPROP18', 'NewSignature18'");
7901     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7902
7903     r = add_appsearch_entry(hdb, "'SIGPROP19', 'NewSignature19'");
7904     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7905
7906     r = add_appsearch_entry(hdb, "'SIGPROP20', 'NewSignature20'");
7907     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7908
7909     r = add_appsearch_entry(hdb, "'SIGPROP21', 'NewSignature21'");
7910     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7911
7912     r = add_appsearch_entry(hdb, "'SIGPROP22', 'NewSignature22'");
7913     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7914
7915     r = add_appsearch_entry(hdb, "'SIGPROP23', 'NewSignature23'");
7916     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7917
7918     r = add_appsearch_entry(hdb, "'SIGPROP24', 'NewSignature24'");
7919     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7920
7921     r = add_appsearch_entry(hdb, "'SIGPROP25', 'NewSignature25'");
7922     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7923
7924     r = add_appsearch_entry(hdb, "'SIGPROP26', 'NewSignature26'");
7925     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7926
7927     r = add_appsearch_entry(hdb, "'SIGPROP27', 'NewSignature27'");
7928     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7929
7930     r = add_appsearch_entry(hdb, "'SIGPROP28', 'NewSignature28'");
7931     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7932
7933     r = add_appsearch_entry(hdb, "'SIGPROP29', 'NewSignature29'");
7934     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7935
7936     r = add_appsearch_entry(hdb, "'SIGPROP30', 'NewSignature30'");
7937     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7938
7939     r = create_reglocator_table(hdb);
7940     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7941
7942     /* HKLM, msidbLocatorTypeRawValue, REG_SZ */
7943     str = "'NewSignature1', 2, 'Software\\Wine', 'Value1', 2";
7944     r = add_reglocator_entry(hdb, str);
7945     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7946
7947     /* HKLM, msidbLocatorTypeRawValue, positive DWORD */
7948     str = "'NewSignature2', 2, 'Software\\Wine', 'Value2', 2";
7949     r = add_reglocator_entry(hdb, str);
7950     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7951
7952     /* HKLM, msidbLocatorTypeRawValue, negative DWORD */
7953     str = "'NewSignature3', 2, 'Software\\Wine', 'Value3', 2";
7954     r = add_reglocator_entry(hdb, str);
7955     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7956
7957     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
7958     str = "'NewSignature4', 2, 'Software\\Wine', 'Value4', 2";
7959     r = add_reglocator_entry(hdb, str);
7960     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7961
7962     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
7963     str = "'NewSignature5', 2, 'Software\\Wine', 'Value5', 2";
7964     r = add_reglocator_entry(hdb, str);
7965     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7966
7967     /* HKLM, msidbLocatorTypeRawValue, REG_MULTI_SZ */
7968     str = "'NewSignature6', 2, 'Software\\Wine', 'Value6', 2";
7969     r = add_reglocator_entry(hdb, str);
7970     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7971
7972     /* HKLM, msidbLocatorTypeRawValue, REG_BINARY */
7973     str = "'NewSignature7', 2, 'Software\\Wine', 'Value7', 2";
7974     r = add_reglocator_entry(hdb, str);
7975     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7976
7977     /* HKLM, msidbLocatorTypeRawValue, REG_SZ first char is # */
7978     str = "'NewSignature8', 2, 'Software\\Wine', 'Value8', 2";
7979     r = add_reglocator_entry(hdb, str);
7980     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7981
7982     /* HKLM, msidbLocatorTypeFileName, signature, file exists */
7983     str = "'NewSignature9', 2, 'Software\\Wine', 'Value9', 1";
7984     r = add_reglocator_entry(hdb, str);
7985     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7986
7987     /* HKLM, msidbLocatorTypeFileName, signature, file does not exist */
7988     str = "'NewSignature10', 2, 'Software\\Wine', 'Value10', 1";
7989     r = add_reglocator_entry(hdb, str);
7990     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7991
7992     /* HKLM, msidbLocatorTypeFileName, no signature */
7993     str = "'NewSignature11', 2, 'Software\\Wine', 'Value9', 1";
7994     r = add_reglocator_entry(hdb, str);
7995     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7996
7997     /* HKLM, msidbLocatorTypeDirectory, no signature, file exists */
7998     str = "'NewSignature12', 2, 'Software\\Wine', 'Value9', 0";
7999     r = add_reglocator_entry(hdb, str);
8000     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8001
8002     /* HKLM, msidbLocatorTypeDirectory, no signature, directory exists */
8003     str = "'NewSignature13', 2, 'Software\\Wine', 'Value11', 0";
8004     r = add_reglocator_entry(hdb, str);
8005     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8006
8007     /* HKLM, msidbLocatorTypeDirectory, signature, file exists */
8008     str = "'NewSignature14', 2, 'Software\\Wine', 'Value9', 0";
8009     r = add_reglocator_entry(hdb, str);
8010     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8011
8012     /* HKCR, msidbLocatorTypeRawValue, REG_SZ */
8013     str = "'NewSignature15', 0, 'Software\\Wine', 'Value1', 2";
8014     r = add_reglocator_entry(hdb, str);
8015     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8016
8017     /* HKCU, msidbLocatorTypeRawValue, REG_SZ */
8018     str = "'NewSignature16', 1, 'Software\\Wine', 'Value1', 2";
8019     r = add_reglocator_entry(hdb, str);
8020     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8021
8022     /* HKU, msidbLocatorTypeRawValue, REG_SZ */
8023     str = "'NewSignature17', 3, 'S-1-5-18\\Software\\Wine', 'Value1', 2";
8024     r = add_reglocator_entry(hdb, str);
8025     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8026
8027     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, NULL Name */
8028     str = "'NewSignature18', 2, 'Software\\Wine', '', 2";
8029     r = add_reglocator_entry(hdb, str);
8030     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8031
8032     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, key does not exist */
8033     str = "'NewSignature19', 2, 'Software\\IDontExist', '', 2";
8034     r = add_reglocator_entry(hdb, str);
8035     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8036
8037     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, value is empty */
8038     str = "'NewSignature20', 2, 'Software\\Wine', 'Value12', 2";
8039     r = add_reglocator_entry(hdb, str);
8040     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8041
8042     /* HKLM, msidbLocatorTypeFileName, signature, file exists w/ version */
8043     str = "'NewSignature21', 2, 'Software\\Wine', 'Value13', 1";
8044     r = add_reglocator_entry(hdb, str);
8045     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8046
8047     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, version > max */
8048     str = "'NewSignature22', 2, 'Software\\Wine', 'Value14', 1";
8049     r = add_reglocator_entry(hdb, str);
8050     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8051
8052     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, sig->name ignored */
8053     str = "'NewSignature23', 2, 'Software\\Wine', 'Value15', 1";
8054     r = add_reglocator_entry(hdb, str);
8055     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8056
8057     /* HKLM, msidbLocatorTypeFileName, no signature, directory exists */
8058     str = "'NewSignature24', 2, 'Software\\Wine', 'Value11', 1";
8059     r = add_reglocator_entry(hdb, str);
8060     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8061
8062     /* HKLM, msidbLocatorTypeFileName, no signature, file does not exist */
8063     str = "'NewSignature25', 2, 'Software\\Wine', 'Value10', 1";
8064     r = add_reglocator_entry(hdb, str);
8065     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8066
8067     /* HKLM, msidbLocatorTypeDirectory, signature, directory exists */
8068     str = "'NewSignature26', 2, 'Software\\Wine', 'Value11', 0";
8069     r = add_reglocator_entry(hdb, str);
8070     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8071
8072     /* HKLM, msidbLocatorTypeDirectory, signature, file does not exist */
8073     str = "'NewSignature27', 2, 'Software\\Wine', 'Value10', 0";
8074     r = add_reglocator_entry(hdb, str);
8075     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8076
8077     /* HKLM, msidbLocatorTypeDirectory, no signature, file does not exist */
8078     str = "'NewSignature28', 2, 'Software\\Wine', 'Value10', 0";
8079     r = add_reglocator_entry(hdb, str);
8080     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8081
8082     /* HKLM, msidbLocatorTypeFile, file exists, in quotes */
8083     str = "'NewSignature29', 2, 'Software\\Wine', 'Value16', 1";
8084     r = add_reglocator_entry(hdb, str);
8085     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8086
8087     /* HKLM, msidbLocatorTypeFile, file exists, no quotes */
8088     str = "'NewSignature30', 2, 'Software\\Wine', 'Value17', 1";
8089     r = add_reglocator_entry(hdb, str);
8090     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8091
8092     r = create_signature_table(hdb);
8093     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8094
8095     str = "'NewSignature9', 'FileName1', '', '', '', '', '', '', ''";
8096     r = add_signature_entry(hdb, str);
8097     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8098
8099     str = "'NewSignature10', 'FileName2', '', '', '', '', '', '', ''";
8100     r = add_signature_entry(hdb, str);
8101     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8102
8103     str = "'NewSignature14', 'FileName1', '', '', '', '', '', '', ''";
8104     r = add_signature_entry(hdb, str);
8105     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8106
8107     str = "'NewSignature21', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8108     r = add_signature_entry(hdb, str);
8109     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8110
8111     str = "'NewSignature22', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8112     r = add_signature_entry(hdb, str);
8113     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8114
8115     str = "'NewSignature23', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8116     r = add_signature_entry(hdb, str);
8117     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8118
8119     ptr = strrchr(CURR_DIR, '\\') + 1;
8120     sprintf(path, "'NewSignature26', '%s', '', '', '', '', '', '', ''", ptr);
8121     r = add_signature_entry(hdb, path);
8122     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8123
8124     str = "'NewSignature27', 'FileName2', '', '', '', '', '', '', ''";
8125     r = add_signature_entry(hdb, str);
8126     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8127
8128     str = "'NewSignature29', 'FileName1', '', '', '', '', '', '', ''";
8129     r = add_signature_entry(hdb, str);
8130     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8131
8132     str = "'NewSignature30', 'FileName1', '', '', '', '', '', '', ''";
8133     r = add_signature_entry(hdb, str);
8134     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8135
8136     hpkg = package_from_db(hdb);
8137     ok(hpkg, "Expected a valid package handle\n");
8138
8139     r = MsiDoAction(hpkg, "AppSearch");
8140     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8141
8142     size = MAX_PATH;
8143     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8144     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8145     ok(!lstrcmpA(prop, "regszdata"),
8146        "Expected \"regszdata\", got \"%s\"\n", prop);
8147
8148     size = MAX_PATH;
8149     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8150     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8151     ok(!lstrcmpA(prop, "#42"), "Expected \"#42\", got \"%s\"\n", prop);
8152
8153     size = MAX_PATH;
8154     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8155     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8156     ok(!lstrcmpA(prop, "#-42"), "Expected \"#-42\", got \"%s\"\n", prop);
8157
8158     size = ExpandEnvironmentStringsA("%PATH%", NULL, 0);
8159     if (size == 0 && GetLastError() == ERROR_INVALID_PARAMETER)
8160     {
8161         /* Workaround for Win95 */
8162         CHAR tempbuf[1];
8163         size = ExpandEnvironmentStringsA("%PATH%", tempbuf, 0);
8164     }
8165     pathvar = HeapAlloc(GetProcessHeap(), 0, size);
8166     ExpandEnvironmentStringsA("%PATH%", pathvar, size);
8167
8168     size = 0;
8169     r = MsiGetPropertyA(hpkg, "SIGPROP4", NULL, &size);
8170     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8171
8172     pathdata = HeapAlloc(GetProcessHeap(), 0, ++size);
8173     r = MsiGetPropertyA(hpkg, "SIGPROP4", pathdata, &size);
8174     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8175     ok(!lstrcmpA(pathdata, pathvar),
8176        "Expected \"%s\", got \"%s\"\n", pathvar, pathdata);
8177
8178     HeapFree(GetProcessHeap(), 0, pathvar);
8179     HeapFree(GetProcessHeap(), 0, pathdata);
8180
8181     size = MAX_PATH;
8182     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8183     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8184     ok(!lstrcmpA(prop,
8185        "my%NOVAR%"), "Expected \"my%%NOVAR%%\", got \"%s\"\n", prop);
8186
8187     size = MAX_PATH;
8188     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8189     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8190     todo_wine
8191     {
8192         ok(!memcmp(prop, "\0one\0two\0\0", 10),
8193            "Expected \"\\0one\\0two\\0\\0\"\n");
8194     }
8195
8196     size = MAX_PATH;
8197     lstrcpyA(path, "#xCDAB3412EF907856");
8198     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8199     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8200     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8201
8202     size = MAX_PATH;
8203     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8204     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8205     ok(!lstrcmpA(prop, "##regszdata"),
8206        "Expected \"##regszdata\", got \"%s\"\n", prop);
8207
8208     size = MAX_PATH;
8209     sprintf(path, "%s\\FileName1", CURR_DIR);
8210     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8211     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8212     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8213
8214     size = MAX_PATH;
8215     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8216     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8217     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8218
8219     size = MAX_PATH;
8220     sprintf(path, "%s\\", CURR_DIR);
8221     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8222     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8223     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8224
8225     size = MAX_PATH;
8226     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
8227     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8228     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8229
8230     size = MAX_PATH;
8231     sprintf(path, "%s\\", CURR_DIR);
8232     r = MsiGetPropertyA(hpkg, "SIGPROP13", prop, &size);
8233     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8234     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8235
8236     size = MAX_PATH;
8237     r = MsiGetPropertyA(hpkg, "SIGPROP14", prop, &size);
8238     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8239     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8240
8241     size = MAX_PATH;
8242     r = MsiGetPropertyA(hpkg, "SIGPROP15", prop, &size);
8243     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8244     ok(!lstrcmpA(prop, "regszdata"),
8245        "Expected \"regszdata\", got \"%s\"\n", prop);
8246
8247     size = MAX_PATH;
8248     r = MsiGetPropertyA(hpkg, "SIGPROP16", prop, &size);
8249     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8250     ok(!lstrcmpA(prop, "regszdata"),
8251        "Expected \"regszdata\", got \"%s\"\n", prop);
8252
8253     if (users)
8254     {
8255         size = MAX_PATH;
8256         r = MsiGetPropertyA(hpkg, "SIGPROP17", prop, &size);
8257         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8258         ok(!lstrcmpA(prop, "regszdata"),
8259            "Expected \"regszdata\", got \"%s\"\n", prop);
8260     }
8261
8262     size = MAX_PATH;
8263     r = MsiGetPropertyA(hpkg, "SIGPROP18", prop, &size);
8264     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8265     ok(!lstrcmpA(prop, "defvalue"),
8266        "Expected \"defvalue\", got \"%s\"\n", prop);
8267
8268     size = MAX_PATH;
8269     r = MsiGetPropertyA(hpkg, "SIGPROP19", prop, &size);
8270     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8271     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8272
8273     size = MAX_PATH;
8274     r = MsiGetPropertyA(hpkg, "SIGPROP20", prop, &size);
8275     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8276     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8277
8278     if (version)
8279     {
8280         size = MAX_PATH;
8281         sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8282         r = MsiGetPropertyA(hpkg, "SIGPROP21", prop, &size);
8283         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8284         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8285
8286         size = MAX_PATH;
8287         r = MsiGetPropertyA(hpkg, "SIGPROP22", prop, &size);
8288         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8289         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8290
8291         size = MAX_PATH;
8292         sprintf(path, "%s\\FileName5.dll", CURR_DIR);
8293         r = MsiGetPropertyA(hpkg, "SIGPROP23", prop, &size);
8294         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8295         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8296     }
8297
8298     size = MAX_PATH;
8299     lstrcpyA(path, CURR_DIR);
8300     ptr = strrchr(path, '\\') + 1;
8301     *ptr = '\0';
8302     r = MsiGetPropertyA(hpkg, "SIGPROP24", prop, &size);
8303     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8304     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8305
8306     size = MAX_PATH;
8307     sprintf(path, "%s\\", CURR_DIR);
8308     r = MsiGetPropertyA(hpkg, "SIGPROP25", prop, &size);
8309     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8310     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8311
8312     size = MAX_PATH;
8313     r = MsiGetPropertyA(hpkg, "SIGPROP26", prop, &size);
8314     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8315     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8316
8317     size = MAX_PATH;
8318     r = MsiGetPropertyA(hpkg, "SIGPROP27", prop, &size);
8319     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8320     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8321
8322     size = MAX_PATH;
8323     r = MsiGetPropertyA(hpkg, "SIGPROP28", prop, &size);
8324     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8325     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8326
8327     size = MAX_PATH;
8328     sprintf(path, "%s\\FileName1", CURR_DIR);
8329     r = MsiGetPropertyA(hpkg, "SIGPROP29", prop, &size);
8330     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8331     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8332
8333     size = MAX_PATH;
8334     sprintf(path, "%s\\FileName1", CURR_DIR);
8335     r = MsiGetPropertyA(hpkg, "SIGPROP30", prop, &size);
8336     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8337     if (space)
8338         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8339     else
8340         todo_wine ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8341
8342     RegSetValueA(hklm, NULL, REG_SZ, "", 0);
8343     RegDeleteValueA(hklm, "Value1");
8344     RegDeleteValueA(hklm, "Value2");
8345     RegDeleteValueA(hklm, "Value3");
8346     RegDeleteValueA(hklm, "Value4");
8347     RegDeleteValueA(hklm, "Value5");
8348     RegDeleteValueA(hklm, "Value6");
8349     RegDeleteValueA(hklm, "Value7");
8350     RegDeleteValueA(hklm, "Value8");
8351     RegDeleteValueA(hklm, "Value9");
8352     RegDeleteValueA(hklm, "Value10");
8353     RegDeleteValueA(hklm, "Value11");
8354     RegDeleteValueA(hklm, "Value12");
8355     RegDeleteValueA(hklm, "Value13");
8356     RegDeleteValueA(hklm, "Value14");
8357     RegDeleteValueA(hklm, "Value15");
8358     RegDeleteValueA(hklm, "Value16");
8359     RegDeleteValueA(hklm, "Value17");
8360     RegDeleteKeyA(hklm, "");
8361     RegCloseKey(hklm);
8362
8363     RegDeleteValueA(classes, "Value1");
8364     RegDeleteKeyA(classes, "");
8365     RegCloseKey(classes);
8366
8367     RegDeleteValueA(hkcu, "Value1");
8368     RegDeleteKeyA(hkcu, "");
8369     RegCloseKey(hkcu);
8370
8371     RegDeleteValueA(users, "Value1");
8372     RegDeleteKeyA(users, "");
8373     RegCloseKey(users);
8374
8375     DeleteFileA("FileName1");
8376     DeleteFileA("FileName3.dll");
8377     DeleteFileA("FileName4.dll");
8378     DeleteFileA("FileName5.dll");
8379     MsiCloseHandle(hpkg);
8380     DeleteFileA(msifile);
8381 }
8382
8383 static void delete_win_ini(LPCSTR file)
8384 {
8385     CHAR path[MAX_PATH];
8386
8387     GetWindowsDirectoryA(path, MAX_PATH);
8388     lstrcatA(path, "\\");
8389     lstrcatA(path, file);
8390
8391     DeleteFileA(path);
8392 }
8393
8394 static void test_appsearch_inilocator(void)
8395 {
8396     MSIHANDLE hpkg, hdb;
8397     CHAR path[MAX_PATH];
8398     CHAR prop[MAX_PATH];
8399     BOOL version;
8400     LPCSTR str;
8401     LPSTR ptr;
8402     DWORD size;
8403     UINT r;
8404
8405     version = TRUE;
8406     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
8407         version = FALSE;
8408
8409     DeleteFileA("test.dll");
8410
8411     WritePrivateProfileStringA("Section", "Key", "keydata,field2", "IniFile.ini");
8412
8413     create_test_file("FileName1");
8414     sprintf(path, "%s\\FileName1", CURR_DIR);
8415     WritePrivateProfileStringA("Section", "Key2", path, "IniFile.ini");
8416
8417     WritePrivateProfileStringA("Section", "Key3", CURR_DIR, "IniFile.ini");
8418
8419     sprintf(path, "%s\\IDontExist", CURR_DIR);
8420     WritePrivateProfileStringA("Section", "Key4", path, "IniFile.ini");
8421
8422     create_file_with_version("FileName2.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8423     sprintf(path, "%s\\FileName2.dll", CURR_DIR);
8424     WritePrivateProfileStringA("Section", "Key5", path, "IniFile.ini");
8425
8426     create_file_with_version("FileName3.dll", MAKELONG(1, 2), MAKELONG(3, 4));
8427     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8428     WritePrivateProfileStringA("Section", "Key6", path, "IniFile.ini");
8429
8430     create_file_with_version("FileName4.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8431     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
8432     WritePrivateProfileStringA("Section", "Key7", path, "IniFile.ini");
8433
8434     hdb = create_package_db();
8435     ok(hdb, "Expected a valid database handle\n");
8436
8437     r = create_appsearch_table(hdb);
8438     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8439
8440     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
8441     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8442
8443     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
8444     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8445
8446     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
8447     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8448
8449     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
8450     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8451
8452     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
8453     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8454
8455     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
8456     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8457
8458     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
8459     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8460
8461     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
8462     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8463
8464     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
8465     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8466
8467     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
8468     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8469
8470     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
8471     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8472
8473     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
8474     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8475
8476     r = create_inilocator_table(hdb);
8477     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8478
8479     /* msidbLocatorTypeRawValue, field 1 */
8480     str = "'NewSignature1', 'IniFile.ini', 'Section', 'Key', 1, 2";
8481     r = add_inilocator_entry(hdb, str);
8482     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8483
8484     /* msidbLocatorTypeRawValue, field 2 */
8485     str = "'NewSignature2', 'IniFile.ini', 'Section', 'Key', 2, 2";
8486     r = add_inilocator_entry(hdb, str);
8487     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8488
8489     /* msidbLocatorTypeRawValue, entire field */
8490     str = "'NewSignature3', 'IniFile.ini', 'Section', 'Key', 0, 2";
8491     r = add_inilocator_entry(hdb, str);
8492     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8493
8494     /* msidbLocatorTypeFile */
8495     str = "'NewSignature4', 'IniFile.ini', 'Section', 'Key2', 1, 1";
8496     r = add_inilocator_entry(hdb, str);
8497     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8498
8499     /* msidbLocatorTypeDirectory, file */
8500     str = "'NewSignature5', 'IniFile.ini', 'Section', 'Key2', 1, 0";
8501     r = add_inilocator_entry(hdb, str);
8502     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8503
8504     /* msidbLocatorTypeDirectory, directory */
8505     str = "'NewSignature6', 'IniFile.ini', 'Section', 'Key3', 1, 0";
8506     r = add_inilocator_entry(hdb, str);
8507     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8508
8509     /* msidbLocatorTypeFile, file, no signature */
8510     str = "'NewSignature7', 'IniFile.ini', 'Section', 'Key2', 1, 1";
8511     r = add_inilocator_entry(hdb, str);
8512     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8513
8514     /* msidbLocatorTypeFile, dir, no signature */
8515     str = "'NewSignature8', 'IniFile.ini', 'Section', 'Key3', 1, 1";
8516     r = add_inilocator_entry(hdb, str);
8517     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8518
8519     /* msidbLocatorTypeFile, file does not exist */
8520     str = "'NewSignature9', 'IniFile.ini', 'Section', 'Key4', 1, 1";
8521     r = add_inilocator_entry(hdb, str);
8522     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8523
8524     /* msidbLocatorTypeFile, signature with version */
8525     str = "'NewSignature10', 'IniFile.ini', 'Section', 'Key5', 1, 1";
8526     r = add_inilocator_entry(hdb, str);
8527     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8528
8529     /* msidbLocatorTypeFile, signature with version, ver > max */
8530     str = "'NewSignature11', 'IniFile.ini', 'Section', 'Key6', 1, 1";
8531     r = add_inilocator_entry(hdb, str);
8532     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8533
8534     /* msidbLocatorTypeFile, signature with version, sig->name ignored */
8535     str = "'NewSignature12', 'IniFile.ini', 'Section', 'Key7', 1, 1";
8536     r = add_inilocator_entry(hdb, str);
8537     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8538
8539     r = create_signature_table(hdb);
8540     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8541
8542     r = add_signature_entry(hdb, "'NewSignature4', 'FileName1', '', '', '', '', '', '', ''");
8543     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8544
8545     r = add_signature_entry(hdb, "'NewSignature9', 'IDontExist', '', '', '', '', '', '', ''");
8546     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8547
8548     r = add_signature_entry(hdb, "'NewSignature10', 'FileName2.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8549     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8550
8551     r = add_signature_entry(hdb, "'NewSignature11', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8552     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8553
8554     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
8555     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8556
8557     hpkg = package_from_db(hdb);
8558     ok(hpkg, "Expected a valid package handle\n");
8559
8560     r = MsiDoAction(hpkg, "AppSearch");
8561     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8562
8563     size = MAX_PATH;
8564     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8565     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8566     ok(!lstrcmpA(prop, "keydata"), "Expected \"keydata\", got \"%s\"\n", prop);
8567
8568     size = MAX_PATH;
8569     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8570     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8571     ok(!lstrcmpA(prop, "field2"), "Expected \"field2\", got \"%s\"\n", prop);
8572
8573     size = MAX_PATH;
8574     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8575     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8576     ok(!lstrcmpA(prop, "keydata,field2"),
8577        "Expected \"keydata,field2\", got \"%s\"\n", prop);
8578
8579     size = MAX_PATH;
8580     sprintf(path, "%s\\FileName1", CURR_DIR);
8581     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
8582     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8583     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8584
8585     size = MAX_PATH;
8586     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8587     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8588     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8589
8590     size = MAX_PATH;
8591     sprintf(path, "%s\\", CURR_DIR);
8592     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8593     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8594     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8595
8596     size = MAX_PATH;
8597     sprintf(path, "%s\\", CURR_DIR);
8598     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8599     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8600     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8601
8602     size = MAX_PATH;
8603     lstrcpyA(path, CURR_DIR);
8604     ptr = strrchr(path, '\\');
8605     *(ptr + 1) = '\0';
8606     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8607     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8608     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8609
8610     size = MAX_PATH;
8611     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8612     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8613     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8614
8615     if (version)
8616     {
8617         size = MAX_PATH;
8618         sprintf(path, "%s\\FileName2.dll", CURR_DIR);
8619         r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8620         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8621         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8622
8623         size = MAX_PATH;
8624         r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8625         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8626         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8627
8628         size = MAX_PATH;
8629         sprintf(path, "%s\\FileName4.dll", CURR_DIR);
8630         r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
8631         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8632         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8633     }
8634
8635     delete_win_ini("IniFile.ini");
8636     DeleteFileA("FileName1");
8637     DeleteFileA("FileName2.dll");
8638     DeleteFileA("FileName3.dll");
8639     DeleteFileA("FileName4.dll");
8640     MsiCloseHandle(hpkg);
8641     DeleteFileA(msifile);
8642 }
8643
8644 /*
8645  * MSI AppSearch action on DrLocator table always returns absolute paths.
8646  * If a relative path was set, it returns the first absolute path that
8647  * matches or an empty string if it didn't find anything.
8648  * This helper function replicates this behaviour.
8649  */
8650 static void search_absolute_directory(LPSTR absolute, LPCSTR relative)
8651 {
8652     int i, size;
8653     DWORD attr, drives;
8654
8655     size = lstrlenA(relative);
8656     drives = GetLogicalDrives();
8657     lstrcpyA(absolute, "A:\\");
8658     for (i = 0; i < 26; absolute[0] = '\0', i++)
8659     {
8660         if (!(drives & (1 << i)))
8661             continue;
8662
8663         absolute[0] = 'A' + i;
8664         if (GetDriveType(absolute) != DRIVE_FIXED)
8665             continue;
8666
8667         lstrcpynA(absolute + 3, relative, size + 1);
8668         attr = GetFileAttributesA(absolute);
8669         if (attr != INVALID_FILE_ATTRIBUTES &&
8670             (attr & FILE_ATTRIBUTE_DIRECTORY))
8671         {
8672             if (absolute[3 + size - 1] != '\\')
8673                 lstrcatA(absolute, "\\");
8674             break;
8675         }
8676         absolute[3] = '\0';
8677     }
8678 }
8679
8680 static void test_appsearch_drlocator(void)
8681 {
8682     MSIHANDLE hpkg, hdb;
8683     CHAR path[MAX_PATH];
8684     CHAR prop[MAX_PATH];
8685     BOOL version;
8686     LPCSTR str;
8687     DWORD size;
8688     UINT r;
8689
8690     version = TRUE;
8691     if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3)))
8692         version = FALSE;
8693
8694     DeleteFileA("test.dll");
8695
8696     create_test_file("FileName1");
8697     CreateDirectoryA("one", NULL);
8698     CreateDirectoryA("one\\two", NULL);
8699     CreateDirectoryA("one\\two\\three", NULL);
8700     create_test_file("one\\two\\three\\FileName2");
8701     CreateDirectoryA("another", NULL);
8702     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8703     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
8704     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
8705
8706     hdb = create_package_db();
8707     ok(hdb, "Expected a valid database handle\n");
8708
8709     r = create_appsearch_table(hdb);
8710     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8711
8712     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
8713     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8714
8715     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
8716     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8717
8718     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
8719     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8720
8721     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
8722     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8723
8724     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
8725     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8726
8727     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
8728     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8729
8730     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
8731     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8732
8733     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
8734     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8735
8736     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
8737     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8738
8739     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
8740     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8741
8742     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
8743     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8744
8745     r = create_drlocator_table(hdb);
8746     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8747
8748     /* no parent, full path, depth 0, signature */
8749     sprintf(path, "'NewSignature1', '', '%s', 0", CURR_DIR);
8750     r = add_drlocator_entry(hdb, path);
8751     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8752
8753     /* no parent, full path, depth 0, no signature */
8754     sprintf(path, "'NewSignature2', '', '%s', 0", CURR_DIR);
8755     r = add_drlocator_entry(hdb, path);
8756     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8757
8758     /* no parent, relative path, depth 0, no signature */
8759     sprintf(path, "'NewSignature3', '', '%s', 0", CURR_DIR + 3);
8760     r = add_drlocator_entry(hdb, path);
8761     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8762
8763     /* no parent, full path, depth 2, signature */
8764     sprintf(path, "'NewSignature4', '', '%s', 2", CURR_DIR);
8765     r = add_drlocator_entry(hdb, path);
8766     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8767
8768     /* no parent, full path, depth 3, signature */
8769     sprintf(path, "'NewSignature5', '', '%s', 3", CURR_DIR);
8770     r = add_drlocator_entry(hdb, path);
8771     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8772
8773     /* no parent, full path, depth 1, signature is dir */
8774     sprintf(path, "'NewSignature6', '', '%s', 1", CURR_DIR);
8775     r = add_drlocator_entry(hdb, path);
8776     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8777
8778     /* parent is in DrLocator, relative path, depth 0, signature */
8779     sprintf(path, "'NewSignature7', 'NewSignature1', 'one\\two\\three', 1");
8780     r = add_drlocator_entry(hdb, path);
8781     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8782
8783     /* no parent, full path, depth 0, signature w/ version */
8784     sprintf(path, "'NewSignature8', '', '%s', 0", CURR_DIR);
8785     r = add_drlocator_entry(hdb, path);
8786     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8787
8788     /* no parent, full path, depth 0, signature w/ version, ver > max */
8789     sprintf(path, "'NewSignature9', '', '%s', 0", CURR_DIR);
8790     r = add_drlocator_entry(hdb, path);
8791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8792
8793     /* no parent, full path, depth 0, signature w/ version, sig->name not ignored */
8794     sprintf(path, "'NewSignature10', '', '%s', 0", CURR_DIR);
8795     r = add_drlocator_entry(hdb, path);
8796     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8797
8798     /* no parent, relative empty path, depth 0, no signature */
8799     sprintf(path, "'NewSignature11', '', '', 0");
8800     r = add_drlocator_entry(hdb, path);
8801     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8802
8803     r = create_signature_table(hdb);
8804     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8805
8806     str = "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''";
8807     r = add_signature_entry(hdb, str);
8808     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8809
8810     str = "'NewSignature4', 'FileName2', '', '', '', '', '', '', ''";
8811     r = add_signature_entry(hdb, str);
8812     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8813
8814     str = "'NewSignature5', 'FileName2', '', '', '', '', '', '', ''";
8815     r = add_signature_entry(hdb, str);
8816     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8817
8818     str = "'NewSignature6', 'another', '', '', '', '', '', '', ''";
8819     r = add_signature_entry(hdb, str);
8820     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8821
8822     str = "'NewSignature7', 'FileName2', '', '', '', '', '', '', ''";
8823     r = add_signature_entry(hdb, str);
8824     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8825
8826     str = "'NewSignature8', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8827     r = add_signature_entry(hdb, str);
8828     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8829
8830     str = "'NewSignature9', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8831     r = add_signature_entry(hdb, str);
8832     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8833
8834     str = "'NewSignature10', 'necessary', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
8835     r = add_signature_entry(hdb, str);
8836     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8837
8838     hpkg = package_from_db(hdb);
8839     ok(hpkg, "Expected a valid package handle\n");
8840
8841     r = MsiDoAction(hpkg, "AppSearch");
8842     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8843
8844     size = MAX_PATH;
8845     sprintf(path, "%s\\FileName1", CURR_DIR);
8846     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
8847     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8848     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8849
8850     size = MAX_PATH;
8851     sprintf(path, "%s\\", CURR_DIR);
8852     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
8853     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8854     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8855
8856     size = MAX_PATH;
8857     search_absolute_directory(path, CURR_DIR + 3);
8858     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
8859     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8860     ok(!lstrcmpiA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8861
8862     size = MAX_PATH;
8863     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
8864     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8865     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8866
8867     size = MAX_PATH;
8868     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
8869     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
8870     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8871     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8872
8873     size = MAX_PATH;
8874     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
8875     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8876     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8877
8878     size = MAX_PATH;
8879     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
8880     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
8881     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8882     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8883
8884     if (version)
8885     {
8886         size = MAX_PATH;
8887         sprintf(path, "%s\\FileName3.dll", CURR_DIR);
8888         r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
8889         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8890         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8891
8892         size = MAX_PATH;
8893         r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
8894         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8895         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8896
8897         size = MAX_PATH;
8898         r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
8899         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8900         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
8901     }
8902
8903     size = MAX_PATH;
8904     search_absolute_directory(path, "");
8905     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
8906     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8907     ok(!lstrcmpiA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
8908
8909     DeleteFileA("FileName1");
8910     DeleteFileA("FileName3.dll");
8911     DeleteFileA("FileName4.dll");
8912     DeleteFileA("FileName5.dll");
8913     DeleteFileA("one\\two\\three\\FileName2");
8914     RemoveDirectoryA("one\\two\\three");
8915     RemoveDirectoryA("one\\two");
8916     RemoveDirectoryA("one");
8917     RemoveDirectoryA("another");
8918     MsiCloseHandle(hpkg);
8919     DeleteFileA(msifile);
8920 }
8921
8922 static void test_featureparents(void)
8923 {
8924     MSIHANDLE hpkg;
8925     UINT r;
8926     MSIHANDLE hdb;
8927     INSTALLSTATE state, action;
8928
8929     hdb = create_package_db();
8930     ok ( hdb, "failed to create package database\n" );
8931
8932     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
8933     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
8934
8935     r = create_feature_table( hdb );
8936     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
8937
8938     r = create_component_table( hdb );
8939     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
8940
8941     r = create_feature_components_table( hdb );
8942     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
8943
8944     r = create_file_table( hdb );
8945     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
8946
8947     /* msidbFeatureAttributesFavorLocal */
8948     r = add_feature_entry( hdb, "'zodiac', '', '', '', 2, 1, '', 0" );
8949     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8950
8951     /* msidbFeatureAttributesFavorSource */
8952     r = add_feature_entry( hdb, "'perseus', '', '', '', 2, 1, '', 1" );
8953     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8954
8955     /* msidbFeatureAttributesFavorLocal */
8956     r = add_feature_entry( hdb, "'orion', '', '', '', 2, 1, '', 0" );
8957     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8958
8959     /* disabled because of install level */
8960     r = add_feature_entry( hdb, "'waters', '', '', '', 15, 101, '', 9" );
8961     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8962
8963     /* child feature of disabled feature */
8964     r = add_feature_entry( hdb, "'bayer', 'waters', '', '', 14, 1, '', 9" );
8965     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
8966
8967     /* component of disabled feature (install level) */
8968     r = add_component_entry( hdb, "'delphinus', '', 'TARGETDIR', 0, '', 'delphinus_file'" );
8969     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8970
8971     /* component of disabled child feature (install level) */
8972     r = add_component_entry( hdb, "'hydrus', '', 'TARGETDIR', 0, '', 'hydrus_file'" );
8973     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8974
8975     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
8976     r = add_component_entry( hdb, "'leo', '', 'TARGETDIR', 0, '', 'leo_file'" );
8977     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8978
8979     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
8980     r = add_component_entry( hdb, "'virgo', '', 'TARGETDIR', 1, '', 'virgo_file'" );
8981     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8982
8983     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
8984     r = add_component_entry( hdb, "'libra', '', 'TARGETDIR', 2, '', 'libra_file'" );
8985     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8986
8987     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
8988     r = add_component_entry( hdb, "'cassiopeia', '', 'TARGETDIR', 0, '', 'cassiopeia_file'" );
8989     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8990
8991     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
8992     r = add_component_entry( hdb, "'cepheus', '', 'TARGETDIR', 1, '', 'cepheus_file'" );
8993     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8994
8995     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
8996     r = add_component_entry( hdb, "'andromeda', '', 'TARGETDIR', 2, '', 'andromeda_file'" );
8997     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
8998
8999     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
9000     r = add_component_entry( hdb, "'canis', '', 'TARGETDIR', 0, '', 'canis_file'" );
9001     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
9002
9003     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
9004     r = add_component_entry( hdb, "'monoceros', '', 'TARGETDIR', 1, '', 'monoceros_file'" );
9005     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
9006
9007     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
9008     r = add_component_entry( hdb, "'lepus', '', 'TARGETDIR', 2, '', 'lepus_file'" );
9009
9010     r = add_feature_components_entry( hdb, "'zodiac', 'leo'" );
9011     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9012
9013     r = add_feature_components_entry( hdb, "'zodiac', 'virgo'" );
9014     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9015
9016     r = add_feature_components_entry( hdb, "'zodiac', 'libra'" );
9017     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9018
9019     r = add_feature_components_entry( hdb, "'perseus', 'cassiopeia'" );
9020     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9021
9022     r = add_feature_components_entry( hdb, "'perseus', 'cepheus'" );
9023     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9024
9025     r = add_feature_components_entry( hdb, "'perseus', 'andromeda'" );
9026     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9027
9028     r = add_feature_components_entry( hdb, "'orion', 'leo'" );
9029     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9030
9031     r = add_feature_components_entry( hdb, "'orion', 'virgo'" );
9032     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9033
9034     r = add_feature_components_entry( hdb, "'orion', 'libra'" );
9035     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9036
9037     r = add_feature_components_entry( hdb, "'orion', 'cassiopeia'" );
9038     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9039
9040     r = add_feature_components_entry( hdb, "'orion', 'cepheus'" );
9041     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9042
9043     r = add_feature_components_entry( hdb, "'orion', 'andromeda'" );
9044     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9045
9046     r = add_feature_components_entry( hdb, "'orion', 'canis'" );
9047     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9048
9049     r = add_feature_components_entry( hdb, "'orion', 'monoceros'" );
9050     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9051
9052     r = add_feature_components_entry( hdb, "'orion', 'lepus'" );
9053     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9054
9055     r = add_feature_components_entry( hdb, "'waters', 'delphinus'" );
9056     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9057
9058     r = add_feature_components_entry( hdb, "'bayer', 'hydrus'" );
9059     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
9060
9061     r = add_file_entry( hdb, "'leo_file', 'leo', 'leo.txt', 100, '', '1033', 8192, 1" );
9062     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9063
9064     r = add_file_entry( hdb, "'virgo_file', 'virgo', 'virgo.txt', 0, '', '1033', 8192, 1" );
9065     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9066
9067     r = add_file_entry( hdb, "'libra_file', 'libra', 'libra.txt', 0, '', '1033', 8192, 1" );
9068     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9069
9070     r = add_file_entry( hdb, "'cassiopeia_file', 'cassiopeia', 'cassiopeia.txt', 0, '', '1033', 8192, 1" );
9071     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9072
9073     r = add_file_entry( hdb, "'cepheus_file', 'cepheus', 'cepheus.txt', 0, '', '1033', 8192, 1" );
9074     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9075
9076     r = add_file_entry( hdb, "'andromeda_file', 'andromeda', 'andromeda.txt', 0, '', '1033', 8192, 1" );
9077     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9078
9079     r = add_file_entry( hdb, "'canis_file', 'canis', 'canis.txt', 0, '', '1033', 8192, 1" );
9080     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9081
9082     r = add_file_entry( hdb, "'monoceros_file', 'monoceros', 'monoceros.txt', 0, '', '1033', 8192, 1" );
9083     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9084
9085     r = add_file_entry( hdb, "'lepus_file', 'lepus', 'lepus.txt', 0, '', '1033', 8192, 1" );
9086     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9087
9088     r = add_file_entry( hdb, "'delphinus_file', 'delphinus', 'delphinus.txt', 0, '', '1033', 8192, 1" );
9089     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9090
9091     r = add_file_entry( hdb, "'hydrus_file', 'hydrus', 'hydrus.txt', 0, '', '1033', 8192, 1" );
9092     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
9093
9094     hpkg = package_from_db( hdb );
9095     ok( hpkg, "failed to create package\n");
9096
9097     MsiCloseHandle( hdb );
9098
9099     r = MsiDoAction( hpkg, "CostInitialize");
9100     ok( r == ERROR_SUCCESS, "cost init failed\n");
9101
9102     r = MsiDoAction( hpkg, "FileCost");
9103     ok( r == ERROR_SUCCESS, "file cost failed\n");
9104
9105     r = MsiDoAction( hpkg, "CostFinalize");
9106     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
9107
9108     state = 0xdeadbee;
9109     action = 0xdeadbee;
9110     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
9111     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9112     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9113     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9114
9115     state = 0xdeadbee;
9116     action = 0xdeadbee;
9117     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
9118     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9119     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9120     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
9121
9122     state = 0xdeadbee;
9123     action = 0xdeadbee;
9124     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
9125     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9126     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9127     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9128
9129     state = 0xdeadbee;
9130     action = 0xdeadbee;
9131     r = MsiGetFeatureState(hpkg, "waters", &state, &action);
9132     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9133     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9134     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
9135
9136     state = 0xdeadbee;
9137     action = 0xdeadbee;
9138     r = MsiGetFeatureState(hpkg, "bayer", &state, &action);
9139     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9140     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
9141     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
9142
9143     state = 0xdeadbee;
9144     action = 0xdeadbee;
9145     r = MsiGetComponentState(hpkg, "leo", &state, &action);
9146     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9147     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
9148     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
9149
9150     state = 0xdeadbee;
9151     action = 0xdeadbee;
9152     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
9153     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9154     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
9155     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
9156
9157     state = 0xdeadbee;
9158     action = 0xdeadbee;
9159     r = MsiGetComponentState(hpkg, "libra", &state, &action);
9160     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9161     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
9162     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
9163
9164     state = 0xdeadbee;
9165     action = 0xdeadbee;
9166     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
9167     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9168     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
9169     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
9170
9171     state = 0xdeadbee;
9172     action = 0xdeadbee;
9173     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
9174     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9175     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
9176     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
9177
9178     state = 0xdeadbee;
9179     action = 0xdeadbee;
9180     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
9181     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9182     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
9183     ok( action == INSTALLSTATE_LOCAL, "Expected andromeda INSTALLSTATE_LOCAL, got %d\n", action);
9184
9185     state = 0xdeadbee;
9186     action = 0xdeadbee;
9187     r = MsiGetComponentState(hpkg, "canis", &state, &action);
9188     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9189     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
9190     ok( action == INSTALLSTATE_LOCAL, "Expected canis INSTALLSTATE_LOCAL, got %d\n", action);
9191
9192     state = 0xdeadbee;
9193     action = 0xdeadbee;
9194     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
9195     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9196     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
9197     ok( action == INSTALLSTATE_SOURCE, "Expected monoceros INSTALLSTATE_SOURCE, got %d\n", action);
9198
9199     state = 0xdeadbee;
9200     action = 0xdeadbee;
9201     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
9202     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9203     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
9204     ok( action == INSTALLSTATE_LOCAL, "Expected lepus INSTALLSTATE_LOCAL, got %d\n", action);
9205
9206     state = 0xdeadbee;
9207     action = 0xdeadbee;
9208     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
9209     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9210     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
9211     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
9212
9213     state = 0xdeadbee;
9214     action = 0xdeadbee;
9215     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
9216     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9217     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
9218     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
9219
9220     r = MsiSetFeatureState(hpkg, "orion", INSTALLSTATE_ABSENT);
9221     ok( r == ERROR_SUCCESS, "failed to set feature state: %d\n", r);
9222
9223     state = 0xdeadbee;
9224     action = 0xdeadbee;
9225     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
9226     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9227     ok( state == INSTALLSTATE_ABSENT, "Expected zodiac INSTALLSTATE_ABSENT, got %d\n", state);
9228     ok( action == INSTALLSTATE_LOCAL, "Expected zodiac INSTALLSTATE_LOCAL, got %d\n", action);
9229
9230     state = 0xdeadbee;
9231     action = 0xdeadbee;
9232     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
9233     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9234     ok( state == INSTALLSTATE_ABSENT, "Expected perseus INSTALLSTATE_ABSENT, got %d\n", state);
9235     ok( action == INSTALLSTATE_SOURCE, "Expected perseus INSTALLSTATE_SOURCE, got %d\n", action);
9236
9237     state = 0xdeadbee;
9238     action = 0xdeadbee;
9239     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
9240     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9241     ok( state == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", state);
9242     ok( action == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", action);
9243
9244     state = 0xdeadbee;
9245     action = 0xdeadbee;
9246     r = MsiGetComponentState(hpkg, "leo", &state, &action);
9247     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9248     ok( state == INSTALLSTATE_UNKNOWN, "Expected leo INSTALLSTATE_UNKNOWN, got %d\n", state);
9249     ok( action == INSTALLSTATE_LOCAL, "Expected leo INSTALLSTATE_LOCAL, got %d\n", action);
9250
9251     state = 0xdeadbee;
9252     action = 0xdeadbee;
9253     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
9254     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9255     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
9256     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
9257
9258     state = 0xdeadbee;
9259     action = 0xdeadbee;
9260     r = MsiGetComponentState(hpkg, "libra", &state, &action);
9261     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9262     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
9263     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
9264
9265     state = 0xdeadbee;
9266     action = 0xdeadbee;
9267     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
9268     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9269     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
9270     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
9271
9272     state = 0xdeadbee;
9273     action = 0xdeadbee;
9274     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
9275     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9276     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
9277     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
9278
9279     state = 0xdeadbee;
9280     action = 0xdeadbee;
9281     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
9282     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9283     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
9284     ok( action == INSTALLSTATE_SOURCE, "Expected andromeda INSTALLSTATE_SOURCE, got %d\n", action);
9285
9286     state = 0xdeadbee;
9287     action = 0xdeadbee;
9288     r = MsiGetComponentState(hpkg, "canis", &state, &action);
9289     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9290     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
9291     ok( action == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", action);
9292
9293     state = 0xdeadbee;
9294     action = 0xdeadbee;
9295     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
9296     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9297     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
9298     ok( action == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", action);
9299
9300     state = 0xdeadbee;
9301     action = 0xdeadbee;
9302     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
9303     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9304     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
9305     ok( action == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", action);
9306
9307     state = 0xdeadbee;
9308     action = 0xdeadbee;
9309     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
9310     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9311     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
9312     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
9313
9314     state = 0xdeadbee;
9315     action = 0xdeadbee;
9316     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
9317     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
9318     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
9319     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
9320     
9321     MsiCloseHandle(hpkg);
9322     DeleteFileA(msifile);
9323 }
9324
9325 static void test_installprops(void)
9326 {
9327     MSIHANDLE hpkg, hdb;
9328     CHAR path[MAX_PATH];
9329     CHAR buf[MAX_PATH];
9330     DWORD size, type;
9331     LANGID langid;
9332     HKEY hkey1, hkey2;
9333     int res;
9334     UINT r;
9335
9336     GetCurrentDirectory(MAX_PATH, path);
9337     lstrcat(path, "\\");
9338     lstrcat(path, msifile);
9339
9340     hdb = create_package_db();
9341     ok( hdb, "failed to create database\n");
9342
9343     hpkg = package_from_db(hdb);
9344     ok( hpkg, "failed to create package\n");
9345
9346     MsiCloseHandle(hdb);
9347
9348     size = MAX_PATH;
9349     r = MsiGetProperty(hpkg, "DATABASE", buf, &size);
9350     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9351     ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9352
9353     RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\MS Setup (ACME)\\User Info", &hkey1);
9354
9355     RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hkey2);
9356
9357     size = MAX_PATH;
9358     type = REG_SZ;
9359     *path = '\0';
9360     if (RegQueryValueEx(hkey1, "DefName", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
9361     {
9362         size = MAX_PATH;
9363         type = REG_SZ;
9364         RegQueryValueEx(hkey2, "RegisteredOwner", NULL, &type, (LPBYTE)path, &size);
9365     }
9366
9367     /* win9x doesn't set this */
9368     if (*path)
9369     {
9370         size = MAX_PATH;
9371         r = MsiGetProperty(hpkg, "USERNAME", buf, &size);
9372         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9373         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9374     }
9375
9376     size = MAX_PATH;
9377     type = REG_SZ;
9378     *path = '\0';
9379     if (RegQueryValueEx(hkey1, "DefCompany", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
9380     {
9381         size = MAX_PATH;
9382         type = REG_SZ;
9383         RegQueryValueEx(hkey2, "RegisteredOrganization", NULL, &type, (LPBYTE)path, &size);
9384     }
9385
9386     if (*path)
9387     {
9388         size = MAX_PATH;
9389         r = MsiGetProperty(hpkg, "COMPANYNAME", buf, &size);
9390         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9391         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
9392     }
9393
9394     size = MAX_PATH;
9395     r = MsiGetProperty(hpkg, "VersionDatabase", buf, &size);
9396     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9397     trace("VersionDatabase = %s\n", buf);
9398
9399     size = MAX_PATH;
9400     r = MsiGetProperty(hpkg, "VersionMsi", buf, &size);
9401     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9402     trace("VersionMsi = %s\n", buf);
9403
9404     size = MAX_PATH;
9405     r = MsiGetProperty(hpkg, "Date", buf, &size);
9406     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9407     trace("Date = %s\n", buf);
9408
9409     size = MAX_PATH;
9410     r = MsiGetProperty(hpkg, "Time", buf, &size);
9411     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9412     trace("Time = %s\n", buf);
9413
9414     size = MAX_PATH;
9415     r = MsiGetProperty(hpkg, "PackageCode", buf, &size);
9416     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
9417     trace("PackageCode = %s\n", buf);
9418
9419     langid = GetUserDefaultLangID();
9420     sprintf(path, "%d", langid);
9421
9422     size = MAX_PATH;
9423     r = MsiGetProperty(hpkg, "UserLanguageID", buf, &size);
9424     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS< got %d\n", r);
9425     ok( !lstrcmpA(buf, path), "Expected \"%s\", got \"%s\"\n", path, buf);
9426
9427     res = GetSystemMetrics(SM_CXSCREEN);
9428     size = MAX_PATH;
9429     r = MsiGetProperty(hpkg, "ScreenX", buf, &size);
9430     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
9431
9432     res = GetSystemMetrics(SM_CYSCREEN);
9433     size = MAX_PATH;
9434     r = MsiGetProperty(hpkg, "ScreenY", buf, &size);
9435     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
9436
9437     CloseHandle(hkey1);
9438     CloseHandle(hkey2);
9439     MsiCloseHandle(hpkg);
9440     DeleteFile(msifile);
9441 }
9442
9443 static void test_launchconditions(void)
9444 {
9445     MSIHANDLE hpkg;
9446     MSIHANDLE hdb;
9447     UINT r;
9448
9449     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
9450
9451     hdb = create_package_db();
9452     ok( hdb, "failed to create package database\n" );
9453
9454     r = create_launchcondition_table( hdb );
9455     ok( r == ERROR_SUCCESS, "cannot create LaunchCondition table: %d\n", r );
9456
9457     r = add_launchcondition_entry( hdb, "'X = \"1\"', 'one'" );
9458     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
9459
9460     /* invalid condition */
9461     r = add_launchcondition_entry( hdb, "'X != \"1\"', 'one'" );
9462     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
9463
9464     hpkg = package_from_db( hdb );
9465     ok( hpkg, "failed to create package\n");
9466
9467     MsiCloseHandle( hdb );
9468
9469     r = MsiSetProperty( hpkg, "X", "1" );
9470     ok( r == ERROR_SUCCESS, "failed to set property\n" );
9471
9472     /* invalid conditions are ignored */
9473     r = MsiDoAction( hpkg, "LaunchConditions" );
9474     ok( r == ERROR_SUCCESS, "cost init failed\n" );
9475
9476     /* verify LaunchConditions still does some verification */
9477     r = MsiSetProperty( hpkg, "X", "2" );
9478     ok( r == ERROR_SUCCESS, "failed to set property\n" );
9479
9480     r = MsiDoAction( hpkg, "LaunchConditions" );
9481     ok( r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %d\n", r );
9482
9483     MsiCloseHandle( hpkg );
9484     DeleteFile( msifile );
9485 }
9486
9487 static void test_ccpsearch(void)
9488 {
9489     MSIHANDLE hdb, hpkg;
9490     CHAR prop[MAX_PATH];
9491     DWORD size = MAX_PATH;
9492     UINT r;
9493
9494     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
9495
9496     hdb = create_package_db();
9497     ok(hdb, "failed to create package database\n");
9498
9499     r = create_ccpsearch_table(hdb);
9500     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9501
9502     r = add_ccpsearch_entry(hdb, "'CCP_random'");
9503     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9504
9505     r = add_ccpsearch_entry(hdb, "'RMCCP_random'");
9506     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9507
9508     r = create_reglocator_table(hdb);
9509     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9510
9511     r = add_reglocator_entry(hdb, "'CCP_random', 0, 'htmlfile\\shell\\open\\nonexistent', '', 1");
9512     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9513
9514     r = create_drlocator_table(hdb);
9515     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9516
9517     r = add_drlocator_entry(hdb, "'RMCCP_random', '', 'C:\\', '0'");
9518     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9519
9520     r = create_signature_table(hdb);
9521     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9522
9523     hpkg = package_from_db(hdb);
9524     ok(hpkg, "failed to create package\n");
9525
9526     MsiCloseHandle(hdb);
9527
9528     r = MsiDoAction(hpkg, "CCPSearch");
9529     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9530
9531     r = MsiGetPropertyA(hpkg, "CCP_Success", prop, &size);
9532     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9533     ok(!lstrcmpA(prop, "1"), "Expected 1, got %s\n", prop);
9534
9535     MsiCloseHandle(hpkg);
9536     DeleteFileA(msifile);
9537 }
9538
9539 static void test_complocator(void)
9540 {
9541     MSIHANDLE hdb, hpkg;
9542     UINT r;
9543     CHAR prop[MAX_PATH];
9544     CHAR expected[MAX_PATH];
9545     DWORD size = MAX_PATH;
9546
9547     hdb = create_package_db();
9548     ok(hdb, "failed to create package database\n");
9549
9550     r = create_appsearch_table(hdb);
9551     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9552
9553     r = add_appsearch_entry(hdb, "'ABELISAURUS', 'abelisaurus'");
9554     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9555
9556     r = add_appsearch_entry(hdb, "'BACTROSAURUS', 'bactrosaurus'");
9557     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9558
9559     r = add_appsearch_entry(hdb, "'CAMELOTIA', 'camelotia'");
9560     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9561
9562     r = add_appsearch_entry(hdb, "'DICLONIUS', 'diclonius'");
9563     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9564
9565     r = add_appsearch_entry(hdb, "'ECHINODON', 'echinodon'");
9566     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9567
9568     r = add_appsearch_entry(hdb, "'FALCARIUS', 'falcarius'");
9569     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9570
9571     r = add_appsearch_entry(hdb, "'GALLIMIMUS', 'gallimimus'");
9572     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9573
9574     r = add_appsearch_entry(hdb, "'HAGRYPHUS', 'hagryphus'");
9575     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9576
9577     r = add_appsearch_entry(hdb, "'IGUANODON', 'iguanodon'");
9578     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9579
9580     r = add_appsearch_entry(hdb, "'JOBARIA', 'jobaria'");
9581     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9582
9583     r = add_appsearch_entry(hdb, "'KAKURU', 'kakuru'");
9584     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9585
9586     r = add_appsearch_entry(hdb, "'LABOCANIA', 'labocania'");
9587     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9588
9589     r = add_appsearch_entry(hdb, "'MEGARAPTOR', 'megaraptor'");
9590     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9591
9592     r = add_appsearch_entry(hdb, "'NEOSODON', 'neosodon'");
9593     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9594
9595     r = add_appsearch_entry(hdb, "'OLOROTITAN', 'olorotitan'");
9596     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9597
9598     r = add_appsearch_entry(hdb, "'PANTYDRACO', 'pantydraco'");
9599     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9600
9601     r = create_complocator_table(hdb);
9602     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9603
9604     r = add_complocator_entry(hdb, "'abelisaurus', '{E3619EED-305A-418C-B9C7-F7D7377F0934}', 1");
9605     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9606
9607     r = add_complocator_entry(hdb, "'bactrosaurus', '{D56B688D-542F-42Ef-90FD-B6DA76EE8119}', 0");
9608     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9609
9610     r = add_complocator_entry(hdb, "'camelotia', '{8211BE36-2466-47E3-AFB7-6AC72E51AED2}', 1");
9611     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9612
9613     r = add_complocator_entry(hdb, "'diclonius', '{5C767B20-A33C-45A4-B80B-555E512F01AE}', 0");
9614     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9615
9616     r = add_complocator_entry(hdb, "'echinodon', '{A19E16C5-C75D-4699-8111-C4338C40C3CB}', 1");
9617     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9618
9619     r = add_complocator_entry(hdb, "'falcarius', '{17762FA1-A7AE-4CC6-8827-62873C35361D}', 0");
9620     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9621
9622     r = add_complocator_entry(hdb, "'gallimimus', '{75EBF568-C959-41E0-A99E-9050638CF5FB}', 1");
9623     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9624
9625     r = add_complocator_entry(hdb, "'hagrphus', '{D4969B72-17D9-4AB6-BE49-78F2FEE857AC}', 0");
9626     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9627
9628     r = add_complocator_entry(hdb, "'iguanodon', '{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}', 1");
9629     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9630
9631     r = add_complocator_entry(hdb, "'jobaria', '{243C22B1-8C51-4151-B9D1-1AE5265E079E}', 0");
9632     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9633
9634     r = add_complocator_entry(hdb, "'kakuru', '{5D0F03BA-50BC-44F2-ABB1-72C972F4E514}', 1");
9635     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9636
9637     r = add_complocator_entry(hdb, "'labocania', '{C7DDB60C-7828-4046-A6F8-699D5E92F1ED}', 0");
9638     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9639
9640     r = add_complocator_entry(hdb, "'megaraptor', '{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}', 1");
9641     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9642
9643     r = add_complocator_entry(hdb, "'neosodon', '{0B499649-197A-48EF-93D2-AF1C17ED6E90}', 0");
9644     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9645
9646     r = add_complocator_entry(hdb, "'olorotitan', '{54E9E91F-AED2-46D5-A25A-7E50AFA24513}', 1");
9647     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9648
9649     r = add_complocator_entry(hdb, "'pantydraco', '{2A989951-5565-4FA7-93A7-E800A3E67D71}', 0");
9650     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9651
9652     r = create_signature_table(hdb);
9653     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9654
9655     r = add_signature_entry(hdb, "'abelisaurus', 'abelisaurus', '', '', '', '', '', '', ''");
9656     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9657
9658     r = add_signature_entry(hdb, "'bactrosaurus', 'bactrosaurus', '', '', '', '', '', '', ''");
9659     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9660
9661     r = add_signature_entry(hdb, "'camelotia', 'camelotia', '', '', '', '', '', '', ''");
9662     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9663
9664     r = add_signature_entry(hdb, "'diclonius', 'diclonius', '', '', '', '', '', '', ''");
9665     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9666
9667     r = add_signature_entry(hdb, "'iguanodon', 'iguanodon', '', '', '', '', '', '', ''");
9668     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9669
9670     r = add_signature_entry(hdb, "'jobaria', 'jobaria', '', '', '', '', '', '', ''");
9671     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9672
9673     r = add_signature_entry(hdb, "'kakuru', 'kakuru', '', '', '', '', '', '', ''");
9674     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9675
9676     r = add_signature_entry(hdb, "'labocania', 'labocania', '', '', '', '', '', '', ''");
9677     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9678
9679     hpkg = package_from_db(hdb);
9680     ok(hpkg, "failed to create package\n");
9681
9682     MsiCloseHandle(hdb);
9683
9684     create_test_file("abelisaurus");
9685     create_test_file("bactrosaurus");
9686     create_test_file("camelotia");
9687     create_test_file("diclonius");
9688     create_test_file("echinodon");
9689     create_test_file("falcarius");
9690     create_test_file("gallimimus");
9691     create_test_file("hagryphus");
9692     CreateDirectoryA("iguanodon", NULL);
9693     CreateDirectoryA("jobaria", NULL);
9694     CreateDirectoryA("kakuru", NULL);
9695     CreateDirectoryA("labocania", NULL);
9696     CreateDirectoryA("megaraptor", NULL);
9697     CreateDirectoryA("neosodon", NULL);
9698     CreateDirectoryA("olorotitan", NULL);
9699     CreateDirectoryA("pantydraco", NULL);
9700
9701     set_component_path("abelisaurus", MSIINSTALLCONTEXT_MACHINE,
9702                        "{E3619EED-305A-418C-B9C7-F7D7377F0934}", NULL, FALSE);
9703     set_component_path("bactrosaurus", MSIINSTALLCONTEXT_MACHINE,
9704                        "{D56B688D-542F-42Ef-90FD-B6DA76EE8119}", NULL, FALSE);
9705     set_component_path("echinodon", MSIINSTALLCONTEXT_MACHINE,
9706                        "{A19E16C5-C75D-4699-8111-C4338C40C3CB}", NULL, FALSE);
9707     set_component_path("falcarius", MSIINSTALLCONTEXT_MACHINE,
9708                        "{17762FA1-A7AE-4CC6-8827-62873C35361D}", NULL, FALSE);
9709     set_component_path("iguanodon", MSIINSTALLCONTEXT_MACHINE,
9710                        "{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}", NULL, FALSE);
9711     set_component_path("jobaria", MSIINSTALLCONTEXT_MACHINE,
9712                        "{243C22B1-8C51-4151-B9D1-1AE5265E079E}", NULL, FALSE);
9713     set_component_path("megaraptor", MSIINSTALLCONTEXT_MACHINE,
9714                        "{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}", NULL, FALSE);
9715     set_component_path("neosodon", MSIINSTALLCONTEXT_MACHINE,
9716                        "{0B499649-197A-48EF-93D2-AF1C17ED6E90}", NULL, FALSE);
9717
9718     r = MsiDoAction(hpkg, "AppSearch");
9719     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9720
9721     size = MAX_PATH;
9722     r = MsiGetPropertyA(hpkg, "ABELISAURUS", prop, &size);
9723     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9724
9725     lstrcpyA(expected, CURR_DIR);
9726     lstrcatA(expected, "\\abelisaurus");
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, "BACTROSAURUS", prop, &size);
9732     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9733     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9734
9735     size = MAX_PATH;
9736     r = MsiGetPropertyA(hpkg, "CAMELOTIA", prop, &size);
9737     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9738     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9739
9740     size = MAX_PATH;
9741     r = MsiGetPropertyA(hpkg, "DICLONIUS", prop, &size);
9742     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9743     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9744
9745     size = MAX_PATH;
9746     r = MsiGetPropertyA(hpkg, "ECHINODON", prop, &size);
9747     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9748
9749     lstrcpyA(expected, CURR_DIR);
9750     lstrcatA(expected, "\\");
9751     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9752        "Expected %s or empty string, got %s\n", expected, prop);
9753
9754     size = MAX_PATH;
9755     r = MsiGetPropertyA(hpkg, "FALCARIUS", prop, &size);
9756     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9757     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9758
9759     size = MAX_PATH;
9760     r = MsiGetPropertyA(hpkg, "GALLIMIMUS", prop, &size);
9761     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9762     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9763
9764     size = MAX_PATH;
9765     r = MsiGetPropertyA(hpkg, "HAGRYPHUS", prop, &size);
9766     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9767     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9768
9769     size = MAX_PATH;
9770     r = MsiGetPropertyA(hpkg, "IGUANODON", prop, &size);
9771     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9772     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9773
9774     size = MAX_PATH;
9775     r = MsiGetPropertyA(hpkg, "JOBARIA", prop, &size);
9776     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9777     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9778
9779     size = MAX_PATH;
9780     r = MsiGetPropertyA(hpkg, "KAKURU", prop, &size);
9781     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9782     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9783
9784     size = MAX_PATH;
9785     r = MsiGetPropertyA(hpkg, "LABOCANIA", prop, &size);
9786     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9787     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9788
9789     size = MAX_PATH;
9790     r = MsiGetPropertyA(hpkg, "MEGARAPTOR", prop, &size);
9791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9792
9793     lstrcpyA(expected, CURR_DIR);
9794     lstrcatA(expected, "\\");
9795     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9796        "Expected %s or empty string, got %s\n", expected, prop);
9797
9798     size = MAX_PATH;
9799     r = MsiGetPropertyA(hpkg, "NEOSODON", prop, &size);
9800     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9801
9802     lstrcpyA(expected, CURR_DIR);
9803     lstrcatA(expected, "\\neosodon\\");
9804     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
9805        "Expected %s or empty string, got %s\n", expected, prop);
9806
9807     size = MAX_PATH;
9808     r = MsiGetPropertyA(hpkg, "OLOROTITAN", prop, &size);
9809     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9810     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9811
9812     size = MAX_PATH;
9813     r = MsiGetPropertyA(hpkg, "PANTYDRACO", prop, &size);
9814     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9815     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
9816
9817     MsiCloseHandle(hpkg);
9818     DeleteFileA("abelisaurus");
9819     DeleteFileA("bactrosaurus");
9820     DeleteFileA("camelotia");
9821     DeleteFileA("diclonius");
9822     DeleteFileA("echinodon");
9823     DeleteFileA("falcarius");
9824     DeleteFileA("gallimimus");
9825     DeleteFileA("hagryphus");
9826     RemoveDirectoryA("iguanodon");
9827     RemoveDirectoryA("jobaria");
9828     RemoveDirectoryA("kakuru");
9829     RemoveDirectoryA("labocania");
9830     RemoveDirectoryA("megaraptor");
9831     RemoveDirectoryA("neosodon");
9832     RemoveDirectoryA("olorotitan");
9833     RemoveDirectoryA("pantydraco");
9834     delete_component_path("{E3619EED-305A-418C-B9C7-F7D7377F0934}",
9835                           MSIINSTALLCONTEXT_MACHINE, NULL);
9836     delete_component_path("{D56B688D-542F-42Ef-90FD-B6DA76EE8119}",
9837                           MSIINSTALLCONTEXT_MACHINE, NULL);
9838     delete_component_path("{A19E16C5-C75D-4699-8111-C4338C40C3CB}",
9839                           MSIINSTALLCONTEXT_MACHINE, NULL);
9840     delete_component_path("{17762FA1-A7AE-4CC6-8827-62873C35361D}",
9841                           MSIINSTALLCONTEXT_MACHINE, NULL);
9842     delete_component_path("{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}",
9843                           MSIINSTALLCONTEXT_MACHINE, NULL);
9844     delete_component_path("{243C22B1-8C51-4151-B9D1-1AE5265E079E}",
9845                           MSIINSTALLCONTEXT_MACHINE, NULL);
9846     delete_component_path("{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}",
9847                           MSIINSTALLCONTEXT_MACHINE, NULL);
9848     delete_component_path("{0B499649-197A-48EF-93D2-AF1C17ED6E90}",
9849                           MSIINSTALLCONTEXT_MACHINE, NULL);
9850     DeleteFileA(msifile);
9851 }
9852
9853 static void set_suminfo_prop(MSIHANDLE db, DWORD prop, DWORD val)
9854 {
9855     MSIHANDLE summary;
9856     UINT r;
9857
9858     r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
9859     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9860
9861     r = MsiSummaryInfoSetPropertyA(summary, prop, VT_I4, val, NULL, NULL);
9862     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9863
9864     r = MsiSummaryInfoPersist(summary);
9865     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
9866
9867     MsiCloseHandle(summary);
9868 }
9869
9870 static void test_MsiGetSourcePath(void)
9871 {
9872     MSIHANDLE hdb, hpkg;
9873     CHAR path[MAX_PATH];
9874     CHAR cwd[MAX_PATH];
9875     CHAR subsrc[MAX_PATH];
9876     CHAR sub2[MAX_PATH];
9877     DWORD size;
9878     UINT r;
9879
9880     lstrcpyA(cwd, CURR_DIR);
9881     lstrcatA(cwd, "\\");
9882
9883     lstrcpyA(subsrc, cwd);
9884     lstrcatA(subsrc, "subsource");
9885     lstrcatA(subsrc, "\\");
9886
9887     lstrcpyA(sub2, subsrc);
9888     lstrcatA(sub2, "sub2");
9889     lstrcatA(sub2, "\\");
9890
9891     /* uncompressed source */
9892
9893     hdb = create_package_db();
9894     ok( hdb, "failed to create database\n");
9895
9896     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
9897
9898     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
9899     ok(r == S_OK, "failed\n");
9900
9901     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'subtarget:subsource'");
9902     ok(r == S_OK, "failed\n");
9903
9904     r = add_directory_entry(hdb, "'SubDir2', 'SubDir', 'sub2'");
9905     ok(r == S_OK, "failed\n");
9906
9907     r = MsiDatabaseCommit(hdb);
9908     ok(r == ERROR_SUCCESS , "Failed to commit database\n");
9909
9910     hpkg = package_from_db(hdb);
9911     ok(hpkg, "failed to create package\n");
9912
9913     MsiCloseHandle(hdb);
9914
9915     /* invalid database handle */
9916     size = MAX_PATH;
9917     lstrcpyA(path, "kiwi");
9918     r = MsiGetSourcePath(-1, "TARGETDIR", path, &size);
9919     ok(r == ERROR_INVALID_HANDLE,
9920        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
9921     ok(!lstrcmpA(path, "kiwi"),
9922        "Expected path to be unchanged, got \"%s\"\n", path);
9923     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9924
9925     /* NULL szFolder */
9926     size = MAX_PATH;
9927     lstrcpyA(path, "kiwi");
9928     r = MsiGetSourcePath(hpkg, NULL, path, &size);
9929     ok(r == ERROR_INVALID_PARAMETER,
9930        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
9931     ok(!lstrcmpA(path, "kiwi"),
9932        "Expected path to be unchanged, got \"%s\"\n", path);
9933     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9934
9935     /* empty szFolder */
9936     size = MAX_PATH;
9937     lstrcpyA(path, "kiwi");
9938     r = MsiGetSourcePath(hpkg, "", path, &size);
9939     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9940     ok(!lstrcmpA(path, "kiwi"),
9941        "Expected path to be unchanged, got \"%s\"\n", path);
9942     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9943
9944     /* try TARGETDIR */
9945     size = MAX_PATH;
9946     lstrcpyA(path, "kiwi");
9947     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
9948     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9949     ok(!lstrcmpA(path, "kiwi"),
9950        "Expected path to be unchanged, got \"%s\"\n", path);
9951     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9952
9953     /* try SourceDir */
9954     size = MAX_PATH;
9955     lstrcpyA(path, "kiwi");
9956     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9957     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9958     ok(!lstrcmpA(path, "kiwi"),
9959        "Expected path to be unchanged, got \"%s\"\n", path);
9960     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9961
9962     /* try SOURCEDIR */
9963     size = MAX_PATH;
9964     lstrcpyA(path, "kiwi");
9965     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9966     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9967     ok(!lstrcmpA(path, "kiwi"),
9968        "Expected path to be unchanged, got \"%s\"\n", path);
9969     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9970
9971     /* source path does not exist, but the property exists */
9972     size = MAX_PATH;
9973     lstrcpyA(path, "kiwi");
9974     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9975     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9976     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9977     ok(size == 0, "Expected 0, got %d\n", size);
9978
9979     /* try SubDir */
9980     size = MAX_PATH;
9981     lstrcpyA(path, "kiwi");
9982     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
9983     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9984     ok(!lstrcmpA(path, "kiwi"),
9985        "Expected path to be unchanged, got \"%s\"\n", path);
9986     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9987
9988     /* try SubDir2 */
9989     size = MAX_PATH;
9990     lstrcpyA(path, "kiwi");
9991     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
9992     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9993     ok(!lstrcmpA(path, "kiwi"),
9994        "Expected path to be unchanged, got \"%s\"\n", path);
9995     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9996
9997     r = MsiDoAction(hpkg, "CostInitialize");
9998     ok(r == ERROR_SUCCESS, "cost init failed\n");
9999
10000     /* try TARGETDIR after CostInitialize */
10001     size = MAX_PATH;
10002     lstrcpyA(path, "kiwi");
10003     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10004     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10005     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10006     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10007
10008     /* try SourceDir after CostInitialize */
10009     size = MAX_PATH;
10010     lstrcpyA(path, "kiwi");
10011     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10012     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10013     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10014     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10015
10016     /* try SOURCEDIR after CostInitialize */
10017     size = MAX_PATH;
10018     lstrcpyA(path, "kiwi");
10019     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10020     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10021     ok(!lstrcmpA(path, "kiwi"),
10022        "Expected path to be unchanged, got \"%s\"\n", path);
10023     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10024
10025     /* source path does not exist, but the property exists */
10026     size = MAX_PATH;
10027     lstrcpyA(path, "kiwi");
10028     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10029     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10030     todo_wine
10031     {
10032         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10033         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10034     }
10035
10036     /* try SubDir after CostInitialize */
10037     size = MAX_PATH;
10038     lstrcpyA(path, "kiwi");
10039     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10040     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10041     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10042     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10043
10044     /* try SubDir2 after CostInitialize */
10045     size = MAX_PATH;
10046     lstrcpyA(path, "kiwi");
10047     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10048     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10049     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10050     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10051
10052     r = MsiDoAction(hpkg, "ResolveSource");
10053     ok(r == ERROR_SUCCESS, "file cost failed\n");
10054
10055     /* try TARGETDIR after ResolveSource */
10056     size = MAX_PATH;
10057     lstrcpyA(path, "kiwi");
10058     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10059     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10060     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10061     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10062
10063     /* try SourceDir after ResolveSource */
10064     size = MAX_PATH;
10065     lstrcpyA(path, "kiwi");
10066     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10067     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10068     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10069     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10070
10071     /* try SOURCEDIR after ResolveSource */
10072     size = MAX_PATH;
10073     lstrcpyA(path, "kiwi");
10074     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10075     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10076     ok(!lstrcmpA(path, "kiwi"),
10077        "Expected path to be unchanged, got \"%s\"\n", path);
10078     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10079
10080     /* source path does not exist, but the property exists */
10081     size = MAX_PATH;
10082     lstrcpyA(path, "kiwi");
10083     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10084     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10085     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10086     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10087
10088     /* try SubDir after ResolveSource */
10089     size = MAX_PATH;
10090     lstrcpyA(path, "kiwi");
10091     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10092     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10093     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10094     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10095
10096     /* try SubDir2 after ResolveSource */
10097     size = MAX_PATH;
10098     lstrcpyA(path, "kiwi");
10099     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10100     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10101     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10102     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10103
10104     r = MsiDoAction(hpkg, "FileCost");
10105     ok(r == ERROR_SUCCESS, "file cost failed\n");
10106
10107     /* try TARGETDIR after FileCost */
10108     size = MAX_PATH;
10109     lstrcpyA(path, "kiwi");
10110     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10111     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10112     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10113     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10114
10115     /* try SourceDir after FileCost */
10116     size = MAX_PATH;
10117     lstrcpyA(path, "kiwi");
10118     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10119     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10120     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10121     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10122
10123     /* try SOURCEDIR after FileCost */
10124     size = MAX_PATH;
10125     lstrcpyA(path, "kiwi");
10126     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10127     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10128     ok(!lstrcmpA(path, "kiwi"),
10129        "Expected path to be unchanged, got \"%s\"\n", path);
10130     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10131
10132     /* source path does not exist, but the property exists */
10133     size = MAX_PATH;
10134     lstrcpyA(path, "kiwi");
10135     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10136     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10137     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10138     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10139
10140     /* try SubDir after FileCost */
10141     size = MAX_PATH;
10142     lstrcpyA(path, "kiwi");
10143     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10144     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10145     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10146     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10147
10148     /* try SubDir2 after FileCost */
10149     size = MAX_PATH;
10150     lstrcpyA(path, "kiwi");
10151     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10152     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10153     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10154     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10155
10156     r = MsiDoAction(hpkg, "CostFinalize");
10157     ok(r == ERROR_SUCCESS, "file cost failed\n");
10158
10159     /* try TARGETDIR after CostFinalize */
10160     size = MAX_PATH;
10161     lstrcpyA(path, "kiwi");
10162     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10163     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10164     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10165     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10166
10167     /* try SourceDir after CostFinalize */
10168     size = MAX_PATH;
10169     lstrcpyA(path, "kiwi");
10170     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10171     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10172     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10173     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10174
10175     /* try SOURCEDIR after CostFinalize */
10176     size = MAX_PATH;
10177     lstrcpyA(path, "kiwi");
10178     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10179     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10180     ok(!lstrcmpA(path, "kiwi"),
10181        "Expected path to be unchanged, got \"%s\"\n", path);
10182     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10183
10184     /* source path does not exist, but the property exists */
10185     size = MAX_PATH;
10186     lstrcpyA(path, "kiwi");
10187     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10188     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10189     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10190     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10191
10192     /* try SubDir after CostFinalize */
10193     size = MAX_PATH;
10194     lstrcpyA(path, "kiwi");
10195     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10196     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10197     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10198     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10199
10200     /* try SubDir2 after CostFinalize */
10201     size = MAX_PATH;
10202     lstrcpyA(path, "kiwi");
10203     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10204     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10205     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
10206     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
10207
10208     /* nonexistent directory */
10209     size = MAX_PATH;
10210     lstrcpyA(path, "kiwi");
10211     r = MsiGetSourcePath(hpkg, "IDontExist", path, &size);
10212     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10213     ok(!lstrcmpA(path, "kiwi"),
10214        "Expected path to be unchanged, got \"%s\"\n", path);
10215     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10216
10217     /* NULL szPathBuf */
10218     size = MAX_PATH;
10219     r = MsiGetSourcePath(hpkg, "SourceDir", NULL, &size);
10220     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10221     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10222
10223     /* NULL pcchPathBuf */
10224     lstrcpyA(path, "kiwi");
10225     r = MsiGetSourcePath(hpkg, "SourceDir", path, NULL);
10226     ok(r == ERROR_INVALID_PARAMETER,
10227        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
10228     ok(!lstrcmpA(path, "kiwi"),
10229        "Expected path to be unchanged, got \"%s\"\n", path);
10230
10231     /* pcchPathBuf is 0 */
10232     size = 0;
10233     lstrcpyA(path, "kiwi");
10234     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10235     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
10236     ok(!lstrcmpA(path, "kiwi"),
10237        "Expected path to be unchanged, got \"%s\"\n", path);
10238     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10239
10240     /* pcchPathBuf does not have room for NULL terminator */
10241     size = lstrlenA(cwd);
10242     lstrcpyA(path, "kiwi");
10243     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10244     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
10245     ok(!strncmp(path, cwd, lstrlenA(cwd) - 1),
10246        "Expected path with no backslash, got \"%s\"\n", path);
10247     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10248
10249     /* pcchPathBuf has room for NULL terminator */
10250     size = lstrlenA(cwd) + 1;
10251     lstrcpyA(path, "kiwi");
10252     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10253     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10254     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10255     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10256
10257     MsiCloseHandle(hpkg);
10258
10259     /* compressed source */
10260
10261     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
10262     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10263
10264     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeCompressed);
10265
10266     hpkg = package_from_db(hdb);
10267     ok(hpkg, "failed to create package\n");
10268
10269     /* try TARGETDIR */
10270     size = MAX_PATH;
10271     lstrcpyA(path, "kiwi");
10272     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10273     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10274     ok(!lstrcmpA(path, "kiwi"),
10275        "Expected path to be unchanged, got \"%s\"\n", path);
10276     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10277
10278     /* try SourceDir */
10279     size = MAX_PATH;
10280     lstrcpyA(path, "kiwi");
10281     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10282     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10283     ok(!lstrcmpA(path, "kiwi"),
10284        "Expected path to be unchanged, got \"%s\"\n", path);
10285     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10286
10287     /* try SOURCEDIR */
10288     size = MAX_PATH;
10289     lstrcpyA(path, "kiwi");
10290     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10291     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10292     ok(!lstrcmpA(path, "kiwi"),
10293        "Expected path to be unchanged, got \"%s\"\n", path);
10294     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10295
10296     /* source path nor the property exist */
10297     size = MAX_PATH;
10298     lstrcpyA(path, "kiwi");
10299     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10300     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10301     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10302     ok(size == 0, "Expected 0, got %d\n", size);
10303
10304     /* try SubDir */
10305     size = MAX_PATH;
10306     lstrcpyA(path, "kiwi");
10307     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10308     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10309     ok(!lstrcmpA(path, "kiwi"),
10310        "Expected path to be unchanged, got \"%s\"\n", path);
10311     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10312
10313     /* try SubDir2 */
10314     size = MAX_PATH;
10315     lstrcpyA(path, "kiwi");
10316     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10317     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
10318     ok(!lstrcmpA(path, "kiwi"),
10319        "Expected path to be unchanged, got \"%s\"\n", path);
10320     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
10321
10322     r = MsiDoAction(hpkg, "CostInitialize");
10323     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10324
10325     /* try TARGETDIR after CostInitialize */
10326     size = MAX_PATH;
10327     lstrcpyA(path, "kiwi");
10328     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10329     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10330     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10331     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10332
10333     /* try SourceDir after CostInitialize */
10334     size = MAX_PATH;
10335     lstrcpyA(path, "kiwi");
10336     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10337     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10338     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10339     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10340
10341     /* try SOURCEDIR after CostInitialize */
10342     size = MAX_PATH;
10343     lstrcpyA(path, "kiwi");
10344     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10345     todo_wine
10346     {
10347         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10348         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10349         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10350     }
10351
10352     /* source path does not exist, but the property exists */
10353     size = MAX_PATH;
10354     lstrcpyA(path, "kiwi");
10355     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10356     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10357     todo_wine
10358     {
10359         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10360         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10361     }
10362
10363     /* try SubDir after CostInitialize */
10364     size = MAX_PATH;
10365     lstrcpyA(path, "kiwi");
10366     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10367     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10368     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10369     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10370
10371     /* try SubDir2 after CostInitialize */
10372     size = MAX_PATH;
10373     lstrcpyA(path, "kiwi");
10374     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10375     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10376     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10377     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10378
10379     r = MsiDoAction(hpkg, "ResolveSource");
10380     ok(r == ERROR_SUCCESS, "file cost failed\n");
10381
10382     /* try TARGETDIR after ResolveSource */
10383     size = MAX_PATH;
10384     lstrcpyA(path, "kiwi");
10385     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10386     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10387     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10388     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10389
10390     /* try SourceDir after ResolveSource */
10391     size = MAX_PATH;
10392     lstrcpyA(path, "kiwi");
10393     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10394     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10395     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10396     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10397
10398     /* try SOURCEDIR after ResolveSource */
10399     size = MAX_PATH;
10400     lstrcpyA(path, "kiwi");
10401     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10402     todo_wine
10403     {
10404         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10405         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10406         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10407     }
10408
10409     /* source path and the property exist */
10410     size = MAX_PATH;
10411     lstrcpyA(path, "kiwi");
10412     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10413     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10414     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10415     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10416
10417     /* try SubDir after ResolveSource */
10418     size = MAX_PATH;
10419     lstrcpyA(path, "kiwi");
10420     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10421     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10422     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10423     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10424
10425     /* try SubDir2 after ResolveSource */
10426     size = MAX_PATH;
10427     lstrcpyA(path, "kiwi");
10428     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10429     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10430     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10431     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10432
10433     r = MsiDoAction(hpkg, "FileCost");
10434     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10435
10436     /* try TARGETDIR after CostFinalize */
10437     size = MAX_PATH;
10438     lstrcpyA(path, "kiwi");
10439     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10440     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10441     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10442     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10443
10444     /* try SourceDir after CostFinalize */
10445     size = MAX_PATH;
10446     lstrcpyA(path, "kiwi");
10447     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10448     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10449     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10450     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10451
10452     /* try SOURCEDIR after CostFinalize */
10453     size = MAX_PATH;
10454     lstrcpyA(path, "kiwi");
10455     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10456     todo_wine
10457     {
10458         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10459         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10460         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10461     }
10462
10463     /* source path and the property exist */
10464     size = MAX_PATH;
10465     lstrcpyA(path, "kiwi");
10466     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10467     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10468     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10469     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10470
10471     /* try SubDir after CostFinalize */
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, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10477     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10478
10479     /* try SubDir2 after CostFinalize */
10480     size = MAX_PATH;
10481     lstrcpyA(path, "kiwi");
10482     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10483     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10484     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10485     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10486
10487     r = MsiDoAction(hpkg, "CostFinalize");
10488     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10489
10490     /* try TARGETDIR after CostFinalize */
10491     size = MAX_PATH;
10492     lstrcpyA(path, "kiwi");
10493     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
10494     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10495     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10496     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10497
10498     /* try SourceDir after CostFinalize */
10499     size = MAX_PATH;
10500     lstrcpyA(path, "kiwi");
10501     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
10502     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10503     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10504     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10505
10506     /* try SOURCEDIR after CostFinalize */
10507     size = MAX_PATH;
10508     lstrcpyA(path, "kiwi");
10509     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
10510     todo_wine
10511     {
10512         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10513         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10514         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10515     }
10516
10517     /* source path and the property exist */
10518     size = MAX_PATH;
10519     lstrcpyA(path, "kiwi");
10520     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10521     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10522     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10523     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10524
10525     /* try SubDir after CostFinalize */
10526     size = MAX_PATH;
10527     lstrcpyA(path, "kiwi");
10528     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10529     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10530     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10531     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10532
10533     /* try SubDir2 after CostFinalize */
10534     size = MAX_PATH;
10535     lstrcpyA(path, "kiwi");
10536     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10537     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10538     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10539     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10540
10541     MsiCloseHandle(hpkg);
10542     DeleteFile(msifile);
10543 }
10544
10545 static void test_shortlongsource(void)
10546 {
10547     MSIHANDLE hdb, hpkg;
10548     CHAR path[MAX_PATH];
10549     CHAR cwd[MAX_PATH];
10550     CHAR subsrc[MAX_PATH];
10551     DWORD size;
10552     UINT r;
10553
10554     lstrcpyA(cwd, CURR_DIR);
10555     lstrcatA(cwd, "\\");
10556
10557     lstrcpyA(subsrc, cwd);
10558     lstrcatA(subsrc, "long");
10559     lstrcatA(subsrc, "\\");
10560
10561     /* long file names */
10562
10563     hdb = create_package_db();
10564     ok( hdb, "failed to create database\n");
10565
10566     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
10567
10568     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
10569     ok(r == S_OK, "failed\n");
10570
10571     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'short|long'");
10572     ok(r == S_OK, "failed\n");
10573
10574     /* CostInitialize:short */
10575     r = add_directory_entry(hdb, "'SubDir2', 'TARGETDIR', 'one|two'");
10576     ok(r == S_OK, "failed\n");
10577
10578     /* CostInitialize:long */
10579     r = add_directory_entry(hdb, "'SubDir3', 'TARGETDIR', 'three|four'");
10580     ok(r == S_OK, "failed\n");
10581
10582     /* FileCost:short */
10583     r = add_directory_entry(hdb, "'SubDir4', 'TARGETDIR', 'five|six'");
10584     ok(r == S_OK, "failed\n");
10585
10586     /* FileCost:long */
10587     r = add_directory_entry(hdb, "'SubDir5', 'TARGETDIR', 'seven|eight'");
10588     ok(r == S_OK, "failed\n");
10589
10590     /* CostFinalize:short */
10591     r = add_directory_entry(hdb, "'SubDir6', 'TARGETDIR', 'nine|ten'");
10592     ok(r == S_OK, "failed\n");
10593
10594     /* CostFinalize:long */
10595     r = add_directory_entry(hdb, "'SubDir7', 'TARGETDIR', 'eleven|twelve'");
10596     ok(r == S_OK, "failed\n");
10597
10598     MsiDatabaseCommit(hdb);
10599
10600     hpkg = package_from_db(hdb);
10601     ok(hpkg, "failed to create package\n");
10602
10603     MsiCloseHandle(hdb);
10604
10605     CreateDirectoryA("one", NULL);
10606     CreateDirectoryA("four", NULL);
10607
10608     r = MsiDoAction(hpkg, "CostInitialize");
10609     ok(r == ERROR_SUCCESS, "file cost failed\n");
10610
10611     CreateDirectory("five", NULL);
10612     CreateDirectory("eight", NULL);
10613
10614     r = MsiDoAction(hpkg, "FileCost");
10615     ok(r == ERROR_SUCCESS, "file cost failed\n");
10616
10617     CreateDirectory("nine", NULL);
10618     CreateDirectory("twelve", NULL);
10619
10620     r = MsiDoAction(hpkg, "CostFinalize");
10621     ok(r == ERROR_SUCCESS, "file cost failed\n");
10622
10623     /* neither short nor long source directories exist */
10624     size = MAX_PATH;
10625     lstrcpyA(path, "kiwi");
10626     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10627     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10628     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10629     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10630
10631     CreateDirectoryA("short", NULL);
10632
10633     /* short source directory exists */
10634     size = MAX_PATH;
10635     lstrcpyA(path, "kiwi");
10636     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10637     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10638     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10639     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10640
10641     CreateDirectoryA("long", NULL);
10642
10643     /* both short and long source directories exist */
10644     size = MAX_PATH;
10645     lstrcpyA(path, "kiwi");
10646     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10647     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10648     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10649     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10650
10651     lstrcpyA(subsrc, cwd);
10652     lstrcatA(subsrc, "two");
10653     lstrcatA(subsrc, "\\");
10654
10655     /* short dir exists before CostInitialize */
10656     size = MAX_PATH;
10657     lstrcpyA(path, "kiwi");
10658     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10659     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10660     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10661     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10662
10663     lstrcpyA(subsrc, cwd);
10664     lstrcatA(subsrc, "four");
10665     lstrcatA(subsrc, "\\");
10666
10667     /* long dir exists before CostInitialize */
10668     size = MAX_PATH;
10669     lstrcpyA(path, "kiwi");
10670     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
10671     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10672     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10673     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10674
10675     lstrcpyA(subsrc, cwd);
10676     lstrcatA(subsrc, "six");
10677     lstrcatA(subsrc, "\\");
10678
10679     /* short dir exists before FileCost */
10680     size = MAX_PATH;
10681     lstrcpyA(path, "kiwi");
10682     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
10683     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10684     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10685     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10686
10687     lstrcpyA(subsrc, cwd);
10688     lstrcatA(subsrc, "eight");
10689     lstrcatA(subsrc, "\\");
10690
10691     /* long dir exists before FileCost */
10692     size = MAX_PATH;
10693     lstrcpyA(path, "kiwi");
10694     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
10695     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10696     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10697     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10698
10699     lstrcpyA(subsrc, cwd);
10700     lstrcatA(subsrc, "ten");
10701     lstrcatA(subsrc, "\\");
10702
10703     /* short dir exists before CostFinalize */
10704     size = MAX_PATH;
10705     lstrcpyA(path, "kiwi");
10706     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
10707     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10708     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10709     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10710
10711     lstrcpyA(subsrc, cwd);
10712     lstrcatA(subsrc, "twelve");
10713     lstrcatA(subsrc, "\\");
10714
10715     /* long dir exists before CostFinalize */
10716     size = MAX_PATH;
10717     lstrcpyA(path, "kiwi");
10718     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
10719     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10720     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10721     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10722
10723     MsiCloseHandle(hpkg);
10724     RemoveDirectoryA("short");
10725     RemoveDirectoryA("long");
10726     RemoveDirectoryA("one");
10727     RemoveDirectoryA("four");
10728     RemoveDirectoryA("five");
10729     RemoveDirectoryA("eight");
10730     RemoveDirectoryA("nine");
10731     RemoveDirectoryA("twelve");
10732
10733     /* short file names */
10734
10735     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
10736     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10737
10738     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeSFN);
10739
10740     hpkg = package_from_db(hdb);
10741     ok(hpkg, "failed to create package\n");
10742
10743     MsiCloseHandle(hdb);
10744
10745     CreateDirectoryA("one", NULL);
10746     CreateDirectoryA("four", NULL);
10747
10748     r = MsiDoAction(hpkg, "CostInitialize");
10749     ok(r == ERROR_SUCCESS, "file cost failed\n");
10750
10751     CreateDirectory("five", NULL);
10752     CreateDirectory("eight", NULL);
10753
10754     r = MsiDoAction(hpkg, "FileCost");
10755     ok(r == ERROR_SUCCESS, "file cost failed\n");
10756
10757     CreateDirectory("nine", NULL);
10758     CreateDirectory("twelve", NULL);
10759
10760     r = MsiDoAction(hpkg, "CostFinalize");
10761     ok(r == ERROR_SUCCESS, "file cost failed\n");
10762
10763     lstrcpyA(subsrc, cwd);
10764     lstrcatA(subsrc, "short");
10765     lstrcatA(subsrc, "\\");
10766
10767     /* neither short nor long source directories exist */
10768     size = MAX_PATH;
10769     lstrcpyA(path, "kiwi");
10770     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10771     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10772     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10773     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10774
10775     CreateDirectoryA("short", NULL);
10776
10777     /* short source directory exists */
10778     size = MAX_PATH;
10779     lstrcpyA(path, "kiwi");
10780     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10781     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10782     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10783     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10784
10785     CreateDirectoryA("long", NULL);
10786
10787     /* both short and long source directories exist */
10788     size = MAX_PATH;
10789     lstrcpyA(path, "kiwi");
10790     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
10791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10792     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10793     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10794
10795     lstrcpyA(subsrc, cwd);
10796     lstrcatA(subsrc, "one");
10797     lstrcatA(subsrc, "\\");
10798
10799     /* short dir exists before CostInitialize */
10800     size = MAX_PATH;
10801     lstrcpyA(path, "kiwi");
10802     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
10803     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10804     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10805     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10806
10807     lstrcpyA(subsrc, cwd);
10808     lstrcatA(subsrc, "three");
10809     lstrcatA(subsrc, "\\");
10810
10811     /* long dir exists before CostInitialize */
10812     size = MAX_PATH;
10813     lstrcpyA(path, "kiwi");
10814     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
10815     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10816     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10817     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10818
10819     lstrcpyA(subsrc, cwd);
10820     lstrcatA(subsrc, "five");
10821     lstrcatA(subsrc, "\\");
10822
10823     /* short dir exists before FileCost */
10824     size = MAX_PATH;
10825     lstrcpyA(path, "kiwi");
10826     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
10827     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10828     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10829     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10830
10831     lstrcpyA(subsrc, cwd);
10832     lstrcatA(subsrc, "seven");
10833     lstrcatA(subsrc, "\\");
10834
10835     /* long dir exists before FileCost */
10836     size = MAX_PATH;
10837     lstrcpyA(path, "kiwi");
10838     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
10839     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10840     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10841     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10842
10843     lstrcpyA(subsrc, cwd);
10844     lstrcatA(subsrc, "nine");
10845     lstrcatA(subsrc, "\\");
10846
10847     /* short dir exists before CostFinalize */
10848     size = MAX_PATH;
10849     lstrcpyA(path, "kiwi");
10850     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
10851     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10852     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10853     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10854
10855     lstrcpyA(subsrc, cwd);
10856     lstrcatA(subsrc, "eleven");
10857     lstrcatA(subsrc, "\\");
10858
10859     /* long dir exists before CostFinalize */
10860     size = MAX_PATH;
10861     lstrcpyA(path, "kiwi");
10862     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
10863     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10864     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
10865     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
10866
10867     MsiCloseHandle(hpkg);
10868     RemoveDirectoryA("short");
10869     RemoveDirectoryA("long");
10870     RemoveDirectoryA("one");
10871     RemoveDirectoryA("four");
10872     RemoveDirectoryA("five");
10873     RemoveDirectoryA("eight");
10874     RemoveDirectoryA("nine");
10875     RemoveDirectoryA("twelve");
10876     DeleteFileA(msifile);
10877 }
10878
10879 static void test_sourcedir(void)
10880 {
10881     MSIHANDLE hdb, hpkg;
10882     CHAR package[10];
10883     CHAR path[MAX_PATH];
10884     CHAR cwd[MAX_PATH];
10885     CHAR subsrc[MAX_PATH];
10886     DWORD size;
10887     UINT r;
10888
10889     lstrcpyA(cwd, CURR_DIR);
10890     lstrcatA(cwd, "\\");
10891
10892     lstrcpyA(subsrc, cwd);
10893     lstrcatA(subsrc, "long");
10894     lstrcatA(subsrc, "\\");
10895
10896     hdb = create_package_db();
10897     ok( hdb, "failed to create database\n");
10898
10899     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
10900     ok(r == S_OK, "failed\n");
10901
10902     sprintf(package, "#%i", hdb);
10903     r = MsiOpenPackage(package, &hpkg);
10904     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10905
10906     /* properties only */
10907
10908     /* SourceDir prop */
10909     size = MAX_PATH;
10910     lstrcpyA(path, "kiwi");
10911     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10912     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10913     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10914     ok(size == 0, "Expected 0, got %d\n", size);
10915
10916     /* SOURCEDIR prop */
10917     size = MAX_PATH;
10918     lstrcpyA(path, "kiwi");
10919     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10920     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10921     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10922     ok(size == 0, "Expected 0, got %d\n", size);
10923
10924     r = MsiDoAction(hpkg, "CostInitialize");
10925     ok(r == ERROR_SUCCESS, "file cost failed\n");
10926
10927     /* SourceDir after CostInitialize */
10928     size = MAX_PATH;
10929     lstrcpyA(path, "kiwi");
10930     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10931     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10932     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10933     ok(size == 0, "Expected 0, got %d\n", size);
10934
10935     /* SOURCEDIR after CostInitialize */
10936     size = MAX_PATH;
10937     lstrcpyA(path, "kiwi");
10938     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10939     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10940     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10941     ok(size == 0, "Expected 0, got %d\n", size);
10942
10943     r = MsiDoAction(hpkg, "FileCost");
10944     ok(r == ERROR_SUCCESS, "file cost failed\n");
10945
10946     /* SourceDir after FileCost */
10947     size = MAX_PATH;
10948     lstrcpyA(path, "kiwi");
10949     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10950     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10951     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10952     ok(size == 0, "Expected 0, got %d\n", size);
10953
10954     /* SOURCEDIR after FileCost */
10955     size = MAX_PATH;
10956     lstrcpyA(path, "kiwi");
10957     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10958     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10959     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10960     ok(size == 0, "Expected 0, got %d\n", size);
10961
10962     r = MsiDoAction(hpkg, "CostFinalize");
10963     ok(r == ERROR_SUCCESS, "file cost failed\n");
10964
10965     /* SourceDir after CostFinalize */
10966     size = MAX_PATH;
10967     lstrcpyA(path, "kiwi");
10968     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10969     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10970     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10971     ok(size == 0, "Expected 0, got %d\n", size);
10972
10973     /* SOURCEDIR after CostFinalize */
10974     size = MAX_PATH;
10975     lstrcpyA(path, "kiwi");
10976     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10977     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10978     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
10979     ok(size == 0, "Expected 0, got %d\n", size);
10980
10981     r = MsiDoAction(hpkg, "ResolveSource");
10982     ok(r == ERROR_SUCCESS, "file cost failed\n");
10983
10984     /* SourceDir after ResolveSource */
10985     size = MAX_PATH;
10986     lstrcpyA(path, "kiwi");
10987     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
10988     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10989     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10990     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10991
10992     /* SOURCEDIR after ResolveSource */
10993     size = MAX_PATH;
10994     lstrcpyA(path, "kiwi");
10995     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
10996     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
10997     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
10998     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
10999
11000     /* random casing */
11001     size = MAX_PATH;
11002     lstrcpyA(path, "kiwi");
11003     r = MsiGetProperty(hpkg, "SoUrCeDiR", path, &size);
11004     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11005     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11006     ok(size == 0, "Expected 0, got %d\n", size);
11007
11008     MsiCloseHandle(hpkg);
11009
11010     /* reset the package state */
11011     sprintf(package, "#%i", hdb);
11012     r = MsiOpenPackage(package, &hpkg);
11013     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11014
11015     /* test how MsiGetSourcePath affects the properties */
11016
11017     /* SourceDir prop */
11018     size = MAX_PATH;
11019     lstrcpyA(path, "kiwi");
11020     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11021     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11022     todo_wine
11023     {
11024         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11025         ok(size == 0, "Expected 0, got %d\n", size);
11026     }
11027
11028     size = MAX_PATH;
11029     lstrcpyA(path, "kiwi");
11030     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
11031     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11032     ok(!lstrcmpA(path, "kiwi"),
11033        "Expected path to be unchanged, got \"%s\"\n", path);
11034     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11035
11036     /* SourceDir after MsiGetSourcePath */
11037     size = MAX_PATH;
11038     lstrcpyA(path, "kiwi");
11039     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11040     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11041     todo_wine
11042     {
11043         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11044         ok(size == 0, "Expected 0, got %d\n", size);
11045     }
11046
11047     /* SOURCEDIR prop */
11048     size = MAX_PATH;
11049     lstrcpyA(path, "kiwi");
11050     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11051     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11052     todo_wine
11053     {
11054         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11055         ok(size == 0, "Expected 0, got %d\n", size);
11056     }
11057
11058     size = MAX_PATH;
11059     lstrcpyA(path, "kiwi");
11060     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
11061     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11062     ok(!lstrcmpA(path, "kiwi"),
11063        "Expected path to be unchanged, got \"%s\"\n", path);
11064     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11065
11066     /* SOURCEDIR prop after MsiGetSourcePath */
11067     size = MAX_PATH;
11068     lstrcpyA(path, "kiwi");
11069     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11070     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11071     todo_wine
11072     {
11073         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11074         ok(size == 0, "Expected 0, got %d\n", size);
11075     }
11076
11077     r = MsiDoAction(hpkg, "CostInitialize");
11078     ok(r == ERROR_SUCCESS, "file cost failed\n");
11079
11080     /* SourceDir after CostInitialize */
11081     size = MAX_PATH;
11082     lstrcpyA(path, "kiwi");
11083     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11084     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11085     todo_wine
11086     {
11087         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
11088         ok(size == 0, "Expected 0, got %d\n", size);
11089     }
11090
11091     size = MAX_PATH;
11092     lstrcpyA(path, "kiwi");
11093     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
11094     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11095     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11096     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11097
11098     /* SourceDir after MsiGetSourcePath */
11099     size = MAX_PATH;
11100     lstrcpyA(path, "kiwi");
11101     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11102     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11103     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11104     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11105
11106     /* SOURCEDIR after CostInitialize */
11107     size = MAX_PATH;
11108     lstrcpyA(path, "kiwi");
11109     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11110     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11111     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11112     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11113
11114     /* SOURCEDIR source path still does not exist */
11115     size = MAX_PATH;
11116     lstrcpyA(path, "kiwi");
11117     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
11118     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11119     ok(!lstrcmpA(path, "kiwi"),
11120        "Expected path to be unchanged, got \"%s\"\n", path);
11121     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11122
11123     r = MsiDoAction(hpkg, "FileCost");
11124     ok(r == ERROR_SUCCESS, "file cost failed\n");
11125
11126     /* SourceDir after FileCost */
11127     size = MAX_PATH;
11128     lstrcpyA(path, "kiwi");
11129     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11130     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11131     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11132     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11133
11134     /* SOURCEDIR after FileCost */
11135     size = MAX_PATH;
11136     lstrcpyA(path, "kiwi");
11137     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11138     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11139     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11140     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11141
11142     /* SOURCEDIR source path still does not exist */
11143     size = MAX_PATH;
11144     lstrcpyA(path, "kiwi");
11145     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
11146     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11147     ok(!lstrcmpA(path, "kiwi"),
11148        "Expected path to be unchanged, got \"%s\"\n", path);
11149     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11150
11151     r = MsiDoAction(hpkg, "CostFinalize");
11152     ok(r == ERROR_SUCCESS, "file cost failed\n");
11153
11154     /* SourceDir after CostFinalize */
11155     size = MAX_PATH;
11156     lstrcpyA(path, "kiwi");
11157     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11158     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11159     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11160     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11161
11162     /* SOURCEDIR after CostFinalize */
11163     size = MAX_PATH;
11164     lstrcpyA(path, "kiwi");
11165     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11166     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11167     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11168     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11169
11170     /* SOURCEDIR source path still does not exist */
11171     size = MAX_PATH;
11172     lstrcpyA(path, "kiwi");
11173     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
11174     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11175     ok(!lstrcmpA(path, "kiwi"),
11176        "Expected path to be unchanged, got \"%s\"\n", path);
11177     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11178
11179     r = MsiDoAction(hpkg, "ResolveSource");
11180     ok(r == ERROR_SUCCESS, "file cost failed\n");
11181
11182     /* SourceDir after ResolveSource */
11183     size = MAX_PATH;
11184     lstrcpyA(path, "kiwi");
11185     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
11186     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11187     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11188     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11189
11190     /* SOURCEDIR after ResolveSource */
11191     size = MAX_PATH;
11192     lstrcpyA(path, "kiwi");
11193     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
11194     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11195     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
11196     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
11197
11198     /* SOURCEDIR source path still does not exist */
11199     size = MAX_PATH;
11200     lstrcpyA(path, "kiwi");
11201     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
11202     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
11203     ok(!lstrcmpA(path, "kiwi"),
11204        "Expected path to be unchanged, got \"%s\"\n", path);
11205     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11206
11207     MsiCloseHandle(hdb);
11208     MsiCloseHandle(hpkg);
11209     DeleteFileA(msifile);
11210 }
11211
11212 struct access_res
11213 {
11214     BOOL gothandle;
11215     DWORD lasterr;
11216     BOOL ignore;
11217 };
11218
11219 static const struct access_res create[16] =
11220 {
11221     { TRUE, ERROR_SUCCESS, TRUE },
11222     { TRUE, ERROR_SUCCESS, TRUE },
11223     { TRUE, ERROR_SUCCESS, FALSE },
11224     { TRUE, ERROR_SUCCESS, FALSE },
11225     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11226     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11227     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11228     { TRUE, ERROR_SUCCESS, FALSE },
11229     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11230     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11231     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11232     { TRUE, ERROR_SUCCESS, TRUE },
11233     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11234     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11235     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11236     { TRUE, ERROR_SUCCESS, TRUE }
11237 };
11238
11239 static const struct access_res create_commit[16] =
11240 {
11241     { TRUE, ERROR_SUCCESS, TRUE },
11242     { TRUE, ERROR_SUCCESS, TRUE },
11243     { TRUE, ERROR_SUCCESS, FALSE },
11244     { TRUE, ERROR_SUCCESS, FALSE },
11245     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11246     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11247     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11248     { TRUE, ERROR_SUCCESS, FALSE },
11249     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11250     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11251     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11252     { TRUE, ERROR_SUCCESS, TRUE },
11253     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11254     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11255     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
11256     { TRUE, ERROR_SUCCESS, TRUE }
11257 };
11258
11259 static const struct access_res create_close[16] =
11260 {
11261     { TRUE, ERROR_SUCCESS, FALSE },
11262     { TRUE, ERROR_SUCCESS, FALSE },
11263     { TRUE, ERROR_SUCCESS, FALSE },
11264     { TRUE, ERROR_SUCCESS, FALSE },
11265     { TRUE, ERROR_SUCCESS, FALSE },
11266     { TRUE, ERROR_SUCCESS, FALSE },
11267     { TRUE, ERROR_SUCCESS, FALSE },
11268     { TRUE, ERROR_SUCCESS, FALSE },
11269     { TRUE, ERROR_SUCCESS, FALSE },
11270     { TRUE, ERROR_SUCCESS, FALSE },
11271     { TRUE, ERROR_SUCCESS, FALSE },
11272     { TRUE, ERROR_SUCCESS, FALSE },
11273     { TRUE, ERROR_SUCCESS, FALSE },
11274     { TRUE, ERROR_SUCCESS, FALSE },
11275     { TRUE, ERROR_SUCCESS, FALSE },
11276     { TRUE, ERROR_SUCCESS }
11277 };
11278
11279 static void _test_file_access(LPCSTR file, const struct access_res *ares, DWORD line)
11280 {
11281     DWORD access = 0, share = 0;
11282     DWORD lasterr;
11283     HANDLE hfile;
11284     int i, j, idx = 0;
11285
11286     for (i = 0; i < 4; i++)
11287     {
11288         if (i == 0) access = 0;
11289         if (i == 1) access = GENERIC_READ;
11290         if (i == 2) access = GENERIC_WRITE;
11291         if (i == 3) access = GENERIC_READ | GENERIC_WRITE;
11292
11293         for (j = 0; j < 4; j++)
11294         {
11295             if (ares[idx].ignore)
11296                 continue;
11297
11298             if (j == 0) share = 0;
11299             if (j == 1) share = FILE_SHARE_READ;
11300             if (j == 2) share = FILE_SHARE_WRITE;
11301             if (j == 3) share = FILE_SHARE_READ | FILE_SHARE_WRITE;
11302
11303             SetLastError(0xdeadbeef);
11304             hfile = CreateFileA(file, access, share, NULL, OPEN_EXISTING,
11305                                 FILE_ATTRIBUTE_NORMAL, 0);
11306             lasterr = GetLastError();
11307
11308             ok((hfile != INVALID_HANDLE_VALUE) == ares[idx].gothandle,
11309                "(%d, handle, %d): Expected %d, got %d\n",
11310                line, idx, ares[idx].gothandle,
11311                (hfile != INVALID_HANDLE_VALUE));
11312
11313             ok(lasterr == ares[idx].lasterr ||
11314                lasterr == 0xdeadbeef, /* win9x */
11315                "(%d, lasterr, %d): Expected %d, got %d\n",
11316                line, idx, ares[idx].lasterr, lasterr);
11317
11318             CloseHandle(hfile);
11319             idx++;
11320         }
11321     }
11322 }
11323
11324 #define test_file_access(file, ares) _test_file_access(file, ares, __LINE__)
11325
11326 static void test_access(void)
11327 {
11328     MSIHANDLE hdb;
11329     UINT r;
11330
11331     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATE, &hdb);
11332     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11333
11334     test_file_access(msifile, create);
11335
11336     r = MsiDatabaseCommit(hdb);
11337     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11338
11339     test_file_access(msifile, create_commit);
11340
11341     MsiCloseHandle(hdb);
11342
11343     test_file_access(msifile, create_close);
11344
11345     DeleteFileA(msifile);
11346
11347     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATEDIRECT, &hdb);
11348     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11349
11350     test_file_access(msifile, create);
11351
11352     r = MsiDatabaseCommit(hdb);
11353     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11354
11355     test_file_access(msifile, create_commit);
11356
11357     MsiCloseHandle(hdb);
11358
11359     test_file_access(msifile, create_close);
11360
11361     DeleteFileA(msifile);
11362 }
11363
11364 static void test_emptypackage(void)
11365 {
11366     MSIHANDLE hpkg = 0, hdb = 0, hsuminfo = 0;
11367     MSIHANDLE hview = 0, hrec = 0;
11368     MSICONDITION condition;
11369     CHAR buffer[MAX_PATH];
11370     DWORD size;
11371     UINT r;
11372
11373     r = MsiOpenPackageA("", &hpkg);
11374     todo_wine
11375     {
11376         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11377     }
11378
11379     hdb = MsiGetActiveDatabase(hpkg);
11380     todo_wine
11381     {
11382         ok(hdb != 0, "Expected a valid database handle\n");
11383     }
11384
11385     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Tables`", &hview);
11386     todo_wine
11387     {
11388         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11389     }
11390     r = MsiViewExecute(hview, 0);
11391     todo_wine
11392     {
11393         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11394     }
11395
11396     r = MsiViewFetch(hview, &hrec);
11397     todo_wine
11398     {
11399         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11400     }
11401
11402     buffer[0] = 0;
11403     size = MAX_PATH;
11404     r = MsiRecordGetString(hrec, 1, buffer, &size);
11405     todo_wine
11406     {
11407         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11408         ok(!lstrcmpA(buffer, "_Property"),
11409            "Expected \"_Property\", got \"%s\"\n", buffer);
11410     }
11411
11412     MsiCloseHandle(hrec);
11413
11414     r = MsiViewFetch(hview, &hrec);
11415     todo_wine
11416     {
11417         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11418     }
11419
11420     size = MAX_PATH;
11421     r = MsiRecordGetString(hrec, 1, buffer, &size);
11422     todo_wine
11423     {
11424         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11425         ok(!lstrcmpA(buffer, "#_FolderCache"),
11426            "Expected \"_Property\", got \"%s\"\n", buffer);
11427     }
11428
11429     MsiCloseHandle(hrec);
11430     MsiViewClose(hview);
11431     MsiCloseHandle(hview);
11432
11433     condition = MsiDatabaseIsTablePersistentA(hdb, "_Property");
11434     todo_wine
11435     {
11436         ok(condition == MSICONDITION_FALSE,
11437            "Expected MSICONDITION_FALSE, got %d\n", condition);
11438     }
11439
11440     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
11441     todo_wine
11442     {
11443         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11444     }
11445     r = MsiViewExecute(hview, 0);
11446     todo_wine
11447     {
11448         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11449     }
11450
11451     /* _Property table is not empty */
11452     r = MsiViewFetch(hview, &hrec);
11453     todo_wine
11454     {
11455         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11456     }
11457
11458     MsiCloseHandle(hrec);
11459     MsiViewClose(hview);
11460     MsiCloseHandle(hview);
11461
11462     condition = MsiDatabaseIsTablePersistentA(hdb, "#_FolderCache");
11463     todo_wine
11464     {
11465         ok(condition == MSICONDITION_FALSE,
11466            "Expected MSICONDITION_FALSE, got %d\n", condition);
11467     }
11468
11469     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `#_FolderCache`", &hview);
11470     todo_wine
11471     {
11472         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11473     }
11474     r = MsiViewExecute(hview, 0);
11475     todo_wine
11476     {
11477         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11478     }
11479
11480     /* #_FolderCache is not empty */
11481     r = MsiViewFetch(hview, &hrec);
11482     todo_wine
11483     {
11484         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11485     }
11486
11487     MsiCloseHandle(hrec);
11488     MsiViewClose(hview);
11489     MsiCloseHandle(hview);
11490
11491     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Streams`", &hview);
11492     todo_wine
11493     {
11494         ok(r == ERROR_BAD_QUERY_SYNTAX,
11495            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11496     }
11497
11498     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Storages`", &hview);
11499     todo_wine
11500     {
11501         ok(r == ERROR_BAD_QUERY_SYNTAX,
11502            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11503     }
11504
11505     r = MsiGetSummaryInformationA(hdb, NULL, 0, &hsuminfo);
11506     todo_wine
11507     {
11508         ok(r == ERROR_INSTALL_PACKAGE_INVALID,
11509            "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
11510     }
11511
11512     MsiCloseHandle(hsuminfo);
11513
11514     r = MsiDatabaseCommit(hdb);
11515     todo_wine
11516     {
11517         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11518     }
11519
11520     MsiCloseHandle(hdb);
11521     MsiCloseHandle(hpkg);
11522 }
11523
11524 static void test_MsiGetProductProperty(void)
11525 {
11526     MSIHANDLE hprod, hdb;
11527     CHAR val[MAX_PATH];
11528     CHAR path[MAX_PATH];
11529     CHAR query[MAX_PATH];
11530     CHAR keypath[MAX_PATH*2];
11531     CHAR prodcode[MAX_PATH];
11532     CHAR prod_squashed[MAX_PATH];
11533     HKEY prodkey, userkey, props;
11534     DWORD size;
11535     LONG res;
11536     UINT r;
11537     SC_HANDLE scm;
11538
11539     scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
11540     if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
11541     {
11542         win_skip("Different registry keys on Win9x and WinMe\n");
11543         return;
11544     }
11545     CloseServiceHandle(scm);
11546
11547     GetCurrentDirectoryA(MAX_PATH, path);
11548     lstrcatA(path, "\\");
11549
11550     create_test_guid(prodcode, prod_squashed);
11551
11552     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
11553     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11554
11555     r = MsiDatabaseCommit(hdb);
11556     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11557
11558     r = set_summary_info(hdb);
11559     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11560
11561     r = run_query(hdb,
11562             "CREATE TABLE `Directory` ( "
11563             "`Directory` CHAR(255) NOT NULL, "
11564             "`Directory_Parent` CHAR(255), "
11565             "`DefaultDir` CHAR(255) NOT NULL "
11566             "PRIMARY KEY `Directory`)");
11567     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11568
11569     r = run_query(hdb,
11570             "CREATE TABLE `Property` ( "
11571             "`Property` CHAR(72) NOT NULL, "
11572             "`Value` CHAR(255) "
11573             "PRIMARY KEY `Property`)");
11574     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11575
11576     sprintf(query, "INSERT INTO `Property` "
11577             "(`Property`, `Value`) "
11578             "VALUES( 'ProductCode', '%s' )", prodcode);
11579     r = run_query(hdb, query);
11580     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11581
11582     r = MsiDatabaseCommit(hdb);
11583     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11584
11585     MsiCloseHandle(hdb);
11586
11587     lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
11588     lstrcatA(keypath, prod_squashed);
11589
11590     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
11591     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11592
11593     lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\");
11594     lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\");
11595     lstrcatA(keypath, prod_squashed);
11596
11597     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
11598     if (res == ERROR_ACCESS_DENIED)
11599     {
11600         skip("Not enough rights to perform tests\n");
11601         RegDeleteKeyA(prodkey, "");
11602         RegCloseKey(prodkey);
11603         return;
11604     }
11605     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11606
11607     res = RegCreateKeyA(userkey, "InstallProperties", &props);
11608     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11609
11610     lstrcpyA(val, path);
11611     lstrcatA(val, "\\");
11612     lstrcatA(val, msifile);
11613     res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
11614                          (const BYTE *)val, lstrlenA(val) + 1);
11615     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
11616
11617     hprod = 0xdeadbeef;
11618     r = MsiOpenProductA(prodcode, &hprod);
11619     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11620     ok(hprod != 0 && hprod != 0xdeadbeef, "Expected a valid product handle\n");
11621
11622     /* hProduct is invalid */
11623     size = MAX_PATH;
11624     lstrcpyA(val, "apple");
11625     r = MsiGetProductPropertyA(0xdeadbeef, "ProductCode", val, &size);
11626     ok(r == ERROR_INVALID_HANDLE,
11627        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11628     ok(!lstrcmpA(val, "apple"),
11629        "Expected val to be unchanged, got \"%s\"\n", val);
11630     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11631
11632     /* szProperty is NULL */
11633     size = MAX_PATH;
11634     lstrcpyA(val, "apple");
11635     r = MsiGetProductPropertyA(hprod, NULL, val, &size);
11636     ok(r == ERROR_INVALID_PARAMETER,
11637        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11638     ok(!lstrcmpA(val, "apple"),
11639        "Expected val to be unchanged, got \"%s\"\n", val);
11640     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
11641
11642     /* szProperty is empty */
11643     size = MAX_PATH;
11644     lstrcpyA(val, "apple");
11645     r = MsiGetProductPropertyA(hprod, "", val, &size);
11646     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11647     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11648     ok(size == 0, "Expected 0, got %d\n", size);
11649
11650     /* get the property */
11651     size = MAX_PATH;
11652     lstrcpyA(val, "apple");
11653     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11654     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11655     ok(!lstrcmpA(val, prodcode),
11656        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11657     ok(size == lstrlenA(prodcode),
11658        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11659
11660     /* lpValueBuf is NULL */
11661     size = MAX_PATH;
11662     r = MsiGetProductPropertyA(hprod, "ProductCode", NULL, &size);
11663     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11664     ok(size == lstrlenA(prodcode),
11665        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11666
11667     /* pcchValueBuf is NULL */
11668     lstrcpyA(val, "apple");
11669     r = MsiGetProductPropertyA(hprod, "ProductCode", val, NULL);
11670     ok(r == ERROR_INVALID_PARAMETER,
11671        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11672     ok(!lstrcmpA(val, "apple"),
11673        "Expected val to be unchanged, got \"%s\"\n", val);
11674     ok(size == lstrlenA(prodcode),
11675        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11676
11677     /* pcchValueBuf is too small */
11678     size = 4;
11679     lstrcpyA(val, "apple");
11680     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11681     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
11682     ok(!strncmp(val, prodcode, 3),
11683        "Expected first 3 chars of \"%s\", got \"%s\"\n", prodcode, val);
11684     ok(size == lstrlenA(prodcode),
11685        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11686
11687     /* pcchValueBuf does not leave room for NULL terminator */
11688     size = lstrlenA(prodcode);
11689     lstrcpyA(val, "apple");
11690     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11691     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
11692     ok(!strncmp(val, prodcode, lstrlenA(prodcode) - 1),
11693        "Expected first 37 chars of \"%s\", got \"%s\"\n", prodcode, val);
11694     ok(size == lstrlenA(prodcode),
11695        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11696
11697     /* pcchValueBuf has enough room for NULL terminator */
11698     size = lstrlenA(prodcode) + 1;
11699     lstrcpyA(val, "apple");
11700     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11701     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11702     ok(!lstrcmpA(val, prodcode),
11703        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11704     ok(size == lstrlenA(prodcode),
11705        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11706
11707     /* nonexistent property */
11708     size = MAX_PATH;
11709     lstrcpyA(val, "apple");
11710     r = MsiGetProductPropertyA(hprod, "IDontExist", val, &size);
11711     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11712     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11713     ok(size == 0, "Expected 0, got %d\n", size);
11714
11715     r = MsiSetPropertyA(hprod, "NewProperty", "value");
11716     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11717
11718     /* non-product property set */
11719     size = MAX_PATH;
11720     lstrcpyA(val, "apple");
11721     r = MsiGetProductPropertyA(hprod, "NewProperty", val, &size);
11722     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11723     ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
11724     ok(size == 0, "Expected 0, got %d\n", size);
11725
11726     r = MsiSetPropertyA(hprod, "ProductCode", "value");
11727     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11728
11729     /* non-product property that is also a product property set */
11730     size = MAX_PATH;
11731     lstrcpyA(val, "apple");
11732     r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
11733     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11734     ok(!lstrcmpA(val, prodcode),
11735        "Expected \"%s\", got \"%s\"\n", prodcode, val);
11736     ok(size == lstrlenA(prodcode),
11737        "Expected %d, got %d\n", lstrlenA(prodcode), size);
11738
11739     MsiCloseHandle(hprod);
11740
11741     RegDeleteValueA(props, "LocalPackage");
11742     RegDeleteKeyA(props, "");
11743     RegCloseKey(props);
11744     RegDeleteKeyA(userkey, "");
11745     RegCloseKey(userkey);
11746     RegDeleteKeyA(prodkey, "");
11747     RegCloseKey(prodkey);
11748     DeleteFileA(msifile);
11749 }
11750
11751 static void test_MsiSetProperty(void)
11752 {
11753     MSIHANDLE hpkg, hdb, hrec;
11754     CHAR buf[MAX_PATH];
11755     LPCSTR query;
11756     DWORD size;
11757     UINT r;
11758
11759     hpkg = package_from_db(create_package_db());
11760     ok(hpkg != 0, "Expected a valid package\n");
11761
11762     /* invalid hInstall */
11763     r = MsiSetPropertyA(0, "Prop", "Val");
11764     ok(r == ERROR_INVALID_HANDLE,
11765        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11766
11767     /* invalid hInstall */
11768     r = MsiSetPropertyA(0xdeadbeef, "Prop", "Val");
11769     ok(r == ERROR_INVALID_HANDLE,
11770        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
11771
11772     /* szName is NULL */
11773     r = MsiSetPropertyA(hpkg, NULL, "Val");
11774     ok(r == ERROR_INVALID_PARAMETER,
11775        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11776
11777     /* both szName and szValue are NULL */
11778     r = MsiSetPropertyA(hpkg, NULL, NULL);
11779     ok(r == ERROR_INVALID_PARAMETER,
11780        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
11781
11782     /* szName is empty */
11783     r = MsiSetPropertyA(hpkg, "", "Val");
11784     ok(r == ERROR_FUNCTION_FAILED,
11785        "Expected ERROR_FUNCTION_FAILED, got %d\n", r);
11786
11787     /* szName is empty and szValue is NULL */
11788     r = MsiSetPropertyA(hpkg, "", NULL);
11789     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11790
11791     /* set a property */
11792     r = MsiSetPropertyA(hpkg, "Prop", "Val");
11793     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11794
11795     /* get the property */
11796     size = MAX_PATH;
11797     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11798     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11799     ok(!lstrcmpA(buf, "Val"), "Expected \"Val\", got \"%s\"\n", buf);
11800     ok(size == 3, "Expected 3, got %d\n", size);
11801
11802     /* update the property */
11803     r = MsiSetPropertyA(hpkg, "Prop", "Nuvo");
11804     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11805
11806     /* get the property */
11807     size = MAX_PATH;
11808     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11809     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11810     ok(!lstrcmpA(buf, "Nuvo"), "Expected \"Nuvo\", got \"%s\"\n", buf);
11811     ok(size == 4, "Expected 4, got %d\n", size);
11812
11813     hdb = MsiGetActiveDatabase(hpkg);
11814     ok(hdb != 0, "Expected a valid database handle\n");
11815
11816     /* set prop is not in the _Property table */
11817     query = "SELECT * FROM `_Property` WHERE `Property` = 'Prop'";
11818     r = do_query(hdb, query, &hrec);
11819     ok(r == ERROR_BAD_QUERY_SYNTAX,
11820        "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11821
11822     /* set prop is not in the Property table */
11823     query = "SELECT * FROM `Property` WHERE `Property` = 'Prop'";
11824     r = do_query(hdb, query, &hrec);
11825     ok(r == ERROR_BAD_QUERY_SYNTAX,
11826        "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
11827
11828     MsiCloseHandle(hdb);
11829
11830     /* szValue is an empty string */
11831     r = MsiSetPropertyA(hpkg, "Prop", "");
11832     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11833
11834     /* try to get the property */
11835     size = MAX_PATH;
11836     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11837     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11838     ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
11839     ok(size == 0, "Expected 0, got %d\n", size);
11840
11841     /* reset the property */
11842     r = MsiSetPropertyA(hpkg, "Prop", "BlueTap");
11843     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11844
11845     /* delete the property */
11846     r = MsiSetPropertyA(hpkg, "Prop", NULL);
11847     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11848
11849     /* try to get the property */
11850     size = MAX_PATH;
11851     r = MsiGetPropertyA(hpkg, "Prop", buf, &size);
11852     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
11853     ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
11854     ok(size == 0, "Expected 0, got %d\n", size);
11855
11856     MsiCloseHandle(hpkg);
11857     DeleteFileA(msifile);
11858 }
11859
11860 static void test_MsiApplyMultiplePatches(void)
11861 {
11862     UINT r, type = GetDriveType(NULL);
11863
11864     if (!pMsiApplyMultiplePatchesA) {
11865         win_skip("MsiApplyMultiplePatchesA not found\n");
11866         return;
11867     }
11868
11869     r = pMsiApplyMultiplePatchesA(NULL, NULL, NULL);
11870     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11871
11872     r = pMsiApplyMultiplePatchesA("", NULL, NULL);
11873     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11874
11875     r = pMsiApplyMultiplePatchesA(";", NULL, NULL);
11876     todo_wine
11877     {
11878         if (type == DRIVE_FIXED)
11879             ok(r == ERROR_PATH_NOT_FOUND,
11880                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11881         else
11882             ok(r == ERROR_INVALID_NAME,
11883                "Expected ERROR_INVALID_NAME, got %u\n", r);
11884     }
11885
11886     r = pMsiApplyMultiplePatchesA("  ;", NULL, NULL);
11887     todo_wine
11888     {
11889         if (type == DRIVE_FIXED)
11890             ok(r == ERROR_PATCH_PACKAGE_OPEN_FAILED,
11891                "Expected ERROR_PATCH_PACKAGE_OPEN_FAILED, got %u\n", r);
11892         else
11893             ok(r == ERROR_INVALID_NAME,
11894                "Expected ERROR_INVALID_NAME, got %u\n", r);
11895     }
11896
11897     r = pMsiApplyMultiplePatchesA(";;", NULL, NULL);
11898     todo_wine
11899     {
11900         if (type == DRIVE_FIXED)
11901             ok(r == ERROR_PATH_NOT_FOUND,
11902                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11903         else
11904             ok(r == ERROR_INVALID_NAME,
11905                "Expected ERROR_INVALID_NAME, got %u\n", r);
11906     }
11907
11908     r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;", NULL, NULL);
11909     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11910
11911     r = pMsiApplyMultiplePatchesA(";nosuchpatchpackage", NULL, NULL);
11912     todo_wine
11913     {
11914         if (type == DRIVE_FIXED)
11915             ok(r == ERROR_PATH_NOT_FOUND,
11916                "Expected ERROR_PATH_NOT_FOUND, got %u\n", r);
11917         else
11918             ok(r == ERROR_INVALID_NAME,
11919                "Expected ERROR_INVALID_NAME, got %u\n", r);
11920     }
11921
11922     r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;nosuchpatchpackage", NULL, NULL);
11923     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11924
11925     r = pMsiApplyMultiplePatchesA("  nosuchpatchpackage  ;  nosuchpatchpackage  ", NULL, NULL);
11926     todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r);
11927 }
11928
11929 static void test_MsiApplyPatch(void)
11930 {
11931     UINT r;
11932
11933     r = MsiApplyPatch(NULL, NULL, INSTALLTYPE_DEFAULT, NULL);
11934     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11935
11936     r = MsiApplyPatch("", NULL, INSTALLTYPE_DEFAULT, NULL);
11937     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
11938 }
11939
11940 START_TEST(package)
11941 {
11942     STATEMGRSTATUS status;
11943     BOOL ret = FALSE;
11944
11945     init_functionpointers();
11946
11947     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
11948
11949     /* Create a restore point ourselves so we circumvent the multitude of restore points
11950      * that would have been created by all the installation and removal tests.
11951      */
11952     if (pSRSetRestorePointA)
11953     {
11954         memset(&status, 0, sizeof(status));
11955         ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status);
11956     }
11957
11958     test_createpackage();
11959     test_doaction();
11960     test_gettargetpath_bad();
11961     test_settargetpath();
11962     test_props();
11963     test_property_table();
11964     test_condition();
11965     test_msipackage();
11966     test_formatrecord2();
11967     test_states();
11968     test_getproperty();
11969     test_removefiles();
11970     test_appsearch();
11971     test_appsearch_complocator();
11972     test_appsearch_reglocator();
11973     test_appsearch_inilocator();
11974     test_appsearch_drlocator();
11975     test_featureparents();
11976     test_installprops();
11977     test_launchconditions();
11978     test_ccpsearch();
11979     test_complocator();
11980     test_MsiGetSourcePath();
11981     test_shortlongsource();
11982     test_sourcedir();
11983     test_access();
11984     test_emptypackage();
11985     test_MsiGetProductProperty();
11986     test_MsiSetProperty();
11987     test_MsiApplyMultiplePatches();
11988     test_MsiApplyPatch();
11989
11990     if (pSRSetRestorePointA && ret)
11991     {
11992         ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status);
11993         if (ret)
11994             remove_restore_point(status.llSequenceNumber);
11995     }
11996 }