msi: Add more tests for the RegLocator part of the AppSearch action.
[wine] / dlls / msi / tests / package.c
1 /*
2  * tests for Microsoft Installer functionality
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  * Copyright 2005 Aric Stewart for CodeWeavers
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #define COBJMACROS
23
24 #include <stdio.h>
25 #include <windows.h>
26 #include <msidefs.h>
27 #include <msi.h>
28 #include <msiquery.h>
29
30 #include "wine/test.h"
31
32 static const char msifile[] = "winetest.msi";
33 char CURR_DIR[MAX_PATH];
34
35 static void get_user_sid(LPSTR *usersid)
36 {
37     HANDLE token;
38     BYTE buf[1024];
39     DWORD size;
40     PTOKEN_USER user;
41     HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
42     static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
43
44     *usersid = NULL;
45     pConvertSidToStringSidA = (void *)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
46     if (!pConvertSidToStringSidA)
47         return;
48
49     OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
50     size = sizeof(buf);
51     GetTokenInformation(token, TokenUser, (void *)buf, size, &size);
52     user = (PTOKEN_USER)buf;
53     pConvertSidToStringSidA(user->User.Sid, usersid);
54 }
55
56 /* RegDeleteTreeW from dlls/advapi32/registry.c */
57 LSTATUS WINAPI package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
58 {
59     LONG ret;
60     DWORD dwMaxSubkeyLen, dwMaxValueLen;
61     DWORD dwMaxLen, dwSize;
62     WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
63     HKEY hSubKey = hKey;
64
65     if(lpszSubKey)
66     {
67         ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
68         if (ret) return ret;
69     }
70
71     ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
72             &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
73     if (ret) goto cleanup;
74
75     dwMaxSubkeyLen++;
76     dwMaxValueLen++;
77     dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
78     if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
79     {
80         /* Name too big: alloc a buffer for it */
81         if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
82         {
83             ret = ERROR_NOT_ENOUGH_MEMORY;
84             goto cleanup;
85         }
86     }
87
88     /* Recursively delete all the subkeys */
89     while (TRUE)
90     {
91         dwSize = dwMaxLen;
92         if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
93                           NULL, NULL, NULL)) break;
94
95         ret = package_RegDeleteTreeW(hSubKey, lpszName);
96         if (ret) goto cleanup;
97     }
98
99     if (lpszSubKey)
100         ret = RegDeleteKeyW(hKey, lpszSubKey);
101     else
102         while (TRUE)
103         {
104             dwSize = dwMaxLen;
105             if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
106                   NULL, NULL, NULL, NULL)) break;
107
108             ret = RegDeleteValueW(hKey, lpszName);
109             if (ret) goto cleanup;
110         }
111
112 cleanup:
113     if (lpszName != szNameBuf)
114         HeapFree(GetProcessHeap(), 0, lpszName);
115     if(lpszSubKey)
116         RegCloseKey(hSubKey);
117     return ret;
118 }
119
120 static BOOL squash_guid(LPCWSTR in, LPWSTR out)
121 {
122     DWORD i,n=1;
123     GUID guid;
124
125     if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
126         return FALSE;
127
128     for(i=0; i<8; i++)
129         out[7-i] = in[n++];
130     n++;
131     for(i=0; i<4; i++)
132         out[11-i] = in[n++];
133     n++;
134     for(i=0; i<4; i++)
135         out[15-i] = in[n++];
136     n++;
137     for(i=0; i<2; i++)
138     {
139         out[17+i*2] = in[n++];
140         out[16+i*2] = in[n++];
141     }
142     n++;
143     for( ; i<8; i++)
144     {
145         out[17+i*2] = in[n++];
146         out[16+i*2] = in[n++];
147     }
148     out[32]=0;
149     return TRUE;
150 }
151
152 static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context,
153                                LPCSTR guid, LPSTR usersid, BOOL dir)
154 {
155     WCHAR guidW[MAX_PATH];
156     WCHAR squashedW[MAX_PATH];
157     CHAR squashed[MAX_PATH];
158     CHAR comppath[MAX_PATH];
159     CHAR prodpath[MAX_PATH];
160     CHAR path[MAX_PATH];
161     LPCSTR prod = NULL;
162     HKEY hkey;
163
164     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
165     squash_guid(guidW, squashedW);
166     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
167
168     if (context == MSIINSTALLCONTEXT_MACHINE)
169     {
170         prod = "3D0DAE300FACA1300AD792060BCDAA92";
171         sprintf(comppath,
172                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
173                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
174         lstrcpyA(prodpath,
175                  "SOFTWARE\\Classes\\Installer\\"
176                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
177     }
178     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
179     {
180         prod = "7D2F387510109040002000060BECB6AB";
181         sprintf(comppath,
182                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
183                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
184         sprintf(prodpath,
185                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
186                 "Installer\\%s\\Installer\\Products\\"
187                 "7D2F387510109040002000060BECB6AB", usersid);
188     }
189     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
190     {
191         prod = "7D2F387510109040002000060BECB6AB";
192         sprintf(comppath,
193                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
194                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
195         sprintf(prodpath,
196                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
197                 "Installer\\Managed\\%s\\Installer\\Products\\"
198                 "7D2F387510109040002000060BECB6AB", usersid);
199     }
200
201     RegCreateKeyA(HKEY_LOCAL_MACHINE, comppath, &hkey);
202
203     lstrcpyA(path, CURR_DIR);
204     lstrcatA(path, "\\");
205     if (!dir) lstrcatA(path, filename);
206
207     RegSetValueExA(hkey, prod, 0, REG_SZ, (LPBYTE)path, lstrlenA(path));
208     RegCloseKey(hkey);
209
210     RegCreateKeyA(HKEY_LOCAL_MACHINE, prodpath, &hkey);
211     RegCloseKey(hkey);
212 }
213
214 static void delete_component_path(LPCSTR guid, MSIINSTALLCONTEXT context, LPSTR usersid)
215 {
216     WCHAR guidW[MAX_PATH];
217     WCHAR squashedW[MAX_PATH];
218     WCHAR substrW[MAX_PATH];
219     CHAR squashed[MAX_PATH];
220     CHAR comppath[MAX_PATH];
221     CHAR prodpath[MAX_PATH];
222
223     MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH);
224     squash_guid(guidW, squashedW);
225     WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
226
227     if (context == MSIINSTALLCONTEXT_MACHINE)
228     {
229         sprintf(comppath,
230                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
231                 "Installer\\UserData\\S-1-5-18\\Components\\%s", squashed);
232         lstrcpyA(prodpath,
233                  "SOFTWARE\\Classes\\Installer\\"
234                  "Products\\3D0DAE300FACA1300AD792060BCDAA92");
235     }
236     else if (context == MSIINSTALLCONTEXT_USERUNMANAGED)
237     {
238         sprintf(comppath,
239                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
240                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
241         sprintf(prodpath,
242                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
243                 "Installer\\%s\\Installer\\Products\\"
244                 "7D2F387510109040002000060BECB6AB", usersid);
245     }
246     else if (context == MSIINSTALLCONTEXT_USERMANAGED)
247     {
248         sprintf(comppath,
249                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
250                 "Installer\\UserData\\%s\\Components\\%s", usersid, squashed);
251         sprintf(prodpath,
252                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
253                 "Installer\\Managed\\%s\\Installer\\Products\\"
254                 "7D2F387510109040002000060BECB6AB", usersid);
255     }
256
257     MultiByteToWideChar(CP_ACP, 0, comppath, -1, substrW, MAX_PATH);
258     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
259
260     MultiByteToWideChar(CP_ACP, 0, prodpath, -1, substrW, MAX_PATH);
261     package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW);
262 }
263
264 static UINT do_query(MSIHANDLE hdb, const char *query, MSIHANDLE *phrec)
265 {
266     MSIHANDLE hview = 0;
267     UINT r, ret;
268
269     /* open a select query */
270     r = MsiDatabaseOpenView(hdb, query, &hview);
271     if (r != ERROR_SUCCESS)
272         return r;
273     r = MsiViewExecute(hview, 0);
274     if (r != ERROR_SUCCESS)
275         return r;
276     ret = MsiViewFetch(hview, phrec);
277     r = MsiViewClose(hview);
278     if (r != ERROR_SUCCESS)
279         return r;
280     r = MsiCloseHandle(hview);
281     if (r != ERROR_SUCCESS)
282         return r;
283     return ret;
284 }
285
286 static UINT run_query( MSIHANDLE hdb, const char *query )
287 {
288     MSIHANDLE hview = 0;
289     UINT r;
290
291     r = MsiDatabaseOpenView(hdb, query, &hview);
292     if( r != ERROR_SUCCESS )
293         return r;
294
295     r = MsiViewExecute(hview, 0);
296     if( r == ERROR_SUCCESS )
297         r = MsiViewClose(hview);
298     MsiCloseHandle(hview);
299     return r;
300 }
301
302 static UINT create_component_table( MSIHANDLE hdb )
303 {
304     return run_query( hdb,
305             "CREATE TABLE `Component` ( "
306             "`Component` CHAR(72) NOT NULL, "
307             "`ComponentId` CHAR(38), "
308             "`Directory_` CHAR(72) NOT NULL, "
309             "`Attributes` SHORT NOT NULL, "
310             "`Condition` CHAR(255), "
311             "`KeyPath` CHAR(72) "
312             "PRIMARY KEY `Component`)" );
313 }
314
315 static UINT create_feature_table( MSIHANDLE hdb )
316 {
317     return run_query( hdb,
318             "CREATE TABLE `Feature` ( "
319             "`Feature` CHAR(38) NOT NULL, "
320             "`Feature_Parent` CHAR(38), "
321             "`Title` CHAR(64), "
322             "`Description` CHAR(255), "
323             "`Display` SHORT NOT NULL, "
324             "`Level` SHORT NOT NULL, "
325             "`Directory_` CHAR(72), "
326             "`Attributes` SHORT NOT NULL "
327             "PRIMARY KEY `Feature`)" );
328 }
329
330 static UINT create_feature_components_table( MSIHANDLE hdb )
331 {
332     return run_query( hdb,
333             "CREATE TABLE `FeatureComponents` ( "
334             "`Feature_` CHAR(38) NOT NULL, "
335             "`Component_` CHAR(72) NOT NULL "
336             "PRIMARY KEY `Feature_`, `Component_` )" );
337 }
338
339 static UINT create_file_table( MSIHANDLE hdb )
340 {
341     return run_query( hdb,
342             "CREATE TABLE `File` ("
343             "`File` CHAR(72) NOT NULL, "
344             "`Component_` CHAR(72) NOT NULL, "
345             "`FileName` CHAR(255) NOT NULL, "
346             "`FileSize` LONG NOT NULL, "
347             "`Version` CHAR(72), "
348             "`Language` CHAR(20), "
349             "`Attributes` SHORT, "
350             "`Sequence` SHORT NOT NULL "
351             "PRIMARY KEY `File`)" );
352 }
353
354 static UINT create_remove_file_table( MSIHANDLE hdb )
355 {
356     return run_query( hdb,
357             "CREATE TABLE `RemoveFile` ("
358             "`FileKey` CHAR(72) NOT NULL, "
359             "`Component_` CHAR(72) NOT NULL, "
360             "`FileName` CHAR(255) LOCALIZABLE, "
361             "`DirProperty` CHAR(72) NOT NULL, "
362             "`InstallMode` SHORT NOT NULL "
363             "PRIMARY KEY `FileKey`)" );
364 }
365
366 static UINT create_appsearch_table( MSIHANDLE hdb )
367 {
368     return run_query( hdb,
369             "CREATE TABLE `AppSearch` ("
370             "`Property` CHAR(72) NOT NULL, "
371             "`Signature_` CHAR(72) NOT NULL "
372             "PRIMARY KEY `Property`, `Signature_`)" );
373 }
374
375 static UINT create_reglocator_table( MSIHANDLE hdb )
376 {
377     return run_query( hdb,
378             "CREATE TABLE `RegLocator` ("
379             "`Signature_` CHAR(72) NOT NULL, "
380             "`Root` SHORT NOT NULL, "
381             "`Key` CHAR(255) NOT NULL, "
382             "`Name` CHAR(255), "
383             "`Type` SHORT "
384             "PRIMARY KEY `Signature_`)" );
385 }
386
387 static UINT create_signature_table( MSIHANDLE hdb )
388 {
389     return run_query( hdb,
390             "CREATE TABLE `Signature` ("
391             "`Signature` CHAR(72) NOT NULL, "
392             "`FileName` CHAR(255) NOT NULL, "
393             "`MinVersion` CHAR(20), "
394             "`MaxVersion` CHAR(20), "
395             "`MinSize` LONG, "
396             "`MaxSize` LONG, "
397             "`MinDate` LONG, "
398             "`MaxDate` LONG, "
399             "`Languages` CHAR(255) "
400             "PRIMARY KEY `Signature`)" );
401 }
402
403 static UINT create_launchcondition_table( MSIHANDLE hdb )
404 {
405     return run_query( hdb,
406             "CREATE TABLE `LaunchCondition` ("
407             "`Condition` CHAR(255) NOT NULL, "
408             "`Description` CHAR(255) NOT NULL "
409             "PRIMARY KEY `Condition`)" );
410 }
411
412 static UINT create_property_table( MSIHANDLE hdb )
413 {
414     return run_query( hdb,
415             "CREATE TABLE `Property` ("
416             "`Property` CHAR(72) NOT NULL, "
417             "`Value` CHAR(0) "
418             "PRIMARY KEY `Property`)" );
419 }
420
421 static UINT create_install_execute_sequence_table( MSIHANDLE hdb )
422 {
423     return run_query( hdb,
424             "CREATE TABLE `InstallExecuteSequence` ("
425             "`Action` CHAR(72) NOT NULL, "
426             "`Condition` CHAR(255), "
427             "`Sequence` SHORT "
428             "PRIMARY KEY `Action`)" );
429 }
430
431 static UINT create_media_table( MSIHANDLE hdb )
432 {
433     return run_query( hdb,
434             "CREATE TABLE `Media` ("
435             "`DiskId` SHORT NOT NULL, "
436             "`LastSequence` SHORT NOT NULL, "
437             "`DiskPrompt` CHAR(64), "
438             "`Cabinet` CHAR(255), "
439             "`VolumeLabel` CHAR(32), "
440             "`Source` CHAR(72) "
441             "PRIMARY KEY `DiskId`)" );
442 }
443
444 static UINT create_ccpsearch_table( MSIHANDLE hdb )
445 {
446     return run_query( hdb,
447             "CREATE TABLE `CCPSearch` ("
448             "`Signature_` CHAR(72) NOT NULL "
449             "PRIMARY KEY `Signature_`)" );
450 }
451
452 static UINT create_drlocator_table( MSIHANDLE hdb )
453 {
454     return run_query( hdb,
455             "CREATE TABLE `DrLocator` ("
456             "`Signature_` CHAR(72) NOT NULL, "
457             "`Parent` CHAR(72), "
458             "`Path` CHAR(255), "
459             "`Depth` SHORT "
460             "PRIMARY KEY `Signature_`, `Parent`, `Path`)" );
461 }
462
463 static UINT create_complocator_table( MSIHANDLE hdb )
464 {
465     return run_query( hdb,
466             "CREATE TABLE `CompLocator` ("
467             "`Signature_` CHAR(72) NOT NULL, "
468             "`ComponentId` CHAR(38) NOT NULL, "
469             "`Type` SHORT "
470             "PRIMARY KEY `Signature_`)" );
471 }
472
473 static UINT create_inilocator_table( MSIHANDLE hdb )
474 {
475     return run_query( hdb,
476             "CREATE TABLE `IniLocator` ("
477             "`Signature_` CHAR(72) NOT NULL, "
478             "`FileName` CHAR(255) NOT NULL, "
479             "`Section` CHAR(96)NOT NULL, "
480             "`Key` CHAR(128)NOT NULL, "
481             "`Field` SHORT, "
482             "`Type` SHORT "
483             "PRIMARY KEY `Signature_`)" );
484 }
485
486 static UINT add_component_entry( MSIHANDLE hdb, const char *values )
487 {
488     char insert[] = "INSERT INTO `Component`  "
489             "(`Component`, `ComponentId`, `Directory_`, `Attributes`, `Condition`, `KeyPath`) "
490             "VALUES( %s )";
491     char *query;
492     UINT sz, r;
493
494     sz = strlen(values) + sizeof insert;
495     query = HeapAlloc(GetProcessHeap(),0,sz);
496     sprintf(query,insert,values);
497     r = run_query( hdb, query );
498     HeapFree(GetProcessHeap(), 0, query);
499     return r;
500 }
501
502 static UINT add_directory_entry( MSIHANDLE hdb, const char *values )
503 {
504     char insert[] = "INSERT INTO `Directory` (`Directory`,`Directory_Parent`,`DefaultDir`) VALUES( %s )";
505     char *query;
506     UINT sz, r;
507
508     sz = strlen(values) + sizeof insert;
509     query = HeapAlloc(GetProcessHeap(),0,sz);
510     sprintf(query,insert,values);
511     r = run_query( hdb, query );
512     HeapFree(GetProcessHeap(), 0, query);
513     return r;
514 }
515
516 static UINT add_feature_entry( MSIHANDLE hdb, const char *values )
517 {
518     char insert[] = "INSERT INTO `Feature` (`Feature`, `Feature_Parent`, "
519                     "`Title`, `Description`, `Display`, `Level`, `Directory_`, `Attributes`) VALUES( %s )";
520     char *query;
521     UINT sz, r;
522
523     sz = strlen(values) + sizeof insert;
524     query = HeapAlloc(GetProcessHeap(),0,sz);
525     sprintf(query,insert,values);
526     r = run_query( hdb, query );
527     HeapFree(GetProcessHeap(), 0, query);
528     return r;
529 }
530
531 static UINT add_feature_components_entry( MSIHANDLE hdb, const char *values )
532 {
533     char insert[] = "INSERT INTO `FeatureComponents` "
534             "(`Feature_`, `Component_`) "
535             "VALUES( %s )";
536     char *query;
537     UINT sz, r;
538
539     sz = strlen(values) + sizeof insert;
540     query = HeapAlloc(GetProcessHeap(),0,sz);
541     sprintf(query,insert,values);
542     r = run_query( hdb, query );
543     HeapFree(GetProcessHeap(), 0, query);
544     return r;
545 }
546
547 static UINT add_file_entry( MSIHANDLE hdb, const char *values )
548 {
549     char insert[] = "INSERT INTO `File` "
550             "(`File`, `Component_`, `FileName`, `FileSize`, `Version`, `Language`, `Attributes`, `Sequence`) "
551             "VALUES( %s )";
552     char *query;
553     UINT sz, r;
554
555     sz = strlen(values) + sizeof insert;
556     query = HeapAlloc(GetProcessHeap(),0,sz);
557     sprintf(query,insert,values);
558     r = run_query( hdb, query );
559     HeapFree(GetProcessHeap(), 0, query);
560     return r;
561 }
562
563 static UINT add_appsearch_entry( MSIHANDLE hdb, const char *values )
564 {
565     char insert[] = "INSERT INTO `AppSearch` "
566             "(`Property`, `Signature_`) "
567             "VALUES( %s )";
568     char *query;
569     UINT sz, r;
570
571     sz = strlen(values) + sizeof insert;
572     query = HeapAlloc(GetProcessHeap(),0,sz);
573     sprintf(query,insert,values);
574     r = run_query( hdb, query );
575     HeapFree(GetProcessHeap(), 0, query);
576     return r;
577 }
578
579 static UINT add_reglocator_entry( MSIHANDLE hdb, const char *values )
580 {
581     char insert[] = "INSERT INTO `RegLocator` "
582             "(`Signature_`, `Root`, `Key`, `Name`, `Type`) "
583             "VALUES( %s )";
584     char *query;
585     UINT sz, r;
586
587     sz = strlen(values) + sizeof insert;
588     query = HeapAlloc(GetProcessHeap(),0,sz);
589     sprintf(query,insert,values);
590     r = run_query( hdb, query );
591     HeapFree(GetProcessHeap(), 0, query);
592     return r;
593 }
594
595 static UINT add_signature_entry( MSIHANDLE hdb, const char *values )
596 {
597     char insert[] = "INSERT INTO `Signature` "
598             "(`Signature`, `FileName`, `MinVersion`, `MaxVersion`,"
599             " `MinSize`, `MaxSize`, `MinDate`, `MaxDate`, `Languages`) "
600             "VALUES( %s )";
601     char *query;
602     UINT sz, r;
603
604     sz = strlen(values) + sizeof insert;
605     query = HeapAlloc(GetProcessHeap(),0,sz);
606     sprintf(query,insert,values);
607     r = run_query( hdb, query );
608     HeapFree(GetProcessHeap(), 0, query);
609     return r;
610 }
611
612 static UINT add_launchcondition_entry( MSIHANDLE hdb, const char *values )
613 {
614     char insert[] = "INSERT INTO `LaunchCondition` "
615             "(`Condition`, `Description`) "
616             "VALUES( %s )";
617     char *query;
618     UINT sz, r;
619
620     sz = strlen(values) + sizeof insert;
621     query = HeapAlloc(GetProcessHeap(),0,sz);
622     sprintf(query,insert,values);
623     r = run_query( hdb, query );
624     HeapFree(GetProcessHeap(), 0, query);
625     return r;
626 }
627
628 static UINT add_property_entry( MSIHANDLE hdb, const char *values )
629 {
630     char insert[] = "INSERT INTO `Property` "
631             "(`Property`, `Value`) "
632             "VALUES( %s )";
633     char *query;
634     UINT sz, r;
635
636     sz = strlen(values) + sizeof insert;
637     query = HeapAlloc(GetProcessHeap(),0,sz);
638     sprintf(query,insert,values);
639     r = run_query( hdb, query );
640     HeapFree(GetProcessHeap(), 0, query);
641     return r;
642 }
643
644 static UINT add_install_execute_sequence_entry( MSIHANDLE hdb, const char *values )
645 {
646     char insert[] = "INSERT INTO `InstallExecuteSequence` "
647             "(`Action`, `Condition`, `Sequence`) "
648             "VALUES( %s )";
649     char *query;
650     UINT sz, r;
651
652     sz = strlen(values) + sizeof insert;
653     query = HeapAlloc(GetProcessHeap(),0,sz);
654     sprintf(query,insert,values);
655     r = run_query( hdb, query );
656     HeapFree(GetProcessHeap(), 0, query);
657     return r;
658 }
659
660 static UINT add_media_entry( MSIHANDLE hdb, const char *values )
661 {
662     char insert[] = "INSERT INTO `Media` "
663             "(`DiskId`, `LastSequence`, `DiskPrompt`, `Cabinet`, `VolumeLabel`, `Source`) "
664             "VALUES( %s )";
665     char *query;
666     UINT sz, r;
667
668     sz = strlen(values) + sizeof insert;
669     query = HeapAlloc(GetProcessHeap(),0,sz);
670     sprintf(query,insert,values);
671     r = run_query( hdb, query );
672     HeapFree(GetProcessHeap(), 0, query);
673     return r;
674 }
675
676 static UINT add_ccpsearch_entry( MSIHANDLE hdb, const char *values )
677 {
678     char insert[] = "INSERT INTO `CCPSearch` (`Signature_`) VALUES( %s )";
679     char *query;
680     UINT sz, r;
681
682     sz = strlen(values) + sizeof insert;
683     query = HeapAlloc(GetProcessHeap(),0,sz);
684     sprintf(query,insert,values);
685     r = run_query( hdb, query );
686     HeapFree(GetProcessHeap(), 0, query);
687     return r;
688 }
689
690 static UINT add_drlocator_entry( MSIHANDLE hdb, const char *values )
691 {
692     char insert[] = "INSERT INTO `DrLocator` "
693             "(`Signature_`, `Parent`, `Path`, `Depth`) "
694             "VALUES( %s )";
695     char *query;
696     UINT sz, r;
697
698     sz = strlen(values) + sizeof insert;
699     query = HeapAlloc(GetProcessHeap(),0,sz);
700     sprintf(query,insert,values);
701     r = run_query( hdb, query );
702     HeapFree(GetProcessHeap(), 0, query);
703     return r;
704 }
705
706 static UINT add_complocator_entry( MSIHANDLE hdb, const char *values )
707 {
708     char insert[] = "INSERT INTO `CompLocator` "
709             "(`Signature_`, `ComponentId`, `Type`) "
710             "VALUES( %s )";
711     char *query;
712     UINT sz, r;
713
714     sz = strlen(values) + sizeof insert;
715     query = HeapAlloc(GetProcessHeap(),0,sz);
716     sprintf(query,insert,values);
717     r = run_query( hdb, query );
718     HeapFree(GetProcessHeap(), 0, query);
719     return r;
720 }
721
722 static UINT add_inilocator_entry( MSIHANDLE hdb, const char *values )
723 {
724     char insert[] = "INSERT INTO `IniLocator` "
725             "(`Signature_`, `FileName`, `Section`, `Key`, `Field`, `Type`) "
726             "VALUES( %s )";
727     char *query;
728     UINT sz, r;
729
730     sz = strlen(values) + sizeof insert;
731     query = HeapAlloc(GetProcessHeap(),0,sz);
732     sprintf(query,insert,values);
733     r = run_query( hdb, query );
734     HeapFree(GetProcessHeap(), 0, query);
735     return r;
736 }
737
738 static UINT set_summary_info(MSIHANDLE hdb)
739 {
740     UINT res;
741     MSIHANDLE suminfo;
742
743     /* build summary info */
744     res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo);
745     ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
746
747     res = MsiSummaryInfoSetProperty(suminfo,2, VT_LPSTR, 0,NULL,
748                         "Installation Database");
749     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
750
751     res = MsiSummaryInfoSetProperty(suminfo,3, VT_LPSTR, 0,NULL,
752                         "Installation Database");
753     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
754
755     res = MsiSummaryInfoSetProperty(suminfo,4, VT_LPSTR, 0,NULL,
756                         "Wine Hackers");
757     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
758
759     res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL,
760                     ";1033");
761     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
762
763     res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL,
764                     "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
765     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
766
767     res = MsiSummaryInfoSetProperty(suminfo, 14, VT_I4, 100, NULL, NULL);
768     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
769
770     res = MsiSummaryInfoSetProperty(suminfo, 15, VT_I4, 0, NULL, NULL);
771     ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
772
773     res = MsiSummaryInfoPersist(suminfo);
774     ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
775
776     res = MsiCloseHandle( suminfo);
777     ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
778
779     return res;
780 }
781
782
783 static MSIHANDLE create_package_db(void)
784 {
785     MSIHANDLE hdb = 0;
786     UINT res;
787
788     DeleteFile(msifile);
789
790     /* create an empty database */
791     res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb );
792     ok( res == ERROR_SUCCESS , "Failed to create database\n" );
793     if( res != ERROR_SUCCESS )
794         return hdb;
795
796     res = MsiDatabaseCommit( hdb );
797     ok( res == ERROR_SUCCESS , "Failed to commit database\n" );
798
799     res = set_summary_info(hdb);
800
801     res = run_query( hdb,
802             "CREATE TABLE `Directory` ( "
803             "`Directory` CHAR(255) NOT NULL, "
804             "`Directory_Parent` CHAR(255), "
805             "`DefaultDir` CHAR(255) NOT NULL "
806             "PRIMARY KEY `Directory`)" );
807     ok( res == ERROR_SUCCESS , "Failed to create directory table\n" );
808
809     return hdb;
810 }
811
812 static MSIHANDLE package_from_db(MSIHANDLE hdb)
813 {
814     UINT res;
815     CHAR szPackage[10];
816     MSIHANDLE hPackage;
817
818     sprintf(szPackage,"#%li",hdb);
819     res = MsiOpenPackage(szPackage,&hPackage);
820     if (res != ERROR_SUCCESS)
821         return 0;
822
823     res = MsiCloseHandle(hdb);
824     if (res != ERROR_SUCCESS)
825         return 0;
826
827     return hPackage;
828 }
829
830 static void create_test_file(const CHAR *name)
831 {
832     HANDLE file;
833     DWORD written;
834
835     file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
836     ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
837     WriteFile(file, name, strlen(name), &written, NULL);
838     WriteFile(file, "\n", strlen("\n"), &written, NULL);
839     CloseHandle(file);
840 }
841
842 typedef struct _tagVS_VERSIONINFO
843 {
844     WORD wLength;
845     WORD wValueLength;
846     WORD wType;
847     WCHAR szKey[1];
848     WORD wPadding1[1];
849     VS_FIXEDFILEINFO Value;
850     WORD wPadding2[1];
851     WORD wChildren[1];
852 } VS_VERSIONINFO;
853
854 #define roundoffs(a, b, r) (((BYTE *)(b) - (BYTE *)(a) + ((r) - 1)) & ~((r) - 1))
855 #define roundpos(a, b, r) (((BYTE *)(a)) + roundoffs(a, b, r))
856
857 static void create_file_with_version(const CHAR *name, LONG ms, LONG ls)
858 {
859     VS_VERSIONINFO *pVerInfo;
860     VS_FIXEDFILEINFO *pFixedInfo;
861     LPBYTE buffer, ofs;
862     CHAR path[MAX_PATH];
863     DWORD handle, size;
864     HANDLE resource;
865
866     GetSystemDirectory(path, MAX_PATH);
867     lstrcatA(path, "\\kernel32.dll");
868
869     CopyFileA(path, name, FALSE);
870
871     size = GetFileVersionInfoSize(path, &handle);
872     buffer = HeapAlloc(GetProcessHeap(), 0, size);
873
874     GetFileVersionInfoA(path, 0, size, buffer);
875
876     pVerInfo = (VS_VERSIONINFO *)buffer;
877     ofs = (BYTE *)&pVerInfo->szKey[lstrlenW(pVerInfo->szKey) + 1];
878     pFixedInfo = (VS_FIXEDFILEINFO *)roundpos(pVerInfo, ofs, 4);
879
880     pFixedInfo->dwFileVersionMS = ms;
881     pFixedInfo->dwFileVersionLS = ls;
882     pFixedInfo->dwProductVersionMS = ms;
883     pFixedInfo->dwProductVersionLS = ls;
884
885     resource = BeginUpdateResource(name, FALSE);
886     if (!resource)
887         goto done;
888
889     UpdateResource(resource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO),
890                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), buffer, size);
891     EndUpdateResource(resource, FALSE);
892
893 done:
894     HeapFree(GetProcessHeap(), 0, buffer);
895 }
896
897 static void test_createpackage(void)
898 {
899     MSIHANDLE hPackage = 0;
900     UINT res;
901
902     hPackage = package_from_db(create_package_db());
903     ok( hPackage != 0, " Failed to create package\n");
904
905     res = MsiCloseHandle( hPackage);
906     ok( res == ERROR_SUCCESS , "Failed to close package\n" );
907     DeleteFile(msifile);
908 }
909
910 static void test_doaction( void )
911 {
912     MSIHANDLE hpkg;
913     UINT r;
914
915     r = MsiDoAction( -1, NULL );
916     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
917
918     hpkg = package_from_db(create_package_db());
919     ok( hpkg, "failed to create package\n");
920
921     r = MsiDoAction(hpkg, NULL);
922     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
923
924     r = MsiDoAction(0, "boo");
925     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
926
927     r = MsiDoAction(hpkg, "boo");
928     ok( r == ERROR_FUNCTION_NOT_CALLED, "wrong return val\n");
929
930     MsiCloseHandle( hpkg );
931     DeleteFile(msifile);
932 }
933
934 static void test_gettargetpath_bad(void)
935 {
936     char buffer[0x80];
937     MSIHANDLE hpkg;
938     DWORD sz;
939     UINT r;
940
941     hpkg = package_from_db(create_package_db());
942     ok( hpkg, "failed to create package\n");
943
944     r = MsiGetTargetPath( 0, NULL, NULL, NULL );
945     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
946
947     r = MsiGetTargetPath( 0, NULL, NULL, &sz );
948     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
949
950     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
951     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
952
953     r = MsiGetTargetPath( 0, "boo", NULL, NULL );
954     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
955
956     r = MsiGetTargetPath( hpkg, "boo", NULL, NULL );
957     ok( r == ERROR_DIRECTORY, "wrong return val\n");
958
959     r = MsiGetTargetPath( hpkg, "boo", buffer, NULL );
960     ok( r == ERROR_DIRECTORY, "wrong return val\n");
961
962     MsiCloseHandle( hpkg );
963     DeleteFile(msifile);
964 }
965
966 static void query_file_path(MSIHANDLE hpkg, LPCSTR file, LPSTR buff)
967 {
968     UINT r;
969     DWORD size;
970     MSIHANDLE rec;
971
972     rec = MsiCreateRecord( 1 );
973     ok(rec, "MsiCreate record failed\n");
974
975     r = MsiRecordSetString( rec, 0, file );
976     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
977
978     size = MAX_PATH;
979     r = MsiFormatRecord( hpkg, rec, buff, &size );
980     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r );
981
982     MsiCloseHandle( rec );
983 }
984
985 static void test_settargetpath(void)
986 {
987     char tempdir[MAX_PATH+8], buffer[MAX_PATH], file[MAX_PATH];
988     DWORD sz;
989     MSIHANDLE hpkg;
990     UINT r;
991     MSIHANDLE hdb;
992
993     hdb = create_package_db();
994     ok ( hdb, "failed to create package database\n" );
995
996     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" );
997     ok( r == S_OK, "failed to add directory entry: %d\n" , r );
998
999     r = create_component_table( hdb );
1000     ok( r == S_OK, "cannot create Component table: %d\n", r );
1001
1002     r = add_component_entry( hdb, "'RootComp', '{83e2694d-0864-4124-9323-6d37630912a1}', 'TARGETDIR', 8, '', 'RootFile'" );
1003     ok( r == S_OK, "cannot add dummy component: %d\n", r );
1004
1005     r = add_component_entry( hdb, "'TestComp', '{A3FB59C8-C293-4F7E-B8C5-F0E1D8EEE4E5}', 'TestDir', 0, '', 'TestFile'" );
1006     ok( r == S_OK, "cannot add test component: %d\n", r );
1007
1008     r = create_feature_table( hdb );
1009     ok( r == S_OK, "cannot create Feature table: %d\n", r );
1010
1011     r = add_feature_entry( hdb, "'TestFeature', '', '', '', 0, 1, '', 0" );
1012     ok( r == ERROR_SUCCESS, "cannot add TestFeature to Feature table: %d\n", r );
1013
1014     r = create_feature_components_table( hdb );
1015     ok( r == S_OK, "cannot create FeatureComponents table: %d\n", r );
1016
1017     r = add_feature_components_entry( hdb, "'TestFeature', 'RootComp'" );
1018     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
1019
1020     r = add_feature_components_entry( hdb, "'TestFeature', 'TestComp'" );
1021     ok( r == S_OK, "cannot insert component into FeatureComponents table: %d\n", r );
1022
1023     add_directory_entry( hdb, "'TestParent', 'TARGETDIR', 'TestParent'" );
1024     add_directory_entry( hdb, "'TestDir', 'TestParent', 'TestDir'" );
1025
1026     r = create_file_table( hdb );
1027     ok( r == S_OK, "cannot create File table: %d\n", r );
1028
1029     r = add_file_entry( hdb, "'RootFile', 'RootComp', 'rootfile.txt', 0, '', '1033', 8192, 1" );
1030     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
1031
1032     r = add_file_entry( hdb, "'TestFile', 'TestComp', 'testfile.txt', 0, '', '1033', 8192, 1" );
1033     ok( r == S_OK, "cannot add file to the File table: %d\n", r );
1034
1035     hpkg = package_from_db( hdb );
1036     ok( hpkg, "failed to create package\n");
1037
1038     r = MsiDoAction( hpkg, "CostInitialize");
1039     ok( r == ERROR_SUCCESS, "cost init failed\n");
1040
1041     r = MsiDoAction( hpkg, "FileCost");
1042     ok( r == ERROR_SUCCESS, "file cost failed\n");
1043
1044     r = MsiDoAction( hpkg, "CostFinalize");
1045     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
1046
1047     r = MsiSetTargetPath( 0, NULL, NULL );
1048     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1049
1050     r = MsiSetTargetPath( 0, "boo", "C:\\bogusx" );
1051     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
1052
1053     r = MsiSetTargetPath( hpkg, "boo", NULL );
1054     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1055
1056     r = MsiSetTargetPath( hpkg, "boo", "c:\\bogusx" );
1057     ok( r == ERROR_DIRECTORY, "wrong return val\n");
1058
1059     sz = sizeof tempdir - 1;
1060     r = MsiGetTargetPath( hpkg, "TARGETDIR", tempdir, &sz );
1061     sprintf( file, "%srootfile.txt", tempdir );
1062     query_file_path( hpkg, "[#RootFile]", buffer );
1063     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1064     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer );
1065
1066     GetTempFileName( tempdir, "_wt", 0, buffer );
1067     sprintf( tempdir, "%s\\subdir", buffer );
1068
1069     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
1070     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
1071         "MsiSetTargetPath on file returned %d\n", r );
1072
1073     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
1074     ok( r == ERROR_SUCCESS || r == ERROR_DIRECTORY,
1075         "MsiSetTargetPath on 'subdir' of file returned %d\n", r );
1076
1077     DeleteFile( buffer );
1078
1079     r = MsiSetTargetPath( hpkg, "TARGETDIR", buffer );
1080     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
1081
1082     r = GetFileAttributes( buffer );
1083     ok ( r == INVALID_FILE_ATTRIBUTES, "file/directory exists after MsiSetTargetPath. Attributes: %08X\n", r );
1084
1085     r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir );
1086     ok( r == ERROR_SUCCESS, "MsiSetTargetPath on subsubdir returned %d\n", r );
1087
1088     sz = sizeof buffer - 1;
1089     lstrcat( tempdir, "\\" );
1090     r = MsiGetTargetPath( hpkg, "TARGETDIR", buffer, &sz );
1091     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1092     ok( !lstrcmp(buffer, tempdir), "Expected %s, got %s\n", tempdir, buffer);
1093
1094     sprintf( file, "%srootfile.txt", tempdir );
1095     query_file_path( hpkg, "[#RootFile]", buffer );
1096     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer);
1097
1098     r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two" );
1099     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
1100
1101     query_file_path( hpkg, "[#TestFile]", buffer );
1102     ok( !lstrcmp(buffer, "C:\\one\\two\\TestDir\\testfile.txt"),
1103         "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer );
1104
1105     sz = sizeof buffer - 1;
1106     r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz );
1107     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
1108     ok( !lstrcmp(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer);
1109
1110     MsiCloseHandle( hpkg );
1111 }
1112
1113 static void test_condition(void)
1114 {
1115     MSICONDITION r;
1116     MSIHANDLE hpkg;
1117
1118     hpkg = package_from_db(create_package_db());
1119     ok( hpkg, "failed to create package\n");
1120
1121     r = MsiEvaluateCondition(0, NULL);
1122     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1123
1124     r = MsiEvaluateCondition(hpkg, NULL);
1125     ok( r == MSICONDITION_NONE, "wrong return val\n");
1126
1127     r = MsiEvaluateCondition(hpkg, "");
1128     ok( r == MSICONDITION_NONE, "wrong return val\n");
1129
1130     r = MsiEvaluateCondition(hpkg, "1");
1131     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1132
1133     r = MsiEvaluateCondition(hpkg, "0");
1134     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1135
1136     r = MsiEvaluateCondition(hpkg, "-1");
1137     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1138
1139     r = MsiEvaluateCondition(hpkg, "0 = 0");
1140     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1141
1142     r = MsiEvaluateCondition(hpkg, "0 <> 0");
1143     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1144
1145     r = MsiEvaluateCondition(hpkg, "0 = 1");
1146     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1147
1148     r = MsiEvaluateCondition(hpkg, "0 > 1");
1149     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1150
1151     r = MsiEvaluateCondition(hpkg, "0 ~> 1");
1152     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1153
1154     r = MsiEvaluateCondition(hpkg, "1 > 1");
1155     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1156
1157     r = MsiEvaluateCondition(hpkg, "1 ~> 1");
1158     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1159
1160     r = MsiEvaluateCondition(hpkg, "0 >= 1");
1161     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1162
1163     r = MsiEvaluateCondition(hpkg, "0 ~>= 1");
1164     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1165
1166     r = MsiEvaluateCondition(hpkg, "1 >= 1");
1167     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1168
1169     r = MsiEvaluateCondition(hpkg, "1 ~>= 1");
1170     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1171
1172     r = MsiEvaluateCondition(hpkg, "0 < 1");
1173     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1174
1175     r = MsiEvaluateCondition(hpkg, "0 ~< 1");
1176     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1177
1178     r = MsiEvaluateCondition(hpkg, "1 < 1");
1179     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1180
1181     r = MsiEvaluateCondition(hpkg, "1 ~< 1");
1182     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1183
1184     r = MsiEvaluateCondition(hpkg, "0 <= 1");
1185     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1186
1187     r = MsiEvaluateCondition(hpkg, "0 ~<= 1");
1188     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1189
1190     r = MsiEvaluateCondition(hpkg, "1 <= 1");
1191     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1192
1193     r = MsiEvaluateCondition(hpkg, "1 ~<= 1");
1194     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1195
1196     r = MsiEvaluateCondition(hpkg, "0 >=");
1197     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1198
1199     r = MsiEvaluateCondition(hpkg, " ");
1200     ok( r == MSICONDITION_NONE, "wrong return val\n");
1201
1202     r = MsiEvaluateCondition(hpkg, "LicView <> \"1\"");
1203     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1204
1205     r = MsiEvaluateCondition(hpkg, "LicView <> \"0\"");
1206     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1207
1208     r = MsiEvaluateCondition(hpkg, "LicView <> LicView");
1209     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1210
1211     r = MsiEvaluateCondition(hpkg, "not 0");
1212     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1213
1214     r = MsiEvaluateCondition(hpkg, "not LicView");
1215     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1216
1217     r = MsiEvaluateCondition(hpkg, "not \"A\"");
1218     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1219
1220     r = MsiEvaluateCondition(hpkg, "~not \"A\"");
1221     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1222
1223     r = MsiEvaluateCondition(hpkg, "\"0\"");
1224     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1225
1226     r = MsiEvaluateCondition(hpkg, "1 and 2");
1227     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1228
1229     r = MsiEvaluateCondition(hpkg, "not 0 and 3");
1230     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1231
1232     r = MsiEvaluateCondition(hpkg, "not 0 and 0");
1233     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1234
1235     r = MsiEvaluateCondition(hpkg, "not 0 or 1");
1236     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1237
1238     r = MsiEvaluateCondition(hpkg, "(0)");
1239     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1240
1241     r = MsiEvaluateCondition(hpkg, "(((((1))))))");
1242     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1243
1244     r = MsiEvaluateCondition(hpkg, "(((((1)))))");
1245     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1246
1247     r = MsiEvaluateCondition(hpkg, " \"A\" < \"B\" ");
1248     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1249
1250     r = MsiEvaluateCondition(hpkg, " \"A\" > \"B\" ");
1251     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1252
1253     r = MsiEvaluateCondition(hpkg, " \"1\" > \"12\" ");
1254     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1255
1256     r = MsiEvaluateCondition(hpkg, " \"100\" < \"21\" ");
1257     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1258
1259     r = MsiEvaluateCondition(hpkg, "0 < > 0");
1260     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1261
1262     r = MsiEvaluateCondition(hpkg, "(1<<1) == 2");
1263     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1264
1265     r = MsiEvaluateCondition(hpkg, " \"A\" = \"a\" ");
1266     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1267
1268     r = MsiEvaluateCondition(hpkg, " \"A\" ~ = \"a\" ");
1269     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1270
1271     r = MsiEvaluateCondition(hpkg, " \"A\" ~= \"a\" ");
1272     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1273
1274     r = MsiEvaluateCondition(hpkg, " \"A\" ~= 1 ");
1275     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1276
1277     r = MsiEvaluateCondition(hpkg, " \"A\" = 1 ");
1278     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1279
1280     r = MsiEvaluateCondition(hpkg, " 1 ~= 1 ");
1281     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1282
1283     r = MsiEvaluateCondition(hpkg, " 1 ~= \"1\" ");
1284     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1285
1286     r = MsiEvaluateCondition(hpkg, " 1 = \"1\" ");
1287     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1288
1289     r = MsiEvaluateCondition(hpkg, " 0 = \"1\" ");
1290     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1291
1292     r = MsiEvaluateCondition(hpkg, " 0 < \"100\" ");
1293     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1294
1295     r = MsiEvaluateCondition(hpkg, " 100 > \"0\" ");
1296     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1297
1298     r = MsiEvaluateCondition(hpkg, "1 XOR 1");
1299     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1300
1301     r = MsiEvaluateCondition(hpkg, "1 IMP 1");
1302     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1303
1304     r = MsiEvaluateCondition(hpkg, "1 IMP 0");
1305     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1306
1307     r = MsiEvaluateCondition(hpkg, "0 IMP 0");
1308     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1309
1310     r = MsiEvaluateCondition(hpkg, "0 EQV 0");
1311     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1312
1313     r = MsiEvaluateCondition(hpkg, "0 EQV 1");
1314     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1315
1316     r = MsiEvaluateCondition(hpkg, "1 IMP 1 OR 0");
1317     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1318
1319     r = MsiEvaluateCondition(hpkg, "1 IMPL 1");
1320     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1321
1322     r = MsiEvaluateCondition(hpkg, "\"ASFD\" >< \"S\" ");
1323     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1324
1325     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"s\" ");
1326     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1327
1328     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"\" ");
1329     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1330
1331     r = MsiEvaluateCondition(hpkg, "\"ASFD\" ~>< \"sss\" ");
1332     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1333
1334     MsiSetProperty(hpkg, "mm", "5" );
1335
1336     r = MsiEvaluateCondition(hpkg, "mm = 5");
1337     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1338
1339     r = MsiEvaluateCondition(hpkg, "mm < 6");
1340     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1341
1342     r = MsiEvaluateCondition(hpkg, "mm <= 5");
1343     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1344
1345     r = MsiEvaluateCondition(hpkg, "mm > 4");
1346     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1347
1348     r = MsiEvaluateCondition(hpkg, "mm < 12");
1349     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1350
1351     r = MsiEvaluateCondition(hpkg, "mm = \"5\"");
1352     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1353
1354     r = MsiEvaluateCondition(hpkg, "0 = \"\"");
1355     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1356
1357     r = MsiEvaluateCondition(hpkg, "0 AND \"\"");
1358     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1359
1360     r = MsiEvaluateCondition(hpkg, "1 AND \"\"");
1361     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1362
1363     r = MsiEvaluateCondition(hpkg, "1 AND \"1\"");
1364     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1365
1366     r = MsiEvaluateCondition(hpkg, "3 >< 1");
1367     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1368
1369     r = MsiEvaluateCondition(hpkg, "3 >< 4");
1370     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1371
1372     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 0");
1373     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1374
1375     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1");
1376     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1377
1378     r = MsiEvaluateCondition(hpkg, "NOT 1 OR 0");
1379     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1380
1381     r = MsiEvaluateCondition(hpkg, "0 AND 1 OR 1");
1382     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1383
1384     r = MsiEvaluateCondition(hpkg, "0 AND 0 OR 1");
1385     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1386
1387     r = MsiEvaluateCondition(hpkg, "NOT 0 AND 1 OR 0");
1388     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1389
1390     r = MsiEvaluateCondition(hpkg, "_1 = _1");
1391     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1392
1393     r = MsiEvaluateCondition(hpkg, "( 1 AND 1 ) = 2");
1394     ok( r == MSICONDITION_ERROR, "wrong return val\n");
1395
1396     r = MsiEvaluateCondition(hpkg, "NOT ( 1 AND 1 )");
1397     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1398
1399     r = MsiEvaluateCondition(hpkg, "NOT A AND (BBBBBBBBBB=2 OR CCC=1) AND Ddddddddd");
1400     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1401
1402     r = MsiEvaluateCondition(hpkg, "Installed<>\"\"");
1403     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1404
1405     r = MsiEvaluateCondition(hpkg, "NOT 1 AND 0");
1406     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1407
1408     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1409     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1410
1411     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1412     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1413
1414     r = MsiEvaluateCondition(hpkg, "bandalmael<0");
1415     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1416
1417     r = MsiEvaluateCondition(hpkg, "bandalmael>0");
1418     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1419
1420     r = MsiEvaluateCondition(hpkg, "bandalmael>=0");
1421     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1422
1423     r = MsiEvaluateCondition(hpkg, "bandalmael<=0");
1424     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1425
1426     r = MsiEvaluateCondition(hpkg, "bandalmael~<>0");
1427     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1428
1429     MsiSetProperty(hpkg, "bandalmael", "0" );
1430     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1431     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1432
1433     MsiSetProperty(hpkg, "bandalmael", "" );
1434     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1435     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1436
1437     MsiSetProperty(hpkg, "bandalmael", "asdf" );
1438     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1439     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1440
1441     MsiSetProperty(hpkg, "bandalmael", "0asdf" );
1442     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1443     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1444
1445     MsiSetProperty(hpkg, "bandalmael", "0 " );
1446     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1447     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1448
1449     MsiSetProperty(hpkg, "bandalmael", "-0" );
1450     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1451     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1452
1453     MsiSetProperty(hpkg, "bandalmael", "0000000000000" );
1454     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1455     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1456
1457     MsiSetProperty(hpkg, "bandalmael", "--0" );
1458     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1459     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1460
1461     MsiSetProperty(hpkg, "bandalmael", "0x00" );
1462     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1463     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1464
1465     MsiSetProperty(hpkg, "bandalmael", "-" );
1466     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1467     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1468
1469     MsiSetProperty(hpkg, "bandalmael", "+0" );
1470     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1471     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1472
1473     MsiSetProperty(hpkg, "bandalmael", "0.0" );
1474     r = MsiEvaluateCondition(hpkg, "bandalmael=0");
1475     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1476     r = MsiEvaluateCondition(hpkg, "bandalmael<>0");
1477     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1478
1479     MsiSetProperty(hpkg, "one", "hi");
1480     MsiSetProperty(hpkg, "two", "hithere");
1481     r = MsiEvaluateCondition(hpkg, "one >< two");
1482     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1483
1484     MsiSetProperty(hpkg, "one", "hithere");
1485     MsiSetProperty(hpkg, "two", "hi");
1486     r = MsiEvaluateCondition(hpkg, "one >< two");
1487     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1488
1489     MsiSetProperty(hpkg, "one", "hello");
1490     MsiSetProperty(hpkg, "two", "hi");
1491     r = MsiEvaluateCondition(hpkg, "one >< two");
1492     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1493
1494     MsiSetProperty(hpkg, "one", "hellohithere");
1495     MsiSetProperty(hpkg, "two", "hi");
1496     r = MsiEvaluateCondition(hpkg, "one >< two");
1497     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1498
1499     MsiSetProperty(hpkg, "one", "");
1500     MsiSetProperty(hpkg, "two", "hi");
1501     r = MsiEvaluateCondition(hpkg, "one >< two");
1502     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1503
1504     MsiSetProperty(hpkg, "one", "hi");
1505     MsiSetProperty(hpkg, "two", "");
1506     r = MsiEvaluateCondition(hpkg, "one >< two");
1507     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1508
1509     MsiSetProperty(hpkg, "one", "");
1510     MsiSetProperty(hpkg, "two", "");
1511     r = MsiEvaluateCondition(hpkg, "one >< two");
1512     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1513
1514     MsiSetProperty(hpkg, "one", "1234");
1515     MsiSetProperty(hpkg, "two", "1");
1516     r = MsiEvaluateCondition(hpkg, "one >< two");
1517     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1518
1519     MsiSetProperty(hpkg, "one", "one 1234");
1520     MsiSetProperty(hpkg, "two", "1");
1521     r = MsiEvaluateCondition(hpkg, "one >< two");
1522     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1523
1524     MsiSetProperty(hpkg, "one", "hithere");
1525     MsiSetProperty(hpkg, "two", "hi");
1526     r = MsiEvaluateCondition(hpkg, "one << two");
1527     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1528
1529     MsiSetProperty(hpkg, "one", "hi");
1530     MsiSetProperty(hpkg, "two", "hithere");
1531     r = MsiEvaluateCondition(hpkg, "one << two");
1532     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1533
1534     MsiSetProperty(hpkg, "one", "hi");
1535     MsiSetProperty(hpkg, "two", "hi");
1536     r = MsiEvaluateCondition(hpkg, "one << two");
1537     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1538
1539     MsiSetProperty(hpkg, "one", "abcdhithere");
1540     MsiSetProperty(hpkg, "two", "hi");
1541     r = MsiEvaluateCondition(hpkg, "one << two");
1542     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1543
1544     MsiSetProperty(hpkg, "one", "");
1545     MsiSetProperty(hpkg, "two", "hi");
1546     r = MsiEvaluateCondition(hpkg, "one << two");
1547     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1548
1549     MsiSetProperty(hpkg, "one", "hithere");
1550     MsiSetProperty(hpkg, "two", "");
1551     r = MsiEvaluateCondition(hpkg, "one << two");
1552     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1553
1554     MsiSetProperty(hpkg, "one", "");
1555     MsiSetProperty(hpkg, "two", "");
1556     r = MsiEvaluateCondition(hpkg, "one << two");
1557     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1558
1559     MsiSetProperty(hpkg, "one", "1234");
1560     MsiSetProperty(hpkg, "two", "1");
1561     r = MsiEvaluateCondition(hpkg, "one << two");
1562     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1563
1564     MsiSetProperty(hpkg, "one", "1234 one");
1565     MsiSetProperty(hpkg, "two", "1");
1566     r = MsiEvaluateCondition(hpkg, "one << two");
1567     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1568
1569     MsiSetProperty(hpkg, "one", "hithere");
1570     MsiSetProperty(hpkg, "two", "there");
1571     r = MsiEvaluateCondition(hpkg, "one >> two");
1572     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1573
1574     MsiSetProperty(hpkg, "one", "hithere");
1575     MsiSetProperty(hpkg, "two", "hi");
1576     r = MsiEvaluateCondition(hpkg, "one >> two");
1577     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1578
1579     MsiSetProperty(hpkg, "one", "there");
1580     MsiSetProperty(hpkg, "two", "hithere");
1581     r = MsiEvaluateCondition(hpkg, "one >> two");
1582     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1583
1584     MsiSetProperty(hpkg, "one", "there");
1585     MsiSetProperty(hpkg, "two", "there");
1586     r = MsiEvaluateCondition(hpkg, "one >> two");
1587     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1588
1589     MsiSetProperty(hpkg, "one", "abcdhithere");
1590     MsiSetProperty(hpkg, "two", "hi");
1591     r = MsiEvaluateCondition(hpkg, "one >> two");
1592     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1593
1594     MsiSetProperty(hpkg, "one", "");
1595     MsiSetProperty(hpkg, "two", "there");
1596     r = MsiEvaluateCondition(hpkg, "one >> two");
1597     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1598
1599     MsiSetProperty(hpkg, "one", "there");
1600     MsiSetProperty(hpkg, "two", "");
1601     r = MsiEvaluateCondition(hpkg, "one >> two");
1602     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1603
1604     MsiSetProperty(hpkg, "one", "");
1605     MsiSetProperty(hpkg, "two", "");
1606     r = MsiEvaluateCondition(hpkg, "one >> two");
1607     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1608
1609     MsiSetProperty(hpkg, "one", "1234");
1610     MsiSetProperty(hpkg, "two", "4");
1611     r = MsiEvaluateCondition(hpkg, "one >> two");
1612     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1613
1614     MsiSetProperty(hpkg, "one", "one 1234");
1615     MsiSetProperty(hpkg, "two", "4");
1616     r = MsiEvaluateCondition(hpkg, "one >> two");
1617     ok( r == MSICONDITION_TRUE, "wrong return val\n");
1618
1619     MsiSetProperty(hpkg, "MsiNetAssemblySupport", NULL);  /* make sure it's empty */
1620
1621     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1622     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1623
1624     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport > \"1.1.4322\"");
1625     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1626
1627     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport >= \"1.1.4322\"");
1628     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1629
1630     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <= \"1.1.4322\"");
1631     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1632
1633     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport <> \"1.1.4322\"");
1634     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1635
1636     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport ~< \"1.1.4322\"");
1637     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1638
1639     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"abcd\"");
1640     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1641
1642     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a1.1.4322\"");
1643     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1644
1645     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322a\"");
1646     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1647
1648     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0000001.1.4322\"");
1649     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1650
1651     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1\"");
1652     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1653
1654     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322.1.1\"");
1655     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1656
1657     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1");
1658     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1659
1660     r = MsiEvaluateCondition(hpkg, "\"2\" < \"1.1\"");
1661     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1662
1663     r = MsiEvaluateCondition(hpkg, "\"2\" < \"12.1\"");
1664     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1665
1666     r = MsiEvaluateCondition(hpkg, "\"02.1\" < \"2.11\"");
1667     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1668
1669     r = MsiEvaluateCondition(hpkg, "\"02.1.1\" < \"2.1\"");
1670     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1671
1672     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1673     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1674
1675     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1676     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1677
1678     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"0\"");
1679     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1680
1681     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"-1\"");
1682     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1683
1684     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a\"");
1685     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1686
1687     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1688     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1689
1690     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"!\"");
1691     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1692
1693     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"/\"");
1694     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1695
1696     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \" \"");
1697     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1698
1699     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"azAZ_\"");
1700     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1701
1702     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]\"");
1703     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1704
1705     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a[a]a\"");
1706     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1707
1708     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]\"");
1709     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1710
1711     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a]a\"");
1712     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1713
1714     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a}\"");
1715     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1716
1717     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"{a\"");
1718     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1719
1720     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"[a\"");
1721     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1722
1723     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a{\"");
1724     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1725
1726     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"a]\"");
1727     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1728
1729     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"A\"");
1730     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1731
1732     MsiSetProperty(hpkg, "MsiNetAssemblySupport", "1.1.4322");
1733     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.4322\"");
1734     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1735
1736     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.14322\"");
1737     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1738
1739     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1.5\"");
1740     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1741
1742     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1.1\"");
1743     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1744
1745     r = MsiEvaluateCondition(hpkg, "MsiNetAssemblySupport < \"1\"");
1746     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1747
1748     MsiSetProperty(hpkg, "one", "1");
1749     r = MsiEvaluateCondition(hpkg, "one < \"1\"");
1750     ok( r == MSICONDITION_FALSE, "wrong return val\n");
1751
1752     MsiSetProperty(hpkg, "X", "5.0");
1753
1754     r = MsiEvaluateCondition(hpkg, "X != \"\"");
1755     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1756
1757     r = MsiEvaluateCondition(hpkg, "X =\"5.0\"");
1758     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1759
1760     r = MsiEvaluateCondition(hpkg, "X =\"5.1\"");
1761     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1762
1763     r = MsiEvaluateCondition(hpkg, "X =\"6.0\"");
1764     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1765
1766     r = MsiEvaluateCondition(hpkg, "X =\"5.0\" or X =\"5.1\" or X =\"6.0\"");
1767     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1768
1769     r = MsiEvaluateCondition(hpkg, "(X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1770     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1771
1772     r = MsiEvaluateCondition(hpkg, "X !=\"\" and (X =\"5.0\" or X =\"5.1\" or X =\"6.0\")");
1773     ok( r == MSICONDITION_ERROR, "wrong return val (%d)\n", r);
1774
1775     /* feature doesn't exist */
1776     r = MsiEvaluateCondition(hpkg, "&nofeature");
1777     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1778
1779     MsiSetProperty(hpkg, "A", "2");
1780     MsiSetProperty(hpkg, "X", "50");
1781
1782     r = MsiEvaluateCondition(hpkg, "2 <= X");
1783     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1784
1785     r = MsiEvaluateCondition(hpkg, "A <= X");
1786     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1787
1788     r = MsiEvaluateCondition(hpkg, "A <= 50");
1789     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1790
1791     MsiSetProperty(hpkg, "X", "50val");
1792
1793     r = MsiEvaluateCondition(hpkg, "2 <= X");
1794     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1795
1796     r = MsiEvaluateCondition(hpkg, "A <= X");
1797     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1798
1799     MsiSetProperty(hpkg, "A", "7");
1800     MsiSetProperty(hpkg, "X", "50");
1801
1802     r = MsiEvaluateCondition(hpkg, "7 <= X");
1803     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1804
1805     r = MsiEvaluateCondition(hpkg, "A <= X");
1806     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1807
1808     r = MsiEvaluateCondition(hpkg, "A <= 50");
1809     ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
1810
1811     MsiSetProperty(hpkg, "X", "50val");
1812
1813     r = MsiEvaluateCondition(hpkg, "2 <= X");
1814     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1815
1816     r = MsiEvaluateCondition(hpkg, "A <= X");
1817     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
1818
1819     MsiCloseHandle( hpkg );
1820     DeleteFile(msifile);
1821 }
1822
1823 static BOOL check_prop_empty( MSIHANDLE hpkg, const char * prop)
1824 {
1825     UINT r;
1826     DWORD sz;
1827     char buffer[2];
1828
1829     sz = sizeof buffer;
1830     strcpy(buffer,"x");
1831     r = MsiGetProperty( hpkg, prop, buffer, &sz );
1832     return r == ERROR_SUCCESS && buffer[0] == 0 && sz == 0;
1833 }
1834
1835 static void test_props(void)
1836 {
1837     MSIHANDLE hpkg, hdb;
1838     UINT r;
1839     DWORD sz;
1840     char buffer[0x100];
1841
1842     hdb = create_package_db();
1843     r = run_query( hdb,
1844             "CREATE TABLE `Property` ( "
1845             "`Property` CHAR(255) NOT NULL, "
1846             "`Value` CHAR(255) "
1847             "PRIMARY KEY `Property`)" );
1848     ok( r == ERROR_SUCCESS , "Failed\n" );
1849
1850     r = run_query(hdb,
1851             "INSERT INTO `Property` "
1852             "(`Property`, `Value`) "
1853             "VALUES( 'MetadataCompName', 'Photoshop.dll' )");
1854     ok( r == ERROR_SUCCESS , "Failed\n" );
1855
1856     hpkg = package_from_db( hdb );
1857     ok( hpkg, "failed to create package\n");
1858
1859     /* test invalid values */
1860     r = MsiGetProperty( 0, NULL, NULL, NULL );
1861     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1862
1863     r = MsiGetProperty( hpkg, NULL, NULL, NULL );
1864     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1865
1866     r = MsiGetProperty( hpkg, "boo", NULL, NULL );
1867     ok( r == ERROR_SUCCESS, "wrong return val\n");
1868
1869     r = MsiGetProperty( hpkg, "boo", buffer, NULL );
1870     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1871
1872     /* test retrieving an empty/nonexistent property */
1873     sz = sizeof buffer;
1874     r = MsiGetProperty( hpkg, "boo", NULL, &sz );
1875     ok( r == ERROR_SUCCESS, "wrong return val\n");
1876     ok( sz == 0, "wrong size returned\n");
1877
1878     check_prop_empty( hpkg, "boo");
1879     sz = 0;
1880     strcpy(buffer,"x");
1881     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1882     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1883     ok( !strcmp(buffer,"x"), "buffer was changed\n");
1884     ok( sz == 0, "wrong size returned\n");
1885
1886     sz = 1;
1887     strcpy(buffer,"x");
1888     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1889     ok( r == ERROR_SUCCESS, "wrong return val\n");
1890     ok( buffer[0] == 0, "buffer was not changed\n");
1891     ok( sz == 0, "wrong size returned\n");
1892
1893     /* set the property to something */
1894     r = MsiSetProperty( 0, NULL, NULL );
1895     ok( r == ERROR_INVALID_HANDLE, "wrong return val\n");
1896
1897     r = MsiSetProperty( hpkg, NULL, NULL );
1898     ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n");
1899
1900     r = MsiSetProperty( hpkg, "", NULL );
1901     ok( r == ERROR_SUCCESS, "wrong return val\n");
1902
1903     /* try set and get some illegal property identifiers */
1904     r = MsiSetProperty( hpkg, "", "asdf" );
1905     ok( r == ERROR_FUNCTION_FAILED, "wrong return val\n");
1906
1907     r = MsiSetProperty( hpkg, "=", "asdf" );
1908     ok( r == ERROR_SUCCESS, "wrong return val\n");
1909
1910     r = MsiSetProperty( hpkg, " ", "asdf" );
1911     ok( r == ERROR_SUCCESS, "wrong return val\n");
1912
1913     r = MsiSetProperty( hpkg, "'", "asdf" );
1914     ok( r == ERROR_SUCCESS, "wrong return val\n");
1915
1916     sz = sizeof buffer;
1917     buffer[0]=0;
1918     r = MsiGetProperty( hpkg, "'", buffer, &sz );
1919     ok( r == ERROR_SUCCESS, "wrong return val\n");
1920     ok( !strcmp(buffer,"asdf"), "buffer was not changed\n");
1921
1922     /* set empty values */
1923     r = MsiSetProperty( hpkg, "boo", NULL );
1924     ok( r == ERROR_SUCCESS, "wrong return val\n");
1925     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1926
1927     r = MsiSetProperty( hpkg, "boo", "" );
1928     ok( r == ERROR_SUCCESS, "wrong return val\n");
1929     ok( check_prop_empty( hpkg, "boo"), "prop wasn't empty\n");
1930
1931     /* set a non-empty value */
1932     r = MsiSetProperty( hpkg, "boo", "xyz" );
1933     ok( r == ERROR_SUCCESS, "wrong return val\n");
1934
1935     sz = 1;
1936     strcpy(buffer,"x");
1937     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1938     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1939     ok( buffer[0] == 0, "buffer was not changed\n");
1940     ok( sz == 3, "wrong size returned\n");
1941
1942     sz = 4;
1943     strcpy(buffer,"x");
1944     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1945     ok( r == ERROR_SUCCESS, "wrong return val\n");
1946     ok( !strcmp(buffer,"xyz"), "buffer was not changed\n");
1947     ok( sz == 3, "wrong size returned\n");
1948
1949     sz = 3;
1950     strcpy(buffer,"x");
1951     r = MsiGetProperty( hpkg, "boo", buffer, &sz );
1952     ok( r == ERROR_MORE_DATA, "wrong return val\n");
1953     ok( !strcmp(buffer,"xy"), "buffer was not changed\n");
1954     ok( sz == 3, "wrong size returned\n");
1955
1956     r = MsiSetProperty(hpkg, "SourceDir", "foo");
1957     ok( r == ERROR_SUCCESS, "wrong return val\n");
1958
1959     sz = 4;
1960     r = MsiGetProperty(hpkg, "SOURCEDIR", buffer, &sz);
1961     ok( r == ERROR_SUCCESS, "wrong return val\n");
1962     ok( !strcmp(buffer,""), "buffer wrong\n");
1963     ok( sz == 0, "wrong size returned\n");
1964
1965     sz = 4;
1966     r = MsiGetProperty(hpkg, "SOMERANDOMNAME", buffer, &sz);
1967     ok( r == ERROR_SUCCESS, "wrong return val\n");
1968     ok( !strcmp(buffer,""), "buffer wrong\n");
1969     ok( sz == 0, "wrong size returned\n");
1970
1971     sz = 4;
1972     r = MsiGetProperty(hpkg, "SourceDir", buffer, &sz);
1973     ok( r == ERROR_SUCCESS, "wrong return val\n");
1974     ok( !strcmp(buffer,"foo"), "buffer wrong\n");
1975     ok( sz == 3, "wrong size returned\n");
1976
1977     r = MsiSetProperty(hpkg, "MetadataCompName", "Photoshop.dll");
1978     ok( r == ERROR_SUCCESS, "wrong return val\n");
1979
1980     sz = 0;
1981     r = MsiGetProperty(hpkg, "MetadataCompName", NULL, &sz );
1982     ok( r == ERROR_SUCCESS, "return wrong\n");
1983     ok( sz == 13, "size wrong (%d)\n", sz);
1984
1985     sz = 13;
1986     r = MsiGetProperty(hpkg, "MetadataCompName", buffer, &sz );
1987     ok( r == ERROR_MORE_DATA, "return wrong\n");
1988     ok( !strcmp(buffer,"Photoshop.dl"), "buffer wrong\n");
1989
1990     r = MsiSetProperty(hpkg, "property", "value");
1991     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1992
1993     sz = 6;
1994     r = MsiGetProperty(hpkg, "property", buffer, &sz);
1995     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1996     ok( !strcmp(buffer, "value"), "Expected value, got %s\n", buffer);
1997
1998     r = MsiSetProperty(hpkg, "property", NULL);
1999     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2000
2001     sz = 6;
2002     r = MsiGetProperty(hpkg, "property", buffer, &sz);
2003     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2004     ok( !strlen(buffer), "Expected empty string, got %s\n", buffer);
2005
2006     MsiCloseHandle( hpkg );
2007     DeleteFile(msifile);
2008 }
2009
2010 static BOOL find_prop_in_property(MSIHANDLE hdb, LPCSTR prop, LPCSTR val)
2011 {
2012     MSIHANDLE hview, hrec;
2013     BOOL found;
2014     CHAR buffer[MAX_PATH];
2015     DWORD sz;
2016     UINT r;
2017
2018     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
2019     ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
2020     r = MsiViewExecute(hview, 0);
2021     ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
2022
2023     found = FALSE;
2024     while (r == ERROR_SUCCESS && !found)
2025     {
2026         r = MsiViewFetch(hview, &hrec);
2027         if (r != ERROR_SUCCESS) break;
2028
2029         sz = MAX_PATH;
2030         r = MsiRecordGetString(hrec, 1, buffer, &sz);
2031         if (r == ERROR_SUCCESS && !lstrcmpA(buffer, prop))
2032         {
2033             sz = MAX_PATH;
2034             r = MsiRecordGetString(hrec, 2, buffer, &sz);
2035             if (r == ERROR_SUCCESS && !lstrcmpA(buffer, val))
2036                 found = TRUE;
2037         }
2038
2039         MsiCloseHandle(hrec);
2040     }
2041
2042     MsiViewClose(hview);
2043     MsiCloseHandle(hview);
2044
2045     return found;
2046 }
2047
2048 static void test_property_table(void)
2049 {
2050     const char *query;
2051     UINT r;
2052     MSIHANDLE hpkg, hdb, hrec;
2053     char buffer[MAX_PATH];
2054     DWORD sz;
2055     BOOL found;
2056
2057     hdb = create_package_db();
2058     ok( hdb, "failed to create package\n");
2059
2060     hpkg = package_from_db(hdb);
2061     ok( hpkg, "failed to create package\n");
2062
2063     MsiCloseHandle(hdb);
2064
2065     hdb = MsiGetActiveDatabase(hpkg);
2066
2067     query = "CREATE TABLE `_Property` ( "
2068         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
2069     r = run_query(hdb, query);
2070     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
2071
2072     MsiCloseHandle(hdb);
2073     MsiCloseHandle(hpkg);
2074     DeleteFile(msifile);
2075
2076     hdb = create_package_db();
2077     ok( hdb, "failed to create package\n");
2078
2079     query = "CREATE TABLE `_Property` ( "
2080         "`foo` INT NOT NULL, `bar` INT LOCALIZABLE PRIMARY KEY `foo`)";
2081     r = run_query(hdb, query);
2082     ok(r == ERROR_SUCCESS, "failed to create table\n");
2083
2084     query = "ALTER `_Property` ADD `foo` INTEGER";
2085     r = run_query(hdb, query);
2086     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
2087
2088     query = "ALTER TABLE `_Property` ADD `foo` INTEGER";
2089     r = run_query(hdb, query);
2090     ok(r == ERROR_BAD_QUERY_SYNTAX, "failed to add column\n");
2091
2092     query = "ALTER TABLE `_Property` ADD `extra` INTEGER";
2093     r = run_query(hdb, query);
2094     ok(r == ERROR_SUCCESS, "failed to add column\n");
2095
2096     hpkg = package_from_db(hdb);
2097     todo_wine
2098     {
2099         ok(!hpkg, "package should not be created\n");
2100     }
2101
2102     MsiCloseHandle(hdb);
2103     MsiCloseHandle(hpkg);
2104     DeleteFile(msifile);
2105
2106     hdb = create_package_db();
2107     ok (hdb, "failed to create package database\n");
2108
2109     r = create_property_table(hdb);
2110     ok(r == ERROR_SUCCESS, "cannot create Property table: %d\n", r);
2111
2112     r = add_property_entry(hdb, "'prop', 'val'");
2113     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2114
2115     hpkg = package_from_db(hdb);
2116     ok(hpkg, "failed to create package\n");
2117
2118     MsiCloseHandle(hdb);
2119
2120     sz = MAX_PATH;
2121     r = MsiGetProperty(hpkg, "prop", buffer, &sz);
2122     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2123     ok(!lstrcmp(buffer, "val"), "Expected val, got %s\n", buffer);
2124
2125     hdb = MsiGetActiveDatabase(hpkg);
2126
2127     found = find_prop_in_property(hdb, "prop", "val");
2128     ok(found, "prop should be in the _Property table\n");
2129
2130     r = add_property_entry(hdb, "'dantes', 'mercedes'");
2131     ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r);
2132
2133     query = "SELECT * FROM `_Property` WHERE `Property` = 'dantes'";
2134     r = do_query(hdb, query, &hrec);
2135     ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
2136
2137     found = find_prop_in_property(hdb, "dantes", "mercedes");
2138     ok(found == FALSE, "dantes should not be in the _Property table\n");
2139
2140     sz = MAX_PATH;
2141     lstrcpy(buffer, "aaa");
2142     r = MsiGetProperty(hpkg, "dantes", buffer, &sz);
2143     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2144     ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer);
2145
2146     r = MsiSetProperty(hpkg, "dantes", "mercedes");
2147     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2148
2149     found = find_prop_in_property(hdb, "dantes", "mercedes");
2150     ok(found == TRUE, "dantes should be in the _Property table\n");
2151
2152     MsiCloseHandle(hdb);
2153     MsiCloseHandle(hpkg);
2154     DeleteFile(msifile);
2155 }
2156
2157 static UINT try_query_param( MSIHANDLE hdb, LPCSTR szQuery, MSIHANDLE hrec )
2158 {
2159     MSIHANDLE htab = 0;
2160     UINT res;
2161
2162     res = MsiDatabaseOpenView( hdb, szQuery, &htab );
2163     if( res == ERROR_SUCCESS )
2164     {
2165         UINT r;
2166
2167         r = MsiViewExecute( htab, hrec );
2168         if( r != ERROR_SUCCESS )
2169         {
2170             res = r;
2171             fprintf(stderr,"MsiViewExecute failed %08x\n", res);
2172         }
2173
2174         r = MsiViewClose( htab );
2175         if( r != ERROR_SUCCESS )
2176             res = r;
2177
2178         r = MsiCloseHandle( htab );
2179         if( r != ERROR_SUCCESS )
2180             res = r;
2181     }
2182     return res;
2183 }
2184
2185 static UINT try_query( MSIHANDLE hdb, LPCSTR szQuery )
2186 {
2187     return try_query_param( hdb, szQuery, 0 );
2188 }
2189
2190 static void set_summary_str(MSIHANDLE hdb, DWORD pid, LPCSTR value)
2191 {
2192     MSIHANDLE summary;
2193     UINT r;
2194
2195     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2196     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2197
2198     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_LPSTR, 0, NULL, value);
2199     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2200
2201     r = MsiSummaryInfoPersist(summary);
2202     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2203
2204     MsiCloseHandle(summary);
2205 }
2206
2207 static void set_summary_dword(MSIHANDLE hdb, DWORD pid, DWORD value)
2208 {
2209     MSIHANDLE summary;
2210     UINT r;
2211
2212     r = MsiGetSummaryInformationA(hdb, NULL, 1, &summary);
2213     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2214
2215     r = MsiSummaryInfoSetPropertyA(summary, pid, VT_I4, value, NULL, NULL);
2216     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2217
2218     r = MsiSummaryInfoPersist(summary);
2219     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2220
2221     MsiCloseHandle(summary);
2222 }
2223
2224 static void test_msipackage(void)
2225 {
2226     MSIHANDLE hdb = 0, hpack = 100;
2227     UINT r;
2228     const char *query;
2229     char name[10];
2230
2231     /* NULL szPackagePath */
2232     r = MsiOpenPackage(NULL, &hpack);
2233     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2234
2235     /* empty szPackagePath */
2236     r = MsiOpenPackage("", &hpack);
2237     todo_wine
2238     {
2239         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2240     }
2241
2242     if (r == ERROR_SUCCESS)
2243         MsiCloseHandle(hpack);
2244
2245     /* nonexistent szPackagePath */
2246     r = MsiOpenPackage("nonexistent", &hpack);
2247     ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r);
2248
2249     /* NULL hProduct */
2250     r = MsiOpenPackage(msifile, NULL);
2251     ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
2252
2253     name[0]='#';
2254     name[1]=0;
2255     r = MsiOpenPackage(name, &hpack);
2256     ok(r == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", r);
2257
2258     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2259     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2260
2261     /* database exists, but is emtpy */
2262     sprintf(name, "#%ld", hdb);
2263     r = MsiOpenPackage(name, &hpack);
2264     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2265        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2266
2267     query = "CREATE TABLE `Property` ( "
2268             "`Property` CHAR(72), `Value` CHAR(0) "
2269             "PRIMARY KEY `Property`)";
2270     r = try_query(hdb, query);
2271     ok(r == ERROR_SUCCESS, "failed to create Properties table\n");
2272
2273     query = "CREATE TABLE `InstallExecuteSequence` ("
2274             "`Action` CHAR(72), `Condition` CHAR(0), `Sequence` INTEGER "
2275             "PRIMARY KEY `Action`)";
2276     r = try_query(hdb, query);
2277     ok(r == ERROR_SUCCESS, "failed to create InstallExecuteSequence table\n");
2278
2279     /* a few key tables exist */
2280     sprintf(name, "#%ld", hdb);
2281     r = MsiOpenPackage(name, &hpack);
2282     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2283        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2284
2285     MsiCloseHandle(hdb);
2286     DeleteFile(msifile);
2287
2288     /* start with a clean database to show what constitutes a valid package */
2289     r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
2290     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2291
2292     sprintf(name, "#%ld", hdb);
2293
2294     /* The following summary information props must exist:
2295      *  - PID_REVNUMBER
2296      *  - PID_PAGECOUNT
2297      */
2298
2299     set_summary_dword(hdb, PID_PAGECOUNT, 100);
2300     r = MsiOpenPackage(name, &hpack);
2301     ok(r == ERROR_INSTALL_PACKAGE_INVALID,
2302        "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
2303
2304     set_summary_str(hdb, PID_REVNUMBER, "{004757CD-5092-49c2-AD20-28E1CE0DF5F2}");
2305     r = MsiOpenPackage(name, &hpack);
2306     ok(r == ERROR_SUCCESS,
2307        "Expected ERROR_SUCCESS, got %d\n", r);
2308
2309     MsiCloseHandle(hpack);
2310     MsiCloseHandle(hdb);
2311     DeleteFile(msifile);
2312 }
2313
2314 static void test_formatrecord2(void)
2315 {
2316     MSIHANDLE hpkg, hrec ;
2317     char buffer[0x100];
2318     DWORD sz;
2319     UINT r;
2320
2321     hpkg = package_from_db(create_package_db());
2322     ok( hpkg, "failed to create package\n");
2323
2324     r = MsiSetProperty(hpkg, "Manufacturer", " " );
2325     ok( r == ERROR_SUCCESS, "set property failed\n");
2326
2327     hrec = MsiCreateRecord(2);
2328     ok(hrec, "create record failed\n");
2329
2330     r = MsiRecordSetString( hrec, 0, "[ProgramFilesFolder][Manufacturer]\\asdf");
2331     ok( r == ERROR_SUCCESS, "format record failed\n");
2332
2333     buffer[0] = 0;
2334     sz = sizeof buffer;
2335     r = MsiFormatRecord( hpkg, hrec, buffer, &sz );
2336
2337     r = MsiRecordSetString(hrec, 0, "[foo][1]");
2338     r = MsiRecordSetString(hrec, 1, "hoo");
2339     sz = sizeof buffer;
2340     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2341     ok( sz == 3, "size wrong\n");
2342     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2343     ok( r == ERROR_SUCCESS, "format failed\n");
2344
2345     r = MsiRecordSetString(hrec, 0, "x[~]x");
2346     sz = sizeof buffer;
2347     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2348     ok( sz == 3, "size wrong\n");
2349     ok( 0 == strcmp(buffer,"x"), "wrong output %s\n",buffer);
2350     ok( r == ERROR_SUCCESS, "format failed\n");
2351
2352     r = MsiRecordSetString(hrec, 0, "[foo.$%}][1]");
2353     r = MsiRecordSetString(hrec, 1, "hoo");
2354     sz = sizeof buffer;
2355     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2356     ok( sz == 3, "size wrong\n");
2357     ok( 0 == strcmp(buffer,"hoo"), "wrong output %s\n",buffer);
2358     ok( r == ERROR_SUCCESS, "format failed\n");
2359
2360     r = MsiRecordSetString(hrec, 0, "[\\[]");
2361     sz = sizeof buffer;
2362     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2363     ok( sz == 1, "size wrong\n");
2364     ok( 0 == strcmp(buffer,"["), "wrong output %s\n",buffer);
2365     ok( r == ERROR_SUCCESS, "format failed\n");
2366
2367     SetEnvironmentVariable("FOO", "BAR");
2368     r = MsiRecordSetString(hrec, 0, "[%FOO]");
2369     sz = sizeof buffer;
2370     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2371     ok( sz == 3, "size wrong\n");
2372     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2373     ok( r == ERROR_SUCCESS, "format failed\n");
2374
2375     r = MsiRecordSetString(hrec, 0, "[[1]]");
2376     r = MsiRecordSetString(hrec, 1, "%FOO");
2377     sz = sizeof buffer;
2378     r = MsiFormatRecord(hpkg, hrec, buffer, &sz);
2379     ok( sz == 3, "size wrong\n");
2380     ok( 0 == strcmp(buffer,"BAR"), "wrong output %s\n",buffer);
2381     ok( r == ERROR_SUCCESS, "format failed\n");
2382
2383     MsiCloseHandle( hrec );
2384     MsiCloseHandle( hpkg );
2385     DeleteFile(msifile);
2386 }
2387
2388 static void test_states(void)
2389 {
2390     MSIHANDLE hpkg;
2391     UINT r;
2392     MSIHANDLE hdb;
2393     INSTALLSTATE state, action;
2394
2395     static const CHAR msifile2[] = "winetest2.msi";
2396     static const CHAR msifile3[] = "winetest3.msi";
2397
2398     hdb = create_package_db();
2399     ok ( hdb, "failed to create package database\n" );
2400
2401     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
2402     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
2403
2404     r = create_property_table( hdb );
2405     ok( r == ERROR_SUCCESS, "cannot create Property table: %d\n", r );
2406
2407     r = add_property_entry( hdb, "'ProductCode', '{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}'" );
2408     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2409
2410     r = add_property_entry( hdb, "'ProductLanguage', '1033'" );
2411     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2412
2413     r = add_property_entry( hdb, "'ProductName', 'MSITEST'" );
2414     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2415
2416     r = add_property_entry( hdb, "'ProductVersion', '1.1.1'" );
2417     ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r );
2418
2419     r = create_install_execute_sequence_table( hdb );
2420     ok( r == ERROR_SUCCESS, "cannot create InstallExecuteSequence table: %d\n", r );
2421
2422     r = add_install_execute_sequence_entry( hdb, "'CostInitialize', '', '800'" );
2423     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2424
2425     r = add_install_execute_sequence_entry( hdb, "'FileCost', '', '900'" );
2426     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2427
2428     r = add_install_execute_sequence_entry( hdb, "'CostFinalize', '', '1000'" );
2429     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2430
2431     r = add_install_execute_sequence_entry( hdb, "'InstallValidate', '', '1400'" );
2432     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2433
2434     r = add_install_execute_sequence_entry( hdb, "'InstallInitialize', '', '1500'" );
2435     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2436
2437     r = add_install_execute_sequence_entry( hdb, "'ProcessComponents', '', '1600'" );
2438     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2439
2440     r = add_install_execute_sequence_entry( hdb, "'UnpublishFeatures', '', '1800'" );
2441     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2442
2443     r = add_install_execute_sequence_entry( hdb, "'RegisterProduct', '', '6100'" );
2444     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2445
2446     r = add_install_execute_sequence_entry( hdb, "'PublishFeatures', '', '6300'" );
2447     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2448
2449     r = add_install_execute_sequence_entry( hdb, "'PublishProduct', '', '6400'" );
2450     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2451
2452     r = add_install_execute_sequence_entry( hdb, "'InstallFinalize', '', '6600'" );
2453     ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry: %d\n", r );
2454
2455     r = create_media_table( hdb );
2456     ok( r == ERROR_SUCCESS, "cannot create media table: %d\n", r );
2457
2458     r = add_media_entry( hdb, "'1', '3', '', '', 'DISK1', ''");
2459     ok( r == ERROR_SUCCESS, "cannot add media entry: %d\n", r );
2460
2461     r = create_feature_table( hdb );
2462     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
2463
2464     r = create_component_table( hdb );
2465     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
2466
2467     /* msidbFeatureAttributesFavorLocal */
2468     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
2469     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2470
2471     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
2472     r = add_component_entry( hdb, "'alpha', '{467EC132-739D-4784-A37B-677AA43DBC94}', 'TARGETDIR', 0, '', 'alpha_file'" );
2473     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2474
2475     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
2476     r = add_component_entry( hdb, "'beta', '{2C1F189C-24A6-4C34-B26B-994A6C026506}', 'TARGETDIR', 1, '', 'beta_file'" );
2477     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2478
2479     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
2480     r = add_component_entry( hdb, "'gamma', '{C271E2A4-DE2E-4F70-86D1-6984AF7DE2CA}', 'TARGETDIR', 2, '', 'gamma_file'" );
2481     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2482
2483     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSharedDllRefCount */
2484     r = add_component_entry( hdb, "'theta', '{4EB3129D-81A8-48D5-9801-75600FED3DD9}', 'TARGETDIR', 8, '', 'theta_file'" );
2485     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2486
2487     /* msidbFeatureAttributesFavorSource */
2488     r = add_feature_entry( hdb, "'two', '', '', '', 2, 1, '', 1" );
2489     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2490
2491     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
2492     r = add_component_entry( hdb, "'delta', '{938FD4F2-C648-4259-A03C-7AA3B45643F3}', 'TARGETDIR', 0, '', 'delta_file'" );
2493     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2494
2495     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2496     r = add_component_entry( hdb, "'epsilon', '{D59713B6-C11D-47F2-A395-1E5321781190}', 'TARGETDIR', 1, '', 'epsilon_file'" );
2497     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2498
2499     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
2500     r = add_component_entry( hdb, "'zeta', '{377D33AB-2FAA-42B9-A629-0C0DAE9B9C7A}', 'TARGETDIR', 2, '', 'zeta_file'" );
2501     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2502
2503     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSharedDllRefCount */
2504     r = add_component_entry( hdb, "'iota', '{5D36F871-B5ED-4801-9E0F-C46B9E5C9669}', 'TARGETDIR', 8, '', 'iota_file'" );
2505     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2506
2507     /* msidbFeatureAttributesFavorSource */
2508     r = add_feature_entry( hdb, "'three', '', '', '', 2, 1, '', 1" );
2509     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2510
2511     /* msidbFeatureAttributesFavorLocal */
2512     r = add_feature_entry( hdb, "'four', '', '', '', 2, 1, '', 0" );
2513     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2514
2515     /* disabled */
2516     r = add_feature_entry( hdb, "'five', '', '', '', 2, 0, '', 1" );
2517     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2518
2519     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
2520     r = add_component_entry( hdb, "'eta', '{DD89003F-0DD4-41B8-81C0-3411A7DA2695}', 'TARGETDIR', 1, '', 'eta_file'" );
2521     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2522
2523     /* no feature parent:msidbComponentAttributesLocalOnly */
2524     r = add_component_entry( hdb, "'kappa', '{D6B93DC3-8DA5-4769-9888-42BFE156BB8B}', 'TARGETDIR', 1, '', 'kappa_file'" );
2525     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2526
2527     /* msidbFeatureAttributesFavorLocal:removed */
2528     r = add_feature_entry( hdb, "'six', '', '', '', 2, 1, '', 0" );
2529     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2530
2531     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesLocalOnly */
2532     r = add_component_entry( hdb, "'lambda', '{6528C5E4-02A4-4636-A214-7A66A6C35B64}', 'TARGETDIR', 0, '', 'lambda_file'" );
2533     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2534
2535     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSourceOnly */
2536     r = add_component_entry( hdb, "'mu', '{97014BAB-6C56-4013-9A63-2BF913B42519}', 'TARGETDIR', 1, '', 'mu_file'" );
2537     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2538
2539     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesOptional */
2540     r = add_component_entry( hdb, "'nu', '{943DD0D8-5808-4954-8526-3B8493FEDDCD}', 'TARGETDIR', 2, '', 'nu_file'" );
2541     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2542
2543     /* msidbFeatureAttributesFavorLocal:removed:msidbComponentAttributesSharedDllRefCount */
2544     r = add_component_entry( hdb, "'xi', '{D6CF9EF7-6FCF-4930-B34B-F938AEFF9BDB}', 'TARGETDIR', 8, '', 'xi_file'" );
2545     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2546
2547     /* msidbFeatureAttributesFavorSource:removed */
2548     r = add_feature_entry( hdb, "'seven', '', '', '', 2, 1, '', 1" );
2549     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
2550
2551     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesLocalOnly */
2552     r = add_component_entry( hdb, "'omicron', '{7B57521D-15DB-4141-9AA6-01D934A4433F}', 'TARGETDIR', 0, '', 'omicron_file'" );
2553     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2554
2555     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSourceOnly */
2556     r = add_component_entry( hdb, "'pi', '{FB85346B-378E-4492-8769-792305471C81}', 'TARGETDIR', 1, '', 'pi_file'" );
2557     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2558
2559     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesOptional */
2560     r = add_component_entry( hdb, "'rho', '{798F2047-7B0C-4783-8BB0-D703E554114B}', 'TARGETDIR', 2, '', 'rho_file'" );
2561     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2562
2563     /* msidbFeatureAttributesFavorSource:removed:msidbComponentAttributesSharedDllRefCount */
2564     r = add_component_entry( hdb, "'sigma', '{5CE9DDA8-B67B-4736-9D93-99D61C5B93E7}', 'TARGETDIR', 8, '', 'sigma_file'" );
2565     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
2566
2567     r = create_feature_components_table( hdb );
2568     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
2569
2570     r = add_feature_components_entry( hdb, "'one', 'alpha'" );
2571     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2572
2573     r = add_feature_components_entry( hdb, "'one', 'beta'" );
2574     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2575
2576     r = add_feature_components_entry( hdb, "'one', 'gamma'" );
2577     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2578
2579     r = add_feature_components_entry( hdb, "'one', 'theta'" );
2580     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2581
2582     r = add_feature_components_entry( hdb, "'two', 'delta'" );
2583     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2584
2585     r = add_feature_components_entry( hdb, "'two', 'epsilon'" );
2586     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2587
2588     r = add_feature_components_entry( hdb, "'two', 'zeta'" );
2589     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2590
2591     r = add_feature_components_entry( hdb, "'two', 'iota'" );
2592     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2593
2594     r = add_feature_components_entry( hdb, "'three', 'eta'" );
2595     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2596
2597     r = add_feature_components_entry( hdb, "'four', 'eta'" );
2598     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2599
2600     r = add_feature_components_entry( hdb, "'five', 'eta'" );
2601     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2602
2603     r = add_feature_components_entry( hdb, "'six', 'lambda'" );
2604     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2605
2606     r = add_feature_components_entry( hdb, "'six', 'mu'" );
2607     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2608
2609     r = add_feature_components_entry( hdb, "'six', 'nu'" );
2610     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2611
2612     r = add_feature_components_entry( hdb, "'six', 'xi'" );
2613     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2614
2615     r = add_feature_components_entry( hdb, "'seven', 'omicron'" );
2616     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2617
2618     r = add_feature_components_entry( hdb, "'seven', 'pi'" );
2619     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2620
2621     r = add_feature_components_entry( hdb, "'seven', 'rho'" );
2622     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2623
2624     r = add_feature_components_entry( hdb, "'seven', 'sigma'" );
2625     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
2626
2627     r = create_file_table( hdb );
2628     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
2629
2630     r = add_file_entry( hdb, "'alpha_file', 'alpha', 'alpha.txt', 100, '', '1033', 8192, 1" );
2631     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2632
2633     r = add_file_entry( hdb, "'beta_file', 'beta', 'beta.txt', 0, '', '1033', 8192, 1" );
2634     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2635
2636     r = add_file_entry( hdb, "'gamma_file', 'gamma', 'gamma.txt', 0, '', '1033', 8192, 1" );
2637     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2638
2639     r = add_file_entry( hdb, "'theta_file', 'theta', 'theta.txt', 0, '', '1033', 8192, 1" );
2640     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2641
2642     r = add_file_entry( hdb, "'delta_file', 'delta', 'delta.txt', 0, '', '1033', 8192, 1" );
2643     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2644
2645     r = add_file_entry( hdb, "'epsilon_file', 'epsilon', 'epsilon.txt', 0, '', '1033', 8192, 1" );
2646     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2647
2648     r = add_file_entry( hdb, "'zeta_file', 'zeta', 'zeta.txt', 0, '', '1033', 8192, 1" );
2649     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2650
2651     r = add_file_entry( hdb, "'iota_file', 'iota', 'iota.txt', 0, '', '1033', 8192, 1" );
2652     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2653
2654     /* compressed file */
2655     r = add_file_entry( hdb, "'eta_file', 'eta', 'eta.txt', 0, '', '1033', 16384, 1" );
2656     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2657
2658     r = add_file_entry( hdb, "'kappa_file', 'kappa', 'kappa.txt', 0, '', '1033', 8192, 1" );
2659     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2660
2661     r = add_file_entry( hdb, "'lambda_file', 'lambda', 'lambda.txt', 100, '', '1033', 8192, 1" );
2662     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2663
2664     r = add_file_entry( hdb, "'mu_file', 'mu', 'mu.txt', 100, '', '1033', 8192, 1" );
2665     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2666
2667     r = add_file_entry( hdb, "'nu_file', 'nu', 'nu.txt', 100, '', '1033', 8192, 1" );
2668     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2669
2670     r = add_file_entry( hdb, "'xi_file', 'xi', 'xi.txt', 100, '', '1033', 8192, 1" );
2671     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2672
2673     r = add_file_entry( hdb, "'omicron_file', 'omicron', 'omicron.txt', 100, '', '1033', 8192, 1" );
2674     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2675
2676     r = add_file_entry( hdb, "'pi_file', 'pi', 'pi.txt', 100, '', '1033', 8192, 1" );
2677     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2678
2679     r = add_file_entry( hdb, "'rho_file', 'rho', 'rho.txt', 100, '', '1033', 8192, 1" );
2680     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2681
2682     r = add_file_entry( hdb, "'sigma_file', 'sigma', 'sigma.txt', 100, '', '1033', 8192, 1" );
2683     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
2684
2685     MsiDatabaseCommit(hdb);
2686
2687     /* these properties must not be in the saved msi file */
2688     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
2689     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2690
2691     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
2692     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2693
2694     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
2695     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
2696
2697     hpkg = package_from_db( hdb );
2698     ok( hpkg, "failed to create package\n");
2699
2700     MsiCloseHandle(hdb);
2701
2702     CopyFileA(msifile, msifile2, FALSE);
2703     CopyFileA(msifile, msifile3, FALSE);
2704
2705     state = 0xdeadbee;
2706     action = 0xdeadbee;
2707     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2708     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2709     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2710     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2711
2712     state = 0xdeadbee;
2713     action = 0xdeadbee;
2714     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2715     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2716     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2717     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2718
2719     state = 0xdeadbee;
2720     action = 0xdeadbee;
2721     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2722     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2723     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2724     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2725
2726     state = 0xdeadbee;
2727     action = 0xdeadbee;
2728     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2729     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2730     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2731     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2732
2733     state = 0xdeadbee;
2734     action = 0xdeadbee;
2735     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2736     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2737     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2738     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2739
2740     state = 0xdeadbee;
2741     action = 0xdeadbee;
2742     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2743     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2744     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2745     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2746
2747     state = 0xdeadbee;
2748     action = 0xdeadbee;
2749     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2750     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
2751     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2752     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2753
2754     state = 0xdeadbee;
2755     action = 0xdeadbee;
2756     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
2757     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2758     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2759     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2760
2761     state = 0xdeadbee;
2762     action = 0xdeadbee;
2763     r = MsiGetComponentState(hpkg, "beta", &state, &action);
2764     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2765     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2766     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2767
2768     state = 0xdeadbee;
2769     action = 0xdeadbee;
2770     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
2771     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2772     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2773     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2774
2775     state = 0xdeadbee;
2776     action = 0xdeadbee;
2777     r = MsiGetComponentState(hpkg, "theta", &state, &action);
2778     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2779     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2780     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2781
2782     state = 0xdeadbee;
2783     action = 0xdeadbee;
2784     r = MsiGetComponentState(hpkg, "delta", &state, &action);
2785     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2786     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2787     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2788
2789     state = 0xdeadbee;
2790     action = 0xdeadbee;
2791     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
2792     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2793     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2794     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2795
2796     state = 0xdeadbee;
2797     action = 0xdeadbee;
2798     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
2799     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2800     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2801     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2802
2803     state = 0xdeadbee;
2804     action = 0xdeadbee;
2805     r = MsiGetComponentState(hpkg, "iota", &state, &action);
2806     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2807     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2808     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2809
2810     state = 0xdeadbee;
2811     action = 0xdeadbee;
2812     r = MsiGetComponentState(hpkg, "eta", &state, &action);
2813     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2814     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2815     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2816
2817     state = 0xdeadbee;
2818     action = 0xdeadbee;
2819     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
2820     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2821     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2822     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2823
2824     state = 0xdeadbee;
2825     action = 0xdeadbee;
2826     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
2827     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2828     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2829     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2830
2831     state = 0xdeadbee;
2832     action = 0xdeadbee;
2833     r = MsiGetComponentState(hpkg, "mu", &state, &action);
2834     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2835     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2836     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2837
2838     state = 0xdeadbee;
2839     action = 0xdeadbee;
2840     r = MsiGetComponentState(hpkg, "nu", &state, &action);
2841     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2842     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2843     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2844
2845     state = 0xdeadbee;
2846     action = 0xdeadbee;
2847     r = MsiGetComponentState(hpkg, "xi", &state, &action);
2848     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2849     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2850     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2851
2852     state = 0xdeadbee;
2853     action = 0xdeadbee;
2854     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
2855     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2856     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2857     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2858
2859     state = 0xdeadbee;
2860     action = 0xdeadbee;
2861     r = MsiGetComponentState(hpkg, "pi", &state, &action);
2862     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2863     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2864     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2865
2866     state = 0xdeadbee;
2867     action = 0xdeadbee;
2868     r = MsiGetComponentState(hpkg, "rho", &state, &action);
2869     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2870     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2871     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2872
2873     state = 0xdeadbee;
2874     action = 0xdeadbee;
2875     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
2876     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
2877     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
2878     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
2879
2880     r = MsiDoAction( hpkg, "CostInitialize");
2881     ok( r == ERROR_SUCCESS, "cost init failed\n");
2882
2883     state = 0xdeadbee;
2884     action = 0xdeadbee;
2885     r = MsiGetFeatureState(hpkg, "one", &state, &action);
2886     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2887     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2888     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2889
2890     state = 0xdeadbee;
2891     action = 0xdeadbee;
2892     r = MsiGetFeatureState(hpkg, "two", &state, &action);
2893     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2894     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2895     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2896
2897     state = 0xdeadbee;
2898     action = 0xdeadbee;
2899     r = MsiGetFeatureState(hpkg, "three", &state, &action);
2900     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2901     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2902     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2903
2904     state = 0xdeadbee;
2905     action = 0xdeadbee;
2906     r = MsiGetFeatureState(hpkg, "four", &state, &action);
2907     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2908     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2909     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2910
2911     state = 0xdeadbee;
2912     action = 0xdeadbee;
2913     r = MsiGetFeatureState(hpkg, "five", &state, &action);
2914     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2915     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2916     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2917
2918     state = 0xdeadbee;
2919     action = 0xdeadbee;
2920     r = MsiGetFeatureState(hpkg, "six", &state, &action);
2921     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2922     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2923     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2924
2925     state = 0xdeadbee;
2926     action = 0xdeadbee;
2927     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
2928     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2929     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2930     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2931
2932     state = 0xdeadbee;
2933     action = 0xdeadbee;
2934     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
2935     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2936     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2937     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2938
2939     state = 0xdeadbee;
2940     action = 0xdeadbee;
2941     r = MsiGetComponentState(hpkg, "beta", &state, &action);
2942     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2943     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2944     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2945
2946     state = 0xdeadbee;
2947     action = 0xdeadbee;
2948     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
2949     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2950     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2951     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2952
2953     state = 0xdeadbee;
2954     action = 0xdeadbee;
2955     r = MsiGetComponentState(hpkg, "theta", &state, &action);
2956     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2957     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2958     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2959
2960     state = 0xdeadbee;
2961     action = 0xdeadbee;
2962     r = MsiGetComponentState(hpkg, "delta", &state, &action);
2963     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2964     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2965     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2966
2967     state = 0xdeadbee;
2968     action = 0xdeadbee;
2969     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
2970     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2971     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2972     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2973
2974     state = 0xdeadbee;
2975     action = 0xdeadbee;
2976     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
2977     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2978     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2979     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2980
2981     state = 0xdeadbee;
2982     action = 0xdeadbee;
2983     r = MsiGetComponentState(hpkg, "iota", &state, &action);
2984     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2985     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2986     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2987
2988     state = 0xdeadbee;
2989     action = 0xdeadbee;
2990     r = MsiGetComponentState(hpkg, "eta", &state, &action);
2991     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2992     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
2993     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
2994
2995     state = 0xdeadbee;
2996     action = 0xdeadbee;
2997     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
2998     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
2999     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3000     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3001
3002     state = 0xdeadbee;
3003     action = 0xdeadbee;
3004     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3005     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3006     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3007     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3008
3009     state = 0xdeadbee;
3010     action = 0xdeadbee;
3011     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3012     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3013     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3014     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3015
3016     state = 0xdeadbee;
3017     action = 0xdeadbee;
3018     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3019     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3020     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3021     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3022
3023     state = 0xdeadbee;
3024     action = 0xdeadbee;
3025     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3026     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3027     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3028     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3029
3030     state = 0xdeadbee;
3031     action = 0xdeadbee;
3032     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3033     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3034     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3035     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3036
3037     state = 0xdeadbee;
3038     action = 0xdeadbee;
3039     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3040     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3041     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3042     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3043
3044     state = 0xdeadbee;
3045     action = 0xdeadbee;
3046     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3047     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3048     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3049     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3050
3051     state = 0xdeadbee;
3052     action = 0xdeadbee;
3053     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3054     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3055     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3056     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3057
3058     r = MsiDoAction( hpkg, "FileCost");
3059     ok( r == ERROR_SUCCESS, "file cost failed\n");
3060
3061     state = 0xdeadbee;
3062     action = 0xdeadbee;
3063     r = MsiGetFeatureState(hpkg, "one", &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 = MsiGetFeatureState(hpkg, "two", &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 = MsiGetFeatureState(hpkg, "three", &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 = MsiGetFeatureState(hpkg, "four", &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 = MsiGetFeatureState(hpkg, "five", &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 = MsiGetFeatureState(hpkg, "six", &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 = MsiGetFeatureState(hpkg, "seven", &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, "alpha", &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, "beta", &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, "gamma", &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, "theta", &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, "delta", &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     state = 0xdeadbee;
3146     action = 0xdeadbee;
3147     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3148     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3149     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3150     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3151
3152     state = 0xdeadbee;
3153     action = 0xdeadbee;
3154     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3155     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3156     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3157     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3158
3159     state = 0xdeadbee;
3160     action = 0xdeadbee;
3161     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3162     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3163     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3164     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3165
3166     state = 0xdeadbee;
3167     action = 0xdeadbee;
3168     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3169     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3170     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3171     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3172
3173     state = 0xdeadbee;
3174     action = 0xdeadbee;
3175     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3176     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3177     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3178     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3179
3180     state = 0xdeadbee;
3181     action = 0xdeadbee;
3182     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3183     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3184     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3185     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3186
3187     state = 0xdeadbee;
3188     action = 0xdeadbee;
3189     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3190     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3191     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3192     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3193
3194     state = 0xdeadbee;
3195     action = 0xdeadbee;
3196     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3197     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3198     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3199     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3200
3201     state = 0xdeadbee;
3202     action = 0xdeadbee;
3203     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3204     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3205     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3206     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3207
3208     state = 0xdeadbee;
3209     action = 0xdeadbee;
3210     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3211     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3212     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3213     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3214
3215     state = 0xdeadbee;
3216     action = 0xdeadbee;
3217     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3218     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3219     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3220     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3221
3222     state = 0xdeadbee;
3223     action = 0xdeadbee;
3224     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3225     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3226     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3227     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3228
3229     state = 0xdeadbee;
3230     action = 0xdeadbee;
3231     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3232     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3233     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3234     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3235
3236     r = MsiDoAction( hpkg, "CostFinalize");
3237     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
3238
3239     state = 0xdeadbee;
3240     action = 0xdeadbee;
3241     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3242     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3243     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3244     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3245
3246     state = 0xdeadbee;
3247     action = 0xdeadbee;
3248     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3249     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3250     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3251     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3252
3253     state = 0xdeadbee;
3254     action = 0xdeadbee;
3255     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3256     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3257     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3258     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3259
3260     state = 0xdeadbee;
3261     action = 0xdeadbee;
3262     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3263     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3264     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3265     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3266
3267     state = 0xdeadbee;
3268     action = 0xdeadbee;
3269     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3270     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3271     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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 = MsiGetFeatureState(hpkg, "six", &state, &action);
3277     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3278     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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 = MsiGetFeatureState(hpkg, "seven", &state, &action);
3284     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3285     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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, "alpha", &state, &action);
3291     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3292     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3293     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3294
3295     state = 0xdeadbee;
3296     action = 0xdeadbee;
3297     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3298     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3299     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3300     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3301
3302     state = 0xdeadbee;
3303     action = 0xdeadbee;
3304     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3305     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3306     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3307     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3308
3309     state = 0xdeadbee;
3310     action = 0xdeadbee;
3311     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3312     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3313     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3314     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3315
3316     state = 0xdeadbee;
3317     action = 0xdeadbee;
3318     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3319     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3320     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3321     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3322
3323     state = 0xdeadbee;
3324     action = 0xdeadbee;
3325     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3326     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3327     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3328     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3329
3330     state = 0xdeadbee;
3331     action = 0xdeadbee;
3332     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3333     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3334     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3335     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3336
3337     state = 0xdeadbee;
3338     action = 0xdeadbee;
3339     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3340     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3341     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3342     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3343
3344     state = 0xdeadbee;
3345     action = 0xdeadbee;
3346     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3347     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3348     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3349     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3350
3351     state = 0xdeadbee;
3352     action = 0xdeadbee;
3353     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3354     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3355     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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, "lambda", &state, &action);
3361     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3362     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3363     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3364
3365     state = 0xdeadbee;
3366     action = 0xdeadbee;
3367     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3368     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3369     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3370     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3371
3372     state = 0xdeadbee;
3373     action = 0xdeadbee;
3374     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3375     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3376     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3377     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3378
3379     state = 0xdeadbee;
3380     action = 0xdeadbee;
3381     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3382     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3383     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3384     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3385
3386     state = 0xdeadbee;
3387     action = 0xdeadbee;
3388     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3389     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3390     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3391     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3392
3393     state = 0xdeadbee;
3394     action = 0xdeadbee;
3395     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3396     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3397     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3398     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3399
3400     state = 0xdeadbee;
3401     action = 0xdeadbee;
3402     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3403     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3404     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3405     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3406
3407     state = 0xdeadbee;
3408     action = 0xdeadbee;
3409     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3410     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3411     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
3412     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3413
3414     MsiCloseHandle( hpkg );
3415
3416     /* publish the features and components */
3417     r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven");
3418     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3419
3420     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
3421     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
3422
3423     /* these properties must not be in the saved msi file */
3424     r = add_property_entry( hdb, "'ADDLOCAL', 'one,four'");
3425     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3426
3427     r = add_property_entry( hdb, "'ADDSOURCE', 'two,three'");
3428     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3429
3430     r = add_property_entry( hdb, "'REMOVE', 'six,seven'");
3431     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
3432
3433     hpkg = package_from_db( hdb );
3434     ok( hpkg, "failed to create package\n");
3435
3436     MsiCloseHandle(hdb);
3437
3438     state = 0xdeadbee;
3439     action = 0xdeadbee;
3440     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3441     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3442     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3443     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3444
3445     state = 0xdeadbee;
3446     action = 0xdeadbee;
3447     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3448     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3449     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3450     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3451
3452     state = 0xdeadbee;
3453     action = 0xdeadbee;
3454     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3455     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3456     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3457     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3458
3459     state = 0xdeadbee;
3460     action = 0xdeadbee;
3461     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3462     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3463     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3464     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3465
3466     state = 0xdeadbee;
3467     action = 0xdeadbee;
3468     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3469     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3470     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3471     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3472
3473     state = 0xdeadbee;
3474     action = 0xdeadbee;
3475     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3476     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3477     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3478     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3479
3480     state = 0xdeadbee;
3481     action = 0xdeadbee;
3482     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3483     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
3484     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3485     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3486
3487     state = 0xdeadbee;
3488     action = 0xdeadbee;
3489     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3490     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3491     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3492     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3493
3494     state = 0xdeadbee;
3495     action = 0xdeadbee;
3496     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3497     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3498     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3499     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3500
3501     state = 0xdeadbee;
3502     action = 0xdeadbee;
3503     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3504     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3505     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3506     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3507
3508     state = 0xdeadbee;
3509     action = 0xdeadbee;
3510     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3511     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3512     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3513     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3514
3515     state = 0xdeadbee;
3516     action = 0xdeadbee;
3517     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3518     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3519     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3520     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3521
3522     state = 0xdeadbee;
3523     action = 0xdeadbee;
3524     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3525     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3526     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3527     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3528
3529     state = 0xdeadbee;
3530     action = 0xdeadbee;
3531     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3532     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3533     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3534     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3535
3536     state = 0xdeadbee;
3537     action = 0xdeadbee;
3538     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3539     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3540     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3541     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3542
3543     state = 0xdeadbee;
3544     action = 0xdeadbee;
3545     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3546     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3547     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3548     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3549
3550     state = 0xdeadbee;
3551     action = 0xdeadbee;
3552     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3553     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3554     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3555     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3556
3557     state = 0xdeadbee;
3558     action = 0xdeadbee;
3559     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3560     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3561     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3562     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3563
3564     state = 0xdeadbee;
3565     action = 0xdeadbee;
3566     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3567     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3568     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3569     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3570
3571     state = 0xdeadbee;
3572     action = 0xdeadbee;
3573     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3574     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3575     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3576     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3577
3578     state = 0xdeadbee;
3579     action = 0xdeadbee;
3580     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3581     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3582     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3583     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3584
3585     state = 0xdeadbee;
3586     action = 0xdeadbee;
3587     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3588     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3589     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3590     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3591
3592     state = 0xdeadbee;
3593     action = 0xdeadbee;
3594     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3595     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3596     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3597     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3598
3599     state = 0xdeadbee;
3600     action = 0xdeadbee;
3601     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3602     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3603     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3604     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3605
3606     state = 0xdeadbee;
3607     action = 0xdeadbee;
3608     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3609     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
3610     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
3611     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
3612
3613     r = MsiDoAction( hpkg, "CostInitialize");
3614     ok( r == ERROR_SUCCESS, "cost init failed\n");
3615
3616     state = 0xdeadbee;
3617     action = 0xdeadbee;
3618     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3619     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3620     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3621     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3622
3623     state = 0xdeadbee;
3624     action = 0xdeadbee;
3625     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3626     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3627     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3628     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3629
3630     state = 0xdeadbee;
3631     action = 0xdeadbee;
3632     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3633     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3634     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3635     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3636
3637     state = 0xdeadbee;
3638     action = 0xdeadbee;
3639     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3640     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3641     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3642     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3643
3644     state = 0xdeadbee;
3645     action = 0xdeadbee;
3646     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3647     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3648     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3649     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3650
3651     state = 0xdeadbee;
3652     action = 0xdeadbee;
3653     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3654     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3655     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3656     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3657
3658     state = 0xdeadbee;
3659     action = 0xdeadbee;
3660     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3661     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3662     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3663     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3664
3665     state = 0xdeadbee;
3666     action = 0xdeadbee;
3667     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3668     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3669     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3670     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3671
3672     state = 0xdeadbee;
3673     action = 0xdeadbee;
3674     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3675     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3676     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3677     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3678
3679     state = 0xdeadbee;
3680     action = 0xdeadbee;
3681     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3682     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3683     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3684     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3685
3686     state = 0xdeadbee;
3687     action = 0xdeadbee;
3688     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3689     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3690     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3691     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3692
3693     state = 0xdeadbee;
3694     action = 0xdeadbee;
3695     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3696     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3697     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3698     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3699
3700     state = 0xdeadbee;
3701     action = 0xdeadbee;
3702     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3703     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3704     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3705     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3706
3707     state = 0xdeadbee;
3708     action = 0xdeadbee;
3709     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3710     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3711     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3712     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3713
3714     state = 0xdeadbee;
3715     action = 0xdeadbee;
3716     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3717     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3718     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3719     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3720
3721     state = 0xdeadbee;
3722     action = 0xdeadbee;
3723     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3724     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3725     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3726     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3727
3728     state = 0xdeadbee;
3729     action = 0xdeadbee;
3730     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3731     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3732     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3733     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3734
3735     state = 0xdeadbee;
3736     action = 0xdeadbee;
3737     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3738     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3739     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3740     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3741
3742     state = 0xdeadbee;
3743     action = 0xdeadbee;
3744     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3745     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3746     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3747     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3748
3749     state = 0xdeadbee;
3750     action = 0xdeadbee;
3751     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3752     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3753     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3754     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3755
3756     state = 0xdeadbee;
3757     action = 0xdeadbee;
3758     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3759     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3760     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3761     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3762
3763     state = 0xdeadbee;
3764     action = 0xdeadbee;
3765     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3766     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3767     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3768     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3769
3770     state = 0xdeadbee;
3771     action = 0xdeadbee;
3772     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3773     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3774     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3775     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3776
3777     state = 0xdeadbee;
3778     action = 0xdeadbee;
3779     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3780     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3781     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3782     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3783
3784     state = 0xdeadbee;
3785     action = 0xdeadbee;
3786     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3787     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3788     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3789     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3790
3791     r = MsiDoAction( hpkg, "FileCost");
3792     ok( r == ERROR_SUCCESS, "file cost failed\n");
3793
3794     state = 0xdeadbee;
3795     action = 0xdeadbee;
3796     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3797     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3798     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3799     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3800
3801     state = 0xdeadbee;
3802     action = 0xdeadbee;
3803     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3804     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3805     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3806     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3807
3808     state = 0xdeadbee;
3809     action = 0xdeadbee;
3810     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3811     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3812     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3813     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3814
3815     state = 0xdeadbee;
3816     action = 0xdeadbee;
3817     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3818     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3819     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3820     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3821
3822     state = 0xdeadbee;
3823     action = 0xdeadbee;
3824     r = MsiGetFeatureState(hpkg, "five", &state, &action);
3825     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3826     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3827     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3828
3829     state = 0xdeadbee;
3830     action = 0xdeadbee;
3831     r = MsiGetFeatureState(hpkg, "six", &state, &action);
3832     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3833     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3834     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3835
3836     state = 0xdeadbee;
3837     action = 0xdeadbee;
3838     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
3839     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3840     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3841     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3842
3843     state = 0xdeadbee;
3844     action = 0xdeadbee;
3845     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
3846     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3847     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3848     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3849
3850     state = 0xdeadbee;
3851     action = 0xdeadbee;
3852     r = MsiGetComponentState(hpkg, "beta", &state, &action);
3853     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3854     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3855     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3856
3857     state = 0xdeadbee;
3858     action = 0xdeadbee;
3859     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
3860     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3861     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3862     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3863
3864     state = 0xdeadbee;
3865     action = 0xdeadbee;
3866     r = MsiGetComponentState(hpkg, "theta", &state, &action);
3867     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3868     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3869     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3870
3871     state = 0xdeadbee;
3872     action = 0xdeadbee;
3873     r = MsiGetComponentState(hpkg, "delta", &state, &action);
3874     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3875     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3876     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3877
3878     state = 0xdeadbee;
3879     action = 0xdeadbee;
3880     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
3881     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3882     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3883     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3884
3885     state = 0xdeadbee;
3886     action = 0xdeadbee;
3887     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
3888     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3889     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3890     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3891
3892     state = 0xdeadbee;
3893     action = 0xdeadbee;
3894     r = MsiGetComponentState(hpkg, "iota", &state, &action);
3895     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3896     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3897     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3898
3899     state = 0xdeadbee;
3900     action = 0xdeadbee;
3901     r = MsiGetComponentState(hpkg, "eta", &state, &action);
3902     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3903     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3904     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3905
3906     state = 0xdeadbee;
3907     action = 0xdeadbee;
3908     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
3909     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3910     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3911     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3912
3913     state = 0xdeadbee;
3914     action = 0xdeadbee;
3915     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
3916     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3917     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3918     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3919
3920     state = 0xdeadbee;
3921     action = 0xdeadbee;
3922     r = MsiGetComponentState(hpkg, "mu", &state, &action);
3923     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3924     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3925     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3926
3927     state = 0xdeadbee;
3928     action = 0xdeadbee;
3929     r = MsiGetComponentState(hpkg, "nu", &state, &action);
3930     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3931     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3932     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3933
3934     state = 0xdeadbee;
3935     action = 0xdeadbee;
3936     r = MsiGetComponentState(hpkg, "xi", &state, &action);
3937     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3938     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3939     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3940
3941     state = 0xdeadbee;
3942     action = 0xdeadbee;
3943     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
3944     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3945     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3946     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3947
3948     state = 0xdeadbee;
3949     action = 0xdeadbee;
3950     r = MsiGetComponentState(hpkg, "pi", &state, &action);
3951     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3952     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3953     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3954
3955     state = 0xdeadbee;
3956     action = 0xdeadbee;
3957     r = MsiGetComponentState(hpkg, "rho", &state, &action);
3958     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3959     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3960     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3961
3962     state = 0xdeadbee;
3963     action = 0xdeadbee;
3964     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
3965     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3966     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3967     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
3968
3969     r = MsiDoAction( hpkg, "CostFinalize");
3970     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
3971
3972     state = 0xdeadbee;
3973     action = 0xdeadbee;
3974     r = MsiGetFeatureState(hpkg, "one", &state, &action);
3975     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3976     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
3977     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3978
3979     state = 0xdeadbee;
3980     action = 0xdeadbee;
3981     r = MsiGetFeatureState(hpkg, "two", &state, &action);
3982     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3983     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
3984     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
3985
3986     state = 0xdeadbee;
3987     action = 0xdeadbee;
3988     r = MsiGetFeatureState(hpkg, "three", &state, &action);
3989     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3990     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3991     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3992
3993     state = 0xdeadbee;
3994     action = 0xdeadbee;
3995     r = MsiGetFeatureState(hpkg, "four", &state, &action);
3996     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
3997     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3998     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
3999
4000     state = 0xdeadbee;
4001     action = 0xdeadbee;
4002     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4003     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4004     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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 = MsiGetFeatureState(hpkg, "six", &state, &action);
4010     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4011     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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 = MsiGetFeatureState(hpkg, "seven", &state, &action);
4017     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4018     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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, "alpha", &state, &action);
4024     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4025     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4026     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4027
4028     state = 0xdeadbee;
4029     action = 0xdeadbee;
4030     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4031     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4032     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4033     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4034
4035     state = 0xdeadbee;
4036     action = 0xdeadbee;
4037     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4038     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4039     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4040     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4041
4042     state = 0xdeadbee;
4043     action = 0xdeadbee;
4044     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4045     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4046     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4047     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4048
4049     state = 0xdeadbee;
4050     action = 0xdeadbee;
4051     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4052     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4053     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4054     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4055
4056     state = 0xdeadbee;
4057     action = 0xdeadbee;
4058     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4059     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4060     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4061     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4062
4063     state = 0xdeadbee;
4064     action = 0xdeadbee;
4065     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4066     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4067     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4068     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4069
4070     state = 0xdeadbee;
4071     action = 0xdeadbee;
4072     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4073     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4074     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4075     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4076
4077     state = 0xdeadbee;
4078     action = 0xdeadbee;
4079     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4080     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4081     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4082     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4083
4084     state = 0xdeadbee;
4085     action = 0xdeadbee;
4086     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4087     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4088     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4089     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4090
4091     state = 0xdeadbee;
4092     action = 0xdeadbee;
4093     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4094     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4095     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4096     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4097
4098     state = 0xdeadbee;
4099     action = 0xdeadbee;
4100     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4101     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4102     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4103     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4104
4105     state = 0xdeadbee;
4106     action = 0xdeadbee;
4107     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4108     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4109     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4110     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4111
4112     state = 0xdeadbee;
4113     action = 0xdeadbee;
4114     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4115     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4116     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4117     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4118
4119     state = 0xdeadbee;
4120     action = 0xdeadbee;
4121     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4122     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4123     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4124     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4125
4126     state = 0xdeadbee;
4127     action = 0xdeadbee;
4128     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4129     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4130     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4131     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4132
4133     state = 0xdeadbee;
4134     action = 0xdeadbee;
4135     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4136     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4137     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4138     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4139
4140     state = 0xdeadbee;
4141     action = 0xdeadbee;
4142     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4143     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4144     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
4145     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4146
4147     MsiCloseHandle(hpkg);
4148
4149     /* uninstall the product */
4150     r = MsiInstallProduct(msifile, "REMOVE=ALL");
4151     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4152
4153     /* all features installed locally */
4154     r = MsiInstallProduct(msifile2, "ADDLOCAL=ALL");
4155     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4156
4157     r = MsiOpenDatabase(msifile2, MSIDBOPEN_DIRECT, &hdb);
4158     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
4159
4160     /* these properties must not be in the saved msi file */
4161     r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven'");
4162     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
4163
4164     hpkg = package_from_db( hdb );
4165     ok( hpkg, "failed to create package\n");
4166
4167     state = 0xdeadbee;
4168     action = 0xdeadbee;
4169     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4170     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4171     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4172     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4173
4174     state = 0xdeadbee;
4175     action = 0xdeadbee;
4176     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4177     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4178     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4179     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4180
4181     state = 0xdeadbee;
4182     action = 0xdeadbee;
4183     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4184     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4185     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4186     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4187
4188     state = 0xdeadbee;
4189     action = 0xdeadbee;
4190     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4191     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4192     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4193     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4194
4195     state = 0xdeadbee;
4196     action = 0xdeadbee;
4197     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4198     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4199     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4200     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4201
4202     state = 0xdeadbee;
4203     action = 0xdeadbee;
4204     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4205     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4206     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4207     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4208
4209     state = 0xdeadbee;
4210     action = 0xdeadbee;
4211     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4212     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4213     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4214     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4215
4216     state = 0xdeadbee;
4217     action = 0xdeadbee;
4218     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4219     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4220     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4221     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4222
4223     state = 0xdeadbee;
4224     action = 0xdeadbee;
4225     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4226     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4227     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4228     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4229
4230     state = 0xdeadbee;
4231     action = 0xdeadbee;
4232     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4233     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4234     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4235     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4236
4237     state = 0xdeadbee;
4238     action = 0xdeadbee;
4239     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4240     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4241     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4242     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4243
4244     state = 0xdeadbee;
4245     action = 0xdeadbee;
4246     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4247     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4248     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4249     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4250
4251     state = 0xdeadbee;
4252     action = 0xdeadbee;
4253     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4254     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4255     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4256     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4257
4258     state = 0xdeadbee;
4259     action = 0xdeadbee;
4260     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4261     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4262     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4263     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4264
4265     state = 0xdeadbee;
4266     action = 0xdeadbee;
4267     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4268     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4269     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4270     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4271
4272     state = 0xdeadbee;
4273     action = 0xdeadbee;
4274     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4275     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4276     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4277     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4278
4279     state = 0xdeadbee;
4280     action = 0xdeadbee;
4281     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4282     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4283     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4284     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4285
4286     state = 0xdeadbee;
4287     action = 0xdeadbee;
4288     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4289     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4290     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4291     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4292
4293     state = 0xdeadbee;
4294     action = 0xdeadbee;
4295     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4296     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4297     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4298     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4299
4300     state = 0xdeadbee;
4301     action = 0xdeadbee;
4302     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4303     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4304     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4305     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4306
4307     state = 0xdeadbee;
4308     action = 0xdeadbee;
4309     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4310     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4311     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4312     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4313
4314     state = 0xdeadbee;
4315     action = 0xdeadbee;
4316     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4317     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4318     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4319     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4320
4321     state = 0xdeadbee;
4322     action = 0xdeadbee;
4323     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4324     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4325     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4326     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4327
4328     state = 0xdeadbee;
4329     action = 0xdeadbee;
4330     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4331     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4332     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4333     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4334
4335     state = 0xdeadbee;
4336     action = 0xdeadbee;
4337     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4338     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4339     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4340     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4341
4342     r = MsiDoAction( hpkg, "CostInitialize");
4343     ok( r == ERROR_SUCCESS, "cost init failed\n");
4344
4345     state = 0xdeadbee;
4346     action = 0xdeadbee;
4347     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4348     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4349     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4350     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4351
4352     state = 0xdeadbee;
4353     action = 0xdeadbee;
4354     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4355     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4356     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4357     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4358
4359     state = 0xdeadbee;
4360     action = 0xdeadbee;
4361     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4362     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4363     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4364     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4365
4366     state = 0xdeadbee;
4367     action = 0xdeadbee;
4368     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4369     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4370     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4371     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4372
4373     state = 0xdeadbee;
4374     action = 0xdeadbee;
4375     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4376     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4377     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4378     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4379
4380     state = 0xdeadbee;
4381     action = 0xdeadbee;
4382     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4383     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4384     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4385     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4386
4387     state = 0xdeadbee;
4388     action = 0xdeadbee;
4389     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4390     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4391     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4392     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4393
4394     state = 0xdeadbee;
4395     action = 0xdeadbee;
4396     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4397     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4398     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4399     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4400
4401     state = 0xdeadbee;
4402     action = 0xdeadbee;
4403     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4404     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4405     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4406     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4407
4408     state = 0xdeadbee;
4409     action = 0xdeadbee;
4410     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4411     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4412     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4413     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4414
4415     state = 0xdeadbee;
4416     action = 0xdeadbee;
4417     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4418     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4419     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4420     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4421
4422     state = 0xdeadbee;
4423     action = 0xdeadbee;
4424     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4425     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4426     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4427     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4428
4429     state = 0xdeadbee;
4430     action = 0xdeadbee;
4431     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4432     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4433     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4434     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4435
4436     state = 0xdeadbee;
4437     action = 0xdeadbee;
4438     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4439     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4440     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4441     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4442
4443     state = 0xdeadbee;
4444     action = 0xdeadbee;
4445     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4446     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4447     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4448     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4449
4450     state = 0xdeadbee;
4451     action = 0xdeadbee;
4452     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4453     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4454     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4455     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4456
4457     state = 0xdeadbee;
4458     action = 0xdeadbee;
4459     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4460     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4461     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4462     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4463
4464     state = 0xdeadbee;
4465     action = 0xdeadbee;
4466     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4467     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4468     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4469     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4470
4471     state = 0xdeadbee;
4472     action = 0xdeadbee;
4473     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4474     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4475     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4476     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4477
4478     state = 0xdeadbee;
4479     action = 0xdeadbee;
4480     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4481     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4482     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4483     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4484
4485     state = 0xdeadbee;
4486     action = 0xdeadbee;
4487     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4488     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4489     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4490     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4491
4492     state = 0xdeadbee;
4493     action = 0xdeadbee;
4494     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4495     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4496     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4497     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4498
4499     state = 0xdeadbee;
4500     action = 0xdeadbee;
4501     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4502     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4503     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4504     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4505
4506     state = 0xdeadbee;
4507     action = 0xdeadbee;
4508     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4509     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4510     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4511     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4512
4513     state = 0xdeadbee;
4514     action = 0xdeadbee;
4515     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4516     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4517     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4518     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4519
4520     r = MsiDoAction( hpkg, "FileCost");
4521     ok( r == ERROR_SUCCESS, "file cost failed\n");
4522
4523     state = 0xdeadbee;
4524     action = 0xdeadbee;
4525     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4526     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4527     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4528     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4529
4530     state = 0xdeadbee;
4531     action = 0xdeadbee;
4532     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4533     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4534     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4535     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4536
4537     state = 0xdeadbee;
4538     action = 0xdeadbee;
4539     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4540     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4541     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4542     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4543
4544     state = 0xdeadbee;
4545     action = 0xdeadbee;
4546     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4547     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4548     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4549     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4550
4551     state = 0xdeadbee;
4552     action = 0xdeadbee;
4553     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4554     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4555     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4556     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4557
4558     state = 0xdeadbee;
4559     action = 0xdeadbee;
4560     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4561     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4562     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4563     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4564
4565     state = 0xdeadbee;
4566     action = 0xdeadbee;
4567     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4568     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4569     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4570     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4571
4572     state = 0xdeadbee;
4573     action = 0xdeadbee;
4574     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4575     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4576     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4577     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4578
4579     state = 0xdeadbee;
4580     action = 0xdeadbee;
4581     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4582     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4583     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4584     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4585
4586     state = 0xdeadbee;
4587     action = 0xdeadbee;
4588     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4589     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4590     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4591     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4592
4593     state = 0xdeadbee;
4594     action = 0xdeadbee;
4595     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4596     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4597     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4598     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4599
4600     state = 0xdeadbee;
4601     action = 0xdeadbee;
4602     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4603     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4604     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4605     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4606
4607     state = 0xdeadbee;
4608     action = 0xdeadbee;
4609     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4610     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4611     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4612     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4613
4614     state = 0xdeadbee;
4615     action = 0xdeadbee;
4616     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4617     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4618     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4619     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4620
4621     state = 0xdeadbee;
4622     action = 0xdeadbee;
4623     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4624     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4625     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4626     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4627
4628     state = 0xdeadbee;
4629     action = 0xdeadbee;
4630     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4631     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4632     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4633     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4634
4635     state = 0xdeadbee;
4636     action = 0xdeadbee;
4637     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4638     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4639     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4640     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4641
4642     state = 0xdeadbee;
4643     action = 0xdeadbee;
4644     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
4645     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4646     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4647     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4648
4649     state = 0xdeadbee;
4650     action = 0xdeadbee;
4651     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4652     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4653     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4654     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4655
4656     state = 0xdeadbee;
4657     action = 0xdeadbee;
4658     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4659     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4660     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4661     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4662
4663     state = 0xdeadbee;
4664     action = 0xdeadbee;
4665     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4666     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4667     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4668     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4669
4670     state = 0xdeadbee;
4671     action = 0xdeadbee;
4672     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4673     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4674     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4675     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4676
4677     state = 0xdeadbee;
4678     action = 0xdeadbee;
4679     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4680     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4681     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4682     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4683
4684     state = 0xdeadbee;
4685     action = 0xdeadbee;
4686     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4687     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4688     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4689     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4690
4691     state = 0xdeadbee;
4692     action = 0xdeadbee;
4693     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4694     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4695     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4696     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
4697
4698     r = MsiDoAction( hpkg, "CostFinalize");
4699     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
4700
4701     state = 0xdeadbee;
4702     action = 0xdeadbee;
4703     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4704     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4705     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4706     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4707
4708     state = 0xdeadbee;
4709     action = 0xdeadbee;
4710     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4711     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4712     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4713     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4714
4715     state = 0xdeadbee;
4716     action = 0xdeadbee;
4717     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4718     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4719     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4720     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4721
4722     state = 0xdeadbee;
4723     action = 0xdeadbee;
4724     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4725     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4726     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4727     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4728
4729     state = 0xdeadbee;
4730     action = 0xdeadbee;
4731     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4732     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4733     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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, "six", &state, &action);
4739     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4740     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4741     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4742
4743     state = 0xdeadbee;
4744     action = 0xdeadbee;
4745     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4746     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4747     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4748     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4749
4750     state = 0xdeadbee;
4751     action = 0xdeadbee;
4752     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4753     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4754     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4755     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4756
4757     state = 0xdeadbee;
4758     action = 0xdeadbee;
4759     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4760     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4761     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4762     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4763
4764     state = 0xdeadbee;
4765     action = 0xdeadbee;
4766     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4767     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4768     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4769     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4770
4771     state = 0xdeadbee;
4772     action = 0xdeadbee;
4773     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4774     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4775     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4776     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4777
4778     state = 0xdeadbee;
4779     action = 0xdeadbee;
4780     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4781     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4782     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4783     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4784
4785     state = 0xdeadbee;
4786     action = 0xdeadbee;
4787     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4788     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4789     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4790     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4791
4792     state = 0xdeadbee;
4793     action = 0xdeadbee;
4794     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4795     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4796     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4797     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4798
4799     state = 0xdeadbee;
4800     action = 0xdeadbee;
4801     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4802     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4803     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4804     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4805
4806     state = 0xdeadbee;
4807     action = 0xdeadbee;
4808     r = MsiGetComponentState(hpkg, "eta", &state, &action);
4809     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4810     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4811     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
4812
4813     state = 0xdeadbee;
4814     action = 0xdeadbee;
4815     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
4816     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4817     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, 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, "lambda", &state, &action);
4823     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4824     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4825     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4826
4827     state = 0xdeadbee;
4828     action = 0xdeadbee;
4829     r = MsiGetComponentState(hpkg, "mu", &state, &action);
4830     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4831     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4832     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4833
4834     state = 0xdeadbee;
4835     action = 0xdeadbee;
4836     r = MsiGetComponentState(hpkg, "nu", &state, &action);
4837     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4838     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4839     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4840
4841     state = 0xdeadbee;
4842     action = 0xdeadbee;
4843     r = MsiGetComponentState(hpkg, "xi", &state, &action);
4844     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4845     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4846     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4847
4848     state = 0xdeadbee;
4849     action = 0xdeadbee;
4850     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
4851     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4852     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4853     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4854
4855     state = 0xdeadbee;
4856     action = 0xdeadbee;
4857     r = MsiGetComponentState(hpkg, "pi", &state, &action);
4858     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4859     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
4860     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
4861
4862     state = 0xdeadbee;
4863     action = 0xdeadbee;
4864     r = MsiGetComponentState(hpkg, "rho", &state, &action);
4865     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4866     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4867     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4868
4869     state = 0xdeadbee;
4870     action = 0xdeadbee;
4871     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
4872     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
4873     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4874     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4875
4876     MsiCloseHandle(hpkg);
4877
4878     /* uninstall the product */
4879     r = MsiInstallProduct(msifile2, "REMOVE=ALL");
4880     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4881
4882     /* all features installed from source */
4883     r = MsiInstallProduct(msifile3, "ADDSOURCE=ALL");
4884     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4885
4886     r = MsiOpenDatabase(msifile3, MSIDBOPEN_DIRECT, &hdb);
4887     ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r);
4888
4889     /* this property must not be in the saved msi file */
4890     r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven'");
4891     ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r );
4892
4893     hpkg = package_from_db( hdb );
4894     ok( hpkg, "failed to create package\n");
4895
4896     state = 0xdeadbee;
4897     action = 0xdeadbee;
4898     r = MsiGetFeatureState(hpkg, "one", &state, &action);
4899     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4900     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4901     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4902
4903     state = 0xdeadbee;
4904     action = 0xdeadbee;
4905     r = MsiGetFeatureState(hpkg, "two", &state, &action);
4906     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4907     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4908     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4909
4910     state = 0xdeadbee;
4911     action = 0xdeadbee;
4912     r = MsiGetFeatureState(hpkg, "three", &state, &action);
4913     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4914     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4915     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4916
4917     state = 0xdeadbee;
4918     action = 0xdeadbee;
4919     r = MsiGetFeatureState(hpkg, "four", &state, &action);
4920     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4921     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4922     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4923
4924     state = 0xdeadbee;
4925     action = 0xdeadbee;
4926     r = MsiGetFeatureState(hpkg, "five", &state, &action);
4927     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4928     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4929     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4930
4931     state = 0xdeadbee;
4932     action = 0xdeadbee;
4933     r = MsiGetFeatureState(hpkg, "six", &state, &action);
4934     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4935     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4936     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4937
4938     state = 0xdeadbee;
4939     action = 0xdeadbee;
4940     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
4941     ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r );
4942     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4943     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4944
4945     state = 0xdeadbee;
4946     action = 0xdeadbee;
4947     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
4948     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4949     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4950     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4951
4952     state = 0xdeadbee;
4953     action = 0xdeadbee;
4954     r = MsiGetComponentState(hpkg, "beta", &state, &action);
4955     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4956     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4957     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4958
4959     state = 0xdeadbee;
4960     action = 0xdeadbee;
4961     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
4962     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4963     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4964     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4965
4966     state = 0xdeadbee;
4967     action = 0xdeadbee;
4968     r = MsiGetComponentState(hpkg, "theta", &state, &action);
4969     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4970     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4971     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4972
4973     state = 0xdeadbee;
4974     action = 0xdeadbee;
4975     r = MsiGetComponentState(hpkg, "delta", &state, &action);
4976     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4977     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4978     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4979
4980     state = 0xdeadbee;
4981     action = 0xdeadbee;
4982     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
4983     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4984     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4985     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4986
4987     state = 0xdeadbee;
4988     action = 0xdeadbee;
4989     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
4990     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4991     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4992     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
4993
4994     state = 0xdeadbee;
4995     action = 0xdeadbee;
4996     r = MsiGetComponentState(hpkg, "iota", &state, &action);
4997     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
4998     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
4999     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5000
5001     state = 0xdeadbee;
5002     action = 0xdeadbee;
5003     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5004     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5005     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5006     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5007
5008     state = 0xdeadbee;
5009     action = 0xdeadbee;
5010     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5011     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5012     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5013     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5014
5015     state = 0xdeadbee;
5016     action = 0xdeadbee;
5017     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5018     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5019     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5020     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5021
5022     state = 0xdeadbee;
5023     action = 0xdeadbee;
5024     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5025     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5026     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5027     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5028
5029     state = 0xdeadbee;
5030     action = 0xdeadbee;
5031     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5032     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5033     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5034     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5035
5036     state = 0xdeadbee;
5037     action = 0xdeadbee;
5038     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5039     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5040     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5041     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5042
5043     state = 0xdeadbee;
5044     action = 0xdeadbee;
5045     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5046     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5047     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5048     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5049
5050     state = 0xdeadbee;
5051     action = 0xdeadbee;
5052     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5053     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5054     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5055     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5056
5057     state = 0xdeadbee;
5058     action = 0xdeadbee;
5059     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5060     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5061     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5062     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5063
5064     state = 0xdeadbee;
5065     action = 0xdeadbee;
5066     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5067     ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r );
5068     ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state);
5069     ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action);
5070
5071     r = MsiDoAction( hpkg, "CostInitialize");
5072     ok( r == ERROR_SUCCESS, "cost init failed\n");
5073
5074     state = 0xdeadbee;
5075     action = 0xdeadbee;
5076     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5077     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5078     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5079     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5080
5081     state = 0xdeadbee;
5082     action = 0xdeadbee;
5083     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5084     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5085     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5086     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5087
5088     state = 0xdeadbee;
5089     action = 0xdeadbee;
5090     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5091     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5092     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5093     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5094
5095     state = 0xdeadbee;
5096     action = 0xdeadbee;
5097     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5098     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5099     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5100     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5101
5102     state = 0xdeadbee;
5103     action = 0xdeadbee;
5104     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5105     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5106     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5107     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5108
5109     state = 0xdeadbee;
5110     action = 0xdeadbee;
5111     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5112     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5113     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5114     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5115
5116     state = 0xdeadbee;
5117     action = 0xdeadbee;
5118     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5119     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5120     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5121     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5122
5123     state = 0xdeadbee;
5124     action = 0xdeadbee;
5125     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5126     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5127     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5128     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5129
5130     state = 0xdeadbee;
5131     action = 0xdeadbee;
5132     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5133     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5134     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5135     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5136
5137     state = 0xdeadbee;
5138     action = 0xdeadbee;
5139     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5140     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5141     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5142     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5143
5144     state = 0xdeadbee;
5145     action = 0xdeadbee;
5146     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5147     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5148     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5149     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5150
5151     state = 0xdeadbee;
5152     action = 0xdeadbee;
5153     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5154     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5155     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5156     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5157
5158     state = 0xdeadbee;
5159     action = 0xdeadbee;
5160     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5161     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5162     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5163     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5164
5165     state = 0xdeadbee;
5166     action = 0xdeadbee;
5167     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5168     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5169     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5170     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5171
5172     state = 0xdeadbee;
5173     action = 0xdeadbee;
5174     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5175     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5176     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5177     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5178
5179     state = 0xdeadbee;
5180     action = 0xdeadbee;
5181     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5182     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5183     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5184     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5185
5186     state = 0xdeadbee;
5187     action = 0xdeadbee;
5188     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5189     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5190     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5191     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5192
5193     state = 0xdeadbee;
5194     action = 0xdeadbee;
5195     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5196     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5197     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5198     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5199
5200     state = 0xdeadbee;
5201     action = 0xdeadbee;
5202     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5203     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5204     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5205     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5206
5207     state = 0xdeadbee;
5208     action = 0xdeadbee;
5209     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5210     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5211     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5212     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5213
5214     state = 0xdeadbee;
5215     action = 0xdeadbee;
5216     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5217     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5218     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5219     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5220
5221     state = 0xdeadbee;
5222     action = 0xdeadbee;
5223     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5224     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5225     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5226     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5227
5228     state = 0xdeadbee;
5229     action = 0xdeadbee;
5230     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5231     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5232     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5233     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5234
5235     state = 0xdeadbee;
5236     action = 0xdeadbee;
5237     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5238     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5239     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5240     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5241
5242     state = 0xdeadbee;
5243     action = 0xdeadbee;
5244     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5245     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5246     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5247     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5248
5249     r = MsiDoAction( hpkg, "FileCost");
5250     ok( r == ERROR_SUCCESS, "file cost failed\n");
5251
5252     state = 0xdeadbee;
5253     action = 0xdeadbee;
5254     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5255     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5256     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5257     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5258
5259     state = 0xdeadbee;
5260     action = 0xdeadbee;
5261     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5262     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5263     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5264     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5265
5266     state = 0xdeadbee;
5267     action = 0xdeadbee;
5268     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5269     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5270     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5271     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5272
5273     state = 0xdeadbee;
5274     action = 0xdeadbee;
5275     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5276     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5277     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5278     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5279
5280     state = 0xdeadbee;
5281     action = 0xdeadbee;
5282     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5283     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5284     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5285     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5286
5287     state = 0xdeadbee;
5288     action = 0xdeadbee;
5289     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5290     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5291     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5292     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5293
5294     state = 0xdeadbee;
5295     action = 0xdeadbee;
5296     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5297     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5298     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5299     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5300
5301     state = 0xdeadbee;
5302     action = 0xdeadbee;
5303     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5304     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5305     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5306     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5307
5308     state = 0xdeadbee;
5309     action = 0xdeadbee;
5310     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5311     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5312     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5313     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5314
5315     state = 0xdeadbee;
5316     action = 0xdeadbee;
5317     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5318     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5319     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5320     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5321
5322     state = 0xdeadbee;
5323     action = 0xdeadbee;
5324     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5325     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5326     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5327     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5328
5329     state = 0xdeadbee;
5330     action = 0xdeadbee;
5331     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5332     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5333     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5334     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5335
5336     state = 0xdeadbee;
5337     action = 0xdeadbee;
5338     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5339     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5340     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5341     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5342
5343     state = 0xdeadbee;
5344     action = 0xdeadbee;
5345     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5346     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5347     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5348     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5349
5350     state = 0xdeadbee;
5351     action = 0xdeadbee;
5352     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5353     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5354     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5355     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5356
5357     state = 0xdeadbee;
5358     action = 0xdeadbee;
5359     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5360     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5361     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5362     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5363
5364     state = 0xdeadbee;
5365     action = 0xdeadbee;
5366     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5367     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5368     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5369     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5370
5371     state = 0xdeadbee;
5372     action = 0xdeadbee;
5373     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5374     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5375     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5376     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5377
5378     state = 0xdeadbee;
5379     action = 0xdeadbee;
5380     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5381     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5382     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5383     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5384
5385     state = 0xdeadbee;
5386     action = 0xdeadbee;
5387     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5388     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5389     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5390     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5391
5392     state = 0xdeadbee;
5393     action = 0xdeadbee;
5394     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5395     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5396     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5397     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5398
5399     state = 0xdeadbee;
5400     action = 0xdeadbee;
5401     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5402     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5403     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5404     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5405
5406     state = 0xdeadbee;
5407     action = 0xdeadbee;
5408     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5409     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5410     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5411     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5412
5413     state = 0xdeadbee;
5414     action = 0xdeadbee;
5415     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5416     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5417     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5418     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5419
5420     state = 0xdeadbee;
5421     action = 0xdeadbee;
5422     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5423     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5424     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
5425     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5426
5427     r = MsiDoAction( hpkg, "CostFinalize");
5428     ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r);
5429
5430     state = 0xdeadbee;
5431     action = 0xdeadbee;
5432     r = MsiGetFeatureState(hpkg, "one", &state, &action);
5433     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5434     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5435     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5436
5437     state = 0xdeadbee;
5438     action = 0xdeadbee;
5439     r = MsiGetFeatureState(hpkg, "two", &state, &action);
5440     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5441     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5442     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5443
5444     state = 0xdeadbee;
5445     action = 0xdeadbee;
5446     r = MsiGetFeatureState(hpkg, "three", &state, &action);
5447     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5448     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5449     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5450
5451     state = 0xdeadbee;
5452     action = 0xdeadbee;
5453     r = MsiGetFeatureState(hpkg, "four", &state, &action);
5454     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5455     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5456     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5457
5458     state = 0xdeadbee;
5459     action = 0xdeadbee;
5460     r = MsiGetFeatureState(hpkg, "five", &state, &action);
5461     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5462     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5463     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5464
5465     state = 0xdeadbee;
5466     action = 0xdeadbee;
5467     r = MsiGetFeatureState(hpkg, "six", &state, &action);
5468     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5469     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5470     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5471
5472     state = 0xdeadbee;
5473     action = 0xdeadbee;
5474     r = MsiGetFeatureState(hpkg, "seven", &state, &action);
5475     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5476     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5477     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5478
5479     state = 0xdeadbee;
5480     action = 0xdeadbee;
5481     r = MsiGetComponentState(hpkg, "alpha", &state, &action);
5482     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5483     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5484     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5485
5486     state = 0xdeadbee;
5487     action = 0xdeadbee;
5488     r = MsiGetComponentState(hpkg, "beta", &state, &action);
5489     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5490     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5491     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5492
5493     state = 0xdeadbee;
5494     action = 0xdeadbee;
5495     r = MsiGetComponentState(hpkg, "gamma", &state, &action);
5496     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5497     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5498     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5499
5500     state = 0xdeadbee;
5501     action = 0xdeadbee;
5502     r = MsiGetComponentState(hpkg, "theta", &state, &action);
5503     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5504     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5505     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5506
5507     state = 0xdeadbee;
5508     action = 0xdeadbee;
5509     r = MsiGetComponentState(hpkg, "delta", &state, &action);
5510     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5511     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5512     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5513
5514     state = 0xdeadbee;
5515     action = 0xdeadbee;
5516     r = MsiGetComponentState(hpkg, "epsilon", &state, &action);
5517     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5518     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5519     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5520
5521     state = 0xdeadbee;
5522     action = 0xdeadbee;
5523     r = MsiGetComponentState(hpkg, "zeta", &state, &action);
5524     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5525     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5526     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5527
5528     state = 0xdeadbee;
5529     action = 0xdeadbee;
5530     r = MsiGetComponentState(hpkg, "iota", &state, &action);
5531     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5532     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5533     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5534
5535     state = 0xdeadbee;
5536     action = 0xdeadbee;
5537     r = MsiGetComponentState(hpkg, "eta", &state, &action);
5538     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5539     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5540     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
5541
5542     state = 0xdeadbee;
5543     action = 0xdeadbee;
5544     r = MsiGetComponentState(hpkg, "kappa", &state, &action);
5545     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5546     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
5547     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5548
5549     state = 0xdeadbee;
5550     action = 0xdeadbee;
5551     r = MsiGetComponentState(hpkg, "lambda", &state, &action);
5552     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5553     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5554     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5555
5556     state = 0xdeadbee;
5557     action = 0xdeadbee;
5558     r = MsiGetComponentState(hpkg, "mu", &state, &action);
5559     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5560     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5561     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5562
5563     state = 0xdeadbee;
5564     action = 0xdeadbee;
5565     r = MsiGetComponentState(hpkg, "nu", &state, &action);
5566     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5567     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5568     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5569
5570     state = 0xdeadbee;
5571     action = 0xdeadbee;
5572     r = MsiGetComponentState(hpkg, "xi", &state, &action);
5573     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5574     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5575     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5576
5577     state = 0xdeadbee;
5578     action = 0xdeadbee;
5579     r = MsiGetComponentState(hpkg, "omicron", &state, &action);
5580     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5581     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5582     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5583
5584     state = 0xdeadbee;
5585     action = 0xdeadbee;
5586     r = MsiGetComponentState(hpkg, "pi", &state, &action);
5587     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5588     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5589     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5590
5591     state = 0xdeadbee;
5592     action = 0xdeadbee;
5593     r = MsiGetComponentState(hpkg, "rho", &state, &action);
5594     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5595     ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state);
5596     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
5597
5598     state = 0xdeadbee;
5599     action = 0xdeadbee;
5600     r = MsiGetComponentState(hpkg, "sigma", &state, &action);
5601     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
5602     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5603     ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
5604
5605     MsiCloseHandle(hpkg);
5606
5607     /* uninstall the product */
5608     r = MsiInstallProduct(msifile3, "REMOVE=ALL");
5609     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5610
5611     DeleteFileA(msifile);
5612     DeleteFileA(msifile2);
5613     DeleteFileA(msifile3);
5614 }
5615
5616 static void test_getproperty(void)
5617 {
5618     MSIHANDLE hPackage = 0;
5619     char prop[100];
5620     static CHAR empty[] = "";
5621     DWORD size;
5622     UINT r;
5623
5624     hPackage = package_from_db(create_package_db());
5625     ok( hPackage != 0, " Failed to create package\n");
5626
5627     /* set the property */
5628     r = MsiSetProperty(hPackage, "Name", "Value");
5629     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5630
5631     /* retrieve the size, NULL pointer */
5632     size = 0;
5633     r = MsiGetProperty(hPackage, "Name", NULL, &size);
5634     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5635     ok( size == 5, "Expected 5, got %d\n", size);
5636
5637     /* retrieve the size, empty string */
5638     size = 0;
5639     r = MsiGetProperty(hPackage, "Name", empty, &size);
5640     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
5641     ok( size == 5, "Expected 5, got %d\n", size);
5642
5643     /* don't change size */
5644     r = MsiGetProperty(hPackage, "Name", prop, &size);
5645     ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
5646     ok( size == 5, "Expected 5, got %d\n", size);
5647     ok( !lstrcmp(prop, "Valu"), "Expected Valu, got %s\n", prop);
5648
5649     /* increase the size by 1 */
5650     size++;
5651     r = MsiGetProperty(hPackage, "Name", prop, &size);
5652     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5653     ok( size == 5, "Expected 5, got %d\n", size);
5654     ok( !lstrcmp(prop, "Value"), "Expected Value, got %s\n", prop);
5655
5656     r = MsiCloseHandle( hPackage);
5657     ok( r == ERROR_SUCCESS , "Failed to close package\n" );
5658     DeleteFile(msifile);
5659 }
5660
5661 static void test_removefiles(void)
5662 {
5663     MSIHANDLE hpkg;
5664     UINT r;
5665     MSIHANDLE hdb;
5666
5667     hdb = create_package_db();
5668     ok ( hdb, "failed to create package database\n" );
5669
5670     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
5671     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
5672
5673     r = create_feature_table( hdb );
5674     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
5675
5676     r = create_component_table( hdb );
5677     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
5678
5679     r = add_feature_entry( hdb, "'one', '', '', '', 2, 1, '', 0" );
5680     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
5681
5682     r = add_component_entry( hdb, "'hydrogen', '', 'TARGETDIR', 0, '', 'hydrogen_file'" );
5683     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5684
5685     r = add_component_entry( hdb, "'helium', '', 'TARGETDIR', 0, '', 'helium_file'" );
5686     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5687
5688     r = add_component_entry( hdb, "'lithium', '', 'TARGETDIR', 0, '', 'lithium_file'" );
5689     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5690
5691     r = add_component_entry( hdb, "'beryllium', '', 'TARGETDIR', 0, '', 'beryllium_file'" );
5692     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5693
5694     r = add_component_entry( hdb, "'boron', '', 'TARGETDIR', 0, '', 'boron_file'" );
5695     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5696
5697     r = add_component_entry( hdb, "'carbon', '', 'TARGETDIR', 0, '', 'carbon_file'" );
5698     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
5699
5700     r = create_feature_components_table( hdb );
5701     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
5702
5703     r = add_feature_components_entry( hdb, "'one', 'hydrogen'" );
5704     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5705
5706     r = add_feature_components_entry( hdb, "'one', 'helium'" );
5707     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5708
5709     r = add_feature_components_entry( hdb, "'one', 'lithium'" );
5710     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5711
5712     r = add_feature_components_entry( hdb, "'one', 'beryllium'" );
5713     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5714
5715     r = add_feature_components_entry( hdb, "'one', 'boron'" );
5716     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5717
5718     r = add_feature_components_entry( hdb, "'one', 'carbon'" );
5719     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
5720
5721     r = create_file_table( hdb );
5722     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
5723
5724     r = add_file_entry( hdb, "'hydrogen_file', 'hydrogen', 'hydrogen.txt', 0, '', '1033', 8192, 1" );
5725     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5726
5727     r = add_file_entry( hdb, "'helium_file', 'helium', 'helium.txt', 0, '', '1033', 8192, 1" );
5728     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5729
5730     r = add_file_entry( hdb, "'lithium_file', 'lithium', 'lithium.txt', 0, '', '1033', 8192, 1" );
5731     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5732
5733     r = add_file_entry( hdb, "'beryllium_file', 'beryllium', 'beryllium.txt', 0, '', '1033', 16384, 1" );
5734     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5735
5736     r = add_file_entry( hdb, "'boron_file', 'boron', 'boron.txt', 0, '', '1033', 16384, 1" );
5737     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5738
5739     r = add_file_entry( hdb, "'carbon_file', 'carbon', 'carbon.txt', 0, '', '1033', 16384, 1" );
5740     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
5741
5742     r = create_remove_file_table( hdb );
5743     ok( r == ERROR_SUCCESS, "cannot create Remove File table: %d\n", r);
5744
5745     hpkg = package_from_db( hdb );
5746     ok( hpkg, "failed to create package\n");
5747
5748     MsiCloseHandle( hdb );
5749
5750     create_test_file( "hydrogen.txt" );
5751     create_test_file( "helium.txt" );
5752     create_test_file( "lithium.txt" );
5753     create_test_file( "beryllium.txt" );
5754     create_test_file( "boron.txt" );
5755     create_test_file( "carbon.txt" );
5756
5757     r = MsiSetProperty( hpkg, "TARGETDIR", CURR_DIR );
5758     ok( r == ERROR_SUCCESS, "set property failed\n");
5759
5760     r = MsiDoAction( hpkg, "CostInitialize");
5761     ok( r == ERROR_SUCCESS, "cost init failed\n");
5762
5763     r = MsiDoAction( hpkg, "FileCost");
5764     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
5765
5766     r = MsiDoAction( hpkg, "CostFinalize");
5767     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
5768
5769     r = MsiDoAction( hpkg, "InstallValidate");
5770     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
5771
5772     r = MsiSetComponentState( hpkg, "hydrogen", INSTALLSTATE_ABSENT );
5773     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5774
5775     r = MsiSetComponentState( hpkg, "helium", INSTALLSTATE_LOCAL );
5776     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5777
5778     r = MsiSetComponentState( hpkg, "lithium", INSTALLSTATE_SOURCE );
5779     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5780
5781     r = MsiSetComponentState( hpkg, "beryllium", INSTALLSTATE_ABSENT );
5782     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5783
5784     r = MsiSetComponentState( hpkg, "boron", INSTALLSTATE_LOCAL );
5785     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5786
5787     r = MsiSetComponentState( hpkg, "carbon", INSTALLSTATE_SOURCE );
5788     ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r);
5789
5790     r = MsiDoAction( hpkg, "RemoveFiles");
5791     ok( r == ERROR_SUCCESS, "remove files failed\n");
5792
5793     ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
5794     ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");    
5795     ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
5796     ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
5797     ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n");
5798     ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n");
5799
5800     MsiCloseHandle( hpkg );
5801     DeleteFileA(msifile);
5802 }
5803
5804 static void test_appsearch(void)
5805 {
5806     MSIHANDLE hpkg;
5807     UINT r;
5808     MSIHANDLE hdb;
5809     CHAR prop[MAX_PATH];
5810     DWORD size = MAX_PATH;
5811
5812     hdb = create_package_db();
5813     ok ( hdb, "failed to create package database\n" );
5814
5815     r = create_appsearch_table( hdb );
5816     ok( r == ERROR_SUCCESS, "cannot create AppSearch table: %d\n", r );
5817
5818     r = add_appsearch_entry( hdb, "'WEBBROWSERPROG', 'NewSignature1'" );
5819     ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r );
5820
5821     r = create_reglocator_table( hdb );
5822     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
5823
5824     r = add_reglocator_entry( hdb, "'NewSignature1', 0, 'htmlfile\\shell\\open\\command', '', 1" );
5825     ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r );
5826
5827     r = create_signature_table( hdb );
5828     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
5829
5830     r = add_signature_entry( hdb, "'NewSignature1', 'FileName', '', '', '', '', '', '', ''" );
5831     ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r );
5832
5833     hpkg = package_from_db( hdb );
5834     ok( hpkg, "failed to create package\n");
5835
5836     MsiCloseHandle( hdb );
5837
5838     r = MsiDoAction( hpkg, "AppSearch" );
5839     ok( r == ERROR_SUCCESS, "AppSearch failed: %d\n", r);
5840
5841     r = MsiGetPropertyA( hpkg, "WEBBROWSERPROG", prop, &size );
5842     ok( r == ERROR_SUCCESS, "get property failed: %d\n", r);
5843     todo_wine
5844     {
5845         ok( lstrlenA(prop) != 0, "Expected non-zero length\n");
5846     }
5847
5848     MsiCloseHandle( hpkg );
5849     DeleteFileA(msifile);
5850 }
5851
5852 static void test_appsearch_complocator(void)
5853 {
5854     MSIHANDLE hpkg, hdb;
5855     CHAR path[MAX_PATH];
5856     CHAR prop[MAX_PATH];
5857     LPSTR usersid;
5858     DWORD size;
5859     UINT r;
5860
5861     get_user_sid(&usersid);
5862     if (!usersid)
5863     {
5864         skip("ConvertSidToStringSidA is not available\n");
5865         return;
5866     }
5867
5868     create_test_file("FileName1");
5869     create_test_file("FileName4");
5870     set_component_path("FileName1", MSIINSTALLCONTEXT_MACHINE,
5871                        "{A8AE6692-96BA-4198-8399-145D7D1D0D0E}", NULL, FALSE);
5872
5873     create_test_file("FileName2");
5874     set_component_path("FileName2", MSIINSTALLCONTEXT_USERUNMANAGED,
5875                        "{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}", usersid, FALSE);
5876
5877     create_test_file("FileName3");
5878     set_component_path("FileName3", MSIINSTALLCONTEXT_USERMANAGED,
5879                        "{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}", usersid, FALSE);
5880
5881     create_test_file("FileName5");
5882     set_component_path("FileName5", MSIINSTALLCONTEXT_MACHINE,
5883                        "{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}", NULL, TRUE);
5884
5885     create_test_file("FileName6");
5886     set_component_path("FileName6", MSIINSTALLCONTEXT_MACHINE,
5887                        "{C0ECD96F-7898-4410-9667-194BD8C1B648}", NULL, TRUE);
5888
5889     create_test_file("FileName7");
5890     set_component_path("FileName7", MSIINSTALLCONTEXT_MACHINE,
5891                        "{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}", NULL, FALSE);
5892
5893     /* dir is FALSE, but we're pretending it's a directory */
5894     set_component_path("IDontExist\\", MSIINSTALLCONTEXT_MACHINE,
5895                        "{91B7359B-07F2-4221-AA8D-DE102BB87A5F}", NULL, FALSE);
5896
5897     create_file_with_version("FileName8.dll", MAKELONG(2, 1), MAKELONG(4, 3));
5898     set_component_path("FileName8.dll", MSIINSTALLCONTEXT_MACHINE,
5899                        "{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}", NULL, FALSE);
5900
5901     create_file_with_version("FileName9.dll", MAKELONG(1, 2), MAKELONG(3, 4));
5902     set_component_path("FileName9.dll", MSIINSTALLCONTEXT_MACHINE,
5903                        "{A204DF48-7346-4635-BA2E-66247DBAC9DF}", NULL, FALSE);
5904
5905     create_file_with_version("FileName10.dll", MAKELONG(2, 1), MAKELONG(4, 3));
5906     set_component_path("FileName10.dll", MSIINSTALLCONTEXT_MACHINE,
5907                        "{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}", NULL, FALSE);
5908
5909     hdb = create_package_db();
5910     ok(hdb, "Expected a valid database handle\n");
5911
5912     r = create_appsearch_table(hdb);
5913     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5914
5915     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
5916     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5917
5918     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
5919     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5920
5921     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
5922     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5923
5924     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
5925     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5926
5927     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
5928     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5929
5930     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
5931     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5932
5933     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
5934     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5935
5936     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
5937     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5938
5939     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
5940     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5941
5942     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
5943     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5944
5945     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
5946     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5947
5948     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
5949     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5950
5951     r = create_complocator_table(hdb);
5952     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5953
5954     /* published component, machine, file, signature, misdbLocatorTypeFile */
5955     r = add_complocator_entry(hdb, "'NewSignature1', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 1");
5956     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5957
5958     /* published component, user-unmanaged, file, signature, misdbLocatorTypeFile */
5959     r = add_complocator_entry(hdb, "'NewSignature2', '{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}', 1");
5960     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5961
5962     /* published component, user-managed, file, signature, misdbLocatorTypeFile */
5963     r = add_complocator_entry(hdb, "'NewSignature3', '{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}', 1");
5964     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5965
5966     /* published component, machine, file, signature, misdbLocatorTypeDirectory */
5967     r = add_complocator_entry(hdb, "'NewSignature4', '{A8AE6692-96BA-4198-8399-145D7D1D0D0E}', 0");
5968     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5969
5970     /* published component, machine, dir, signature, misdbLocatorTypeDirectory */
5971     r = add_complocator_entry(hdb, "'NewSignature5', '{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}', 0");
5972     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5973
5974     /* published component, machine, dir, no signature, misdbLocatorTypeDirectory */
5975     r = add_complocator_entry(hdb, "'NewSignature6', '{C0ECD96F-7898-4410-9667-194BD8C1B648}', 0");
5976     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5977
5978     /* published component, machine, file, no signature, misdbLocatorTypeFile */
5979     r = add_complocator_entry(hdb, "'NewSignature7', '{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}', 1");
5980     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5981
5982     /* unpublished component, no signature, misdbLocatorTypeDir */
5983     r = add_complocator_entry(hdb, "'NewSignature8', '{FB671D5B-5083-4048-90E0-481C48D8F3A5}', 0");
5984     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5985
5986     /* published component, no signature, dir does not exist misdbLocatorTypeDir */
5987     r = add_complocator_entry(hdb, "'NewSignature9', '{91B7359B-07F2-4221-AA8D-DE102BB87A5F}', 0");
5988     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5989
5990     /* published component, signature w/ ver, misdbLocatorTypeFile */
5991     r = add_complocator_entry(hdb, "'NewSignature10', '{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}', 1");
5992     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5993
5994     /* published component, signature w/ ver, ver > max, misdbLocatorTypeFile */
5995     r = add_complocator_entry(hdb, "'NewSignature11', '{A204DF48-7346-4635-BA2E-66247DBAC9DF}', 1");
5996     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
5997
5998     /* published component, signature w/ ver, sig->name ignored, misdbLocatorTypeFile */
5999     r = add_complocator_entry(hdb, "'NewSignature12', '{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}', 1");
6000     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6001
6002     r = create_signature_table(hdb);
6003     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6004
6005     r = add_signature_entry(hdb, "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''");
6006     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6007
6008     r = add_signature_entry(hdb, "'NewSignature2', 'FileName2', '', '', '', '', '', '', ''");
6009     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6010
6011     r = add_signature_entry(hdb, "'NewSignature3', 'FileName3', '', '', '', '', '', '', ''");
6012     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6013
6014     r = add_signature_entry(hdb, "'NewSignature4', 'FileName4', '', '', '', '', '', '', ''");
6015     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6016
6017     r = add_signature_entry(hdb, "'NewSignature5', 'FileName5', '', '', '', '', '', '', ''");
6018     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6019
6020     r = add_signature_entry(hdb, "'NewSignature10', 'FileName8.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6021     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6022
6023     r = add_signature_entry(hdb, "'NewSignature11', 'FileName9.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6024     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6025
6026     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6027     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6028
6029     hpkg = package_from_db(hdb);
6030     ok(hpkg, "Expected a valid package handle\n");
6031
6032     r = MsiSetPropertyA(hpkg, "SIGPROP8", "october");
6033     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6034
6035     r = MsiDoAction(hpkg, "AppSearch");
6036     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6037
6038     size = MAX_PATH;
6039     sprintf(path, "%s\\FileName1", CURR_DIR);
6040     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
6041     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6042     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6043
6044     size = MAX_PATH;
6045     sprintf(path, "%s\\FileName2", CURR_DIR);
6046     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
6047     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6048     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6049
6050     size = MAX_PATH;
6051     sprintf(path, "%s\\FileName3", CURR_DIR);
6052     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
6053     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6054     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6055
6056     size = MAX_PATH;
6057     sprintf(path, "%s\\FileName4", CURR_DIR);
6058     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
6059     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6060     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6061
6062     size = MAX_PATH;
6063     sprintf(path, "%s\\FileName5", CURR_DIR);
6064     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
6065     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6066     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6067
6068     size = MAX_PATH;
6069     sprintf(path, "%s\\", CURR_DIR);
6070     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
6071     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6072     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6073
6074     size = MAX_PATH;
6075     sprintf(path, "%s\\", CURR_DIR);
6076     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
6077     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6078     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6079
6080     size = MAX_PATH;
6081     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
6082     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6083     ok(!lstrcmpA(prop, "october"), "Expected \"october\", got \"%s\"\n", prop);
6084
6085     size = MAX_PATH;
6086     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
6087     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6088     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6089
6090     size = MAX_PATH;
6091     sprintf(path, "%s\\FileName8.dll", CURR_DIR);
6092     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
6093     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6094     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6095
6096     size = MAX_PATH;
6097     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
6098     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6099     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6100
6101     size = MAX_PATH;
6102     sprintf(path, "%s\\FileName10.dll", CURR_DIR);
6103     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
6104     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6105     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6106
6107     delete_component_path("{A8AE6692-96BA-4198-8399-145D7D1D0D0E}",
6108                           MSIINSTALLCONTEXT_MACHINE, NULL);
6109     delete_component_path("{1D2CE6F3-E81C-4949-AB81-78D7DAD2AF2E}",
6110                           MSIINSTALLCONTEXT_USERUNMANAGED, usersid);
6111     delete_component_path("{19E0B999-85F5-4973-A61B-DBE4D66ECB1D}",
6112                           MSIINSTALLCONTEXT_USERMANAGED, usersid);
6113     delete_component_path("{F0CCA976-27A3-4808-9DDD-1A6FD50A0D5A}",
6114                           MSIINSTALLCONTEXT_MACHINE, NULL);
6115     delete_component_path("{C0ECD96F-7898-4410-9667-194BD8C1B648}",
6116                           MSIINSTALLCONTEXT_MACHINE, NULL);
6117     delete_component_path("{DB20F535-9C26-4127-9C2B-CC45A8B51DA1}",
6118                           MSIINSTALLCONTEXT_MACHINE, NULL);
6119     delete_component_path("{91B7359B-07F2-4221-AA8D-DE102BB87A5F}",
6120                           MSIINSTALLCONTEXT_MACHINE, NULL);
6121     delete_component_path("{4A2E1B5B-4034-4177-833B-8CC35F1B3EF1}",
6122                           MSIINSTALLCONTEXT_MACHINE, NULL);
6123     delete_component_path("{A204DF48-7346-4635-BA2E-66247DBAC9DF}",
6124                           MSIINSTALLCONTEXT_MACHINE, NULL);
6125     delete_component_path("{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}",
6126                           MSIINSTALLCONTEXT_MACHINE, NULL);
6127
6128     DeleteFileA("FileName1");
6129     DeleteFileA("FileName2");
6130     DeleteFileA("FileName3");
6131     DeleteFileA("FileName4");
6132     DeleteFileA("FileName5");
6133     DeleteFileA("FileName6");
6134     DeleteFileA("FileName7");
6135     DeleteFileA("FileName8.dll");
6136     DeleteFileA("FileName9.dll");
6137     DeleteFileA("FileName10.dll");
6138     MsiCloseHandle(hpkg);
6139     DeleteFileA(msifile);
6140 }
6141
6142 static void test_appsearch_reglocator(void)
6143 {
6144     MSIHANDLE hpkg, hdb;
6145     CHAR path[MAX_PATH];
6146     CHAR prop[MAX_PATH];
6147     DWORD binary[2];
6148     DWORD size, val;
6149     HKEY hklm, classes;
6150     HKEY hkcu, users;
6151     LPCSTR str;
6152     LPSTR ptr;
6153     LONG res;
6154     UINT r;
6155
6156     res = RegCreateKeyA(HKEY_CLASSES_ROOT, "Software\\Wine", &classes);
6157     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6158
6159     res = RegSetValueExA(classes, "Value1", 0, REG_SZ,
6160                          (const BYTE *)"regszdata", 10);
6161     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6162
6163     res = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine", &hkcu);
6164     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6165
6166     res = RegSetValueExA(hkcu, "Value1", 0, REG_SZ,
6167                          (const BYTE *)"regszdata", 10);
6168     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6169
6170     res = RegCreateKeyA(HKEY_USERS, "S-1-5-18\\Software\\Wine", &users);
6171     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6172
6173     res = RegSetValueExA(users, "Value1", 0, REG_SZ,
6174                          (const BYTE *)"regszdata", 10);
6175     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6176
6177     res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine", &hklm);
6178     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6179
6180     res = RegSetValueA(hklm, NULL, REG_SZ, "defvalue", 8);
6181     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6182
6183     res = RegSetValueExA(hklm, "Value1", 0, REG_SZ,
6184                          (const BYTE *)"regszdata", 10);
6185     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6186
6187     val = 42;
6188     res = RegSetValueExA(hklm, "Value2", 0, REG_DWORD,
6189                          (const BYTE *)&val, sizeof(DWORD));
6190     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6191
6192     val = -42;
6193     res = RegSetValueExA(hklm, "Value3", 0, REG_DWORD,
6194                          (const BYTE *)&val, sizeof(DWORD));
6195     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6196
6197     res = RegSetValueExA(hklm, "Value4", 0, REG_EXPAND_SZ,
6198                          (const BYTE *)"%PATH%", 7);
6199     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6200
6201     res = RegSetValueExA(hklm, "Value5", 0, REG_EXPAND_SZ,
6202                          (const BYTE *)"my%NOVAR%", 10);
6203     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6204
6205     res = RegSetValueExA(hklm, "Value6", 0, REG_MULTI_SZ,
6206                          (const BYTE *)"one\0two\0", 9);
6207     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6208
6209     binary[0] = 0x1234abcd;
6210     binary[1] = 0x567890ef;
6211     res = RegSetValueExA(hklm, "Value7", 0, REG_BINARY,
6212                          (const BYTE *)binary, sizeof(binary));
6213     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6214
6215     res = RegSetValueExA(hklm, "Value8", 0, REG_SZ,
6216                          (const BYTE *)"#regszdata", 11);
6217     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6218
6219     create_test_file("FileName1");
6220     sprintf(path, "%s\\FileName1", CURR_DIR);
6221     res = RegSetValueExA(hklm, "Value9", 0, REG_SZ,
6222                          (const BYTE *)path, lstrlenA(path) + 1);
6223     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6224
6225     sprintf(path, "%s\\FileName2", CURR_DIR);
6226     res = RegSetValueExA(hklm, "Value10", 0, REG_SZ,
6227                          (const BYTE *)path, lstrlenA(path) + 1);
6228     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6229
6230     lstrcpyA(path, CURR_DIR);
6231     res = RegSetValueExA(hklm, "Value11", 0, REG_SZ,
6232                          (const BYTE *)path, lstrlenA(path) + 1);
6233     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6234
6235     res = RegSetValueExA(hklm, "Value12", 0, REG_SZ,
6236                          (const BYTE *)"", 1);
6237     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6238
6239     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
6240     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
6241     res = RegSetValueExA(hklm, "Value13", 0, REG_SZ,
6242                          (const BYTE *)path, lstrlenA(path) + 1);
6243     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6244
6245     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
6246     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
6247     res = RegSetValueExA(hklm, "Value14", 0, REG_SZ,
6248                          (const BYTE *)path, lstrlenA(path) + 1);
6249     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6250
6251     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
6252     sprintf(path, "%s\\FileName5.dll", CURR_DIR);
6253     res = RegSetValueExA(hklm, "Value15", 0, REG_SZ,
6254                          (const BYTE *)path, lstrlenA(path) + 1);
6255     ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
6256
6257     hdb = create_package_db();
6258     ok(hdb, "Expected a valid database handle\n");
6259
6260     r = create_appsearch_table(hdb);
6261     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6262
6263     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
6264     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6265
6266     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
6267     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6268
6269     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
6270     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6271
6272     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
6273     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6274
6275     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
6276     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6277
6278     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
6279     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6280
6281     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
6282     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6283
6284     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
6285     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6286
6287     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
6288     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6289
6290     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
6291     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6292
6293     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
6294     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6295
6296     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
6297     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6298
6299     r = add_appsearch_entry(hdb, "'SIGPROP13', 'NewSignature13'");
6300     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6301
6302     r = add_appsearch_entry(hdb, "'SIGPROP14', 'NewSignature14'");
6303     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6304
6305     r = add_appsearch_entry(hdb, "'SIGPROP15', 'NewSignature15'");
6306     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6307
6308     r = add_appsearch_entry(hdb, "'SIGPROP16', 'NewSignature16'");
6309     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6310
6311     r = add_appsearch_entry(hdb, "'SIGPROP17', 'NewSignature17'");
6312     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6313
6314     r = add_appsearch_entry(hdb, "'SIGPROP18', 'NewSignature18'");
6315     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6316
6317     r = add_appsearch_entry(hdb, "'SIGPROP19', 'NewSignature19'");
6318     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6319
6320     r = add_appsearch_entry(hdb, "'SIGPROP20', 'NewSignature20'");
6321     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6322
6323     r = add_appsearch_entry(hdb, "'SIGPROP21', 'NewSignature21'");
6324     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6325
6326     r = add_appsearch_entry(hdb, "'SIGPROP22', 'NewSignature22'");
6327     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6328
6329     r = add_appsearch_entry(hdb, "'SIGPROP23', 'NewSignature23'");
6330     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6331
6332     r = add_appsearch_entry(hdb, "'SIGPROP24', 'NewSignature24'");
6333     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6334
6335     r = add_appsearch_entry(hdb, "'SIGPROP25', 'NewSignature25'");
6336     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6337
6338     r = add_appsearch_entry(hdb, "'SIGPROP26', 'NewSignature26'");
6339     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6340
6341     r = add_appsearch_entry(hdb, "'SIGPROP27', 'NewSignature27'");
6342     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6343
6344     r = add_appsearch_entry(hdb, "'SIGPROP28', 'NewSignature28'");
6345     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6346
6347     r = create_reglocator_table(hdb);
6348     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6349
6350     /* HKLM, msidbLocatorTypeRawValue, REG_SZ */
6351     str = "'NewSignature1', 2, 'Software\\Wine', 'Value1', 2";
6352     r = add_reglocator_entry(hdb, str);
6353     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6354
6355     /* HKLM, msidbLocatorTypeRawValue, positive DWORD */
6356     str = "'NewSignature2', 2, 'Software\\Wine', 'Value2', 2";
6357     r = add_reglocator_entry(hdb, str);
6358     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6359
6360     /* HKLM, msidbLocatorTypeRawValue, negative DWORD */
6361     str = "'NewSignature3', 2, 'Software\\Wine', 'Value3', 2";
6362     r = add_reglocator_entry(hdb, str);
6363     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6364
6365     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
6366     str = "'NewSignature4', 2, 'Software\\Wine', 'Value4', 2";
6367     r = add_reglocator_entry(hdb, str);
6368     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6369
6370     /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */
6371     str = "'NewSignature5', 2, 'Software\\Wine', 'Value5', 2";
6372     r = add_reglocator_entry(hdb, str);
6373     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6374
6375     /* HKLM, msidbLocatorTypeRawValue, REG_MULTI_SZ */
6376     str = "'NewSignature6', 2, 'Software\\Wine', 'Value6', 2";
6377     r = add_reglocator_entry(hdb, str);
6378     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6379
6380     /* HKLM, msidbLocatorTypeRawValue, REG_BINARY */
6381     str = "'NewSignature7', 2, 'Software\\Wine', 'Value7', 2";
6382     r = add_reglocator_entry(hdb, str);
6383     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6384
6385     /* HKLM, msidbLocatorTypeRawValue, REG_SZ first char is # */
6386     str = "'NewSignature8', 2, 'Software\\Wine', 'Value8', 2";
6387     r = add_reglocator_entry(hdb, str);
6388     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6389
6390     /* HKLM, msidbLocatorTypeFileName, signature, file exists */
6391     str = "'NewSignature9', 2, 'Software\\Wine', 'Value9', 1";
6392     r = add_reglocator_entry(hdb, str);
6393     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6394
6395     /* HKLM, msidbLocatorTypeFileName, signature, file does not exist */
6396     str = "'NewSignature10', 2, 'Software\\Wine', 'Value10', 1";
6397     r = add_reglocator_entry(hdb, str);
6398     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6399
6400     /* HKLM, msidbLocatorTypeFileName, no signature */
6401     str = "'NewSignature11', 2, 'Software\\Wine', 'Value9', 1";
6402     r = add_reglocator_entry(hdb, str);
6403     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6404
6405     /* HKLM, msidbLocatorTypeDirectory, no signature, file exists */
6406     str = "'NewSignature12', 2, 'Software\\Wine', 'Value9', 0";
6407     r = add_reglocator_entry(hdb, str);
6408     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6409
6410     /* HKLM, msidbLocatorTypeDirectory, no signature, directory exists */
6411     str = "'NewSignature13', 2, 'Software\\Wine', 'Value11', 0";
6412     r = add_reglocator_entry(hdb, str);
6413     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6414
6415     /* HKLM, msidbLocatorTypeDirectory, signature, file exists */
6416     str = "'NewSignature14', 2, 'Software\\Wine', 'Value9', 0";
6417     r = add_reglocator_entry(hdb, str);
6418     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6419
6420     /* HKCR, msidbLocatorTypeRawValue, REG_SZ */
6421     str = "'NewSignature15', 0, 'Software\\Wine', 'Value1', 2";
6422     r = add_reglocator_entry(hdb, str);
6423     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6424
6425     /* HKCU, msidbLocatorTypeRawValue, REG_SZ */
6426     str = "'NewSignature16', 1, 'Software\\Wine', 'Value1', 2";
6427     r = add_reglocator_entry(hdb, str);
6428     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6429
6430     /* HKU, msidbLocatorTypeRawValue, REG_SZ */
6431     str = "'NewSignature17', 3, 'S-1-5-18\\Software\\Wine', 'Value1', 2";
6432     r = add_reglocator_entry(hdb, str);
6433     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6434
6435     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, NULL Name */
6436     str = "'NewSignature18', 2, 'Software\\Wine', '', 2";
6437     r = add_reglocator_entry(hdb, str);
6438     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6439
6440     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, key does not exist */
6441     str = "'NewSignature19', 2, 'Software\\IDontExist', '', 2";
6442     r = add_reglocator_entry(hdb, str);
6443     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6444
6445     /* HKLM, msidbLocatorTypeRawValue, REG_SZ, value is empty */
6446     str = "'NewSignature20', 2, 'Software\\Wine', 'Value12', 2";
6447     r = add_reglocator_entry(hdb, str);
6448     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6449
6450     /* HKLM, msidbLocatorTypeFileName, signature, file exists w/ version */
6451     str = "'NewSignature21', 2, 'Software\\Wine', 'Value13', 1";
6452     r = add_reglocator_entry(hdb, str);
6453     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6454
6455     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, version > max */
6456     str = "'NewSignature22', 2, 'Software\\Wine', 'Value14', 1";
6457     r = add_reglocator_entry(hdb, str);
6458     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6459
6460     /* HKLM, msidbLocatorTypeFileName, file exists w/ version, sig->name ignored */
6461     str = "'NewSignature23', 2, 'Software\\Wine', 'Value15', 1";
6462     r = add_reglocator_entry(hdb, str);
6463     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6464
6465     /* HKLM, msidbLocatorTypeFileName, no signature, directory exists */
6466     str = "'NewSignature24', 2, 'Software\\Wine', 'Value11', 1";
6467     r = add_reglocator_entry(hdb, str);
6468     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6469
6470     /* HKLM, msidbLocatorTypeFileName, no signature, file does not exist */
6471     str = "'NewSignature25', 2, 'Software\\Wine', 'Value10', 1";
6472     r = add_reglocator_entry(hdb, str);
6473     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6474
6475     /* HKLM, msidbLocatorTypeDirectory, signature, directory exists */
6476     str = "'NewSignature26', 2, 'Software\\Wine', 'Value11', 0";
6477     r = add_reglocator_entry(hdb, str);
6478     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6479
6480     /* HKLM, msidbLocatorTypeDirectory, signature, file does not exist */
6481     str = "'NewSignature27', 2, 'Software\\Wine', 'Value10', 0";
6482     r = add_reglocator_entry(hdb, str);
6483     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6484
6485     /* HKLM, msidbLocatorTypeDirectory, no signature, file does not exist */
6486     str = "'NewSignature28', 2, 'Software\\Wine', 'Value10', 0";
6487     r = add_reglocator_entry(hdb, str);
6488     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6489
6490     r = create_signature_table(hdb);
6491     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6492
6493     str = "'NewSignature9', 'FileName1', '', '', '', '', '', '', ''";
6494     r = add_signature_entry(hdb, str);
6495     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6496
6497     str = "'NewSignature10', 'FileName2', '', '', '', '', '', '', ''";
6498     r = add_signature_entry(hdb, str);
6499     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6500
6501     str = "'NewSignature14', 'FileName1', '', '', '', '', '', '', ''";
6502     r = add_signature_entry(hdb, str);
6503     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6504
6505     str = "'NewSignature21', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
6506     r = add_signature_entry(hdb, str);
6507     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6508
6509     str = "'NewSignature22', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
6510     r = add_signature_entry(hdb, str);
6511     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6512
6513     str = "'NewSignature23', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
6514     r = add_signature_entry(hdb, str);
6515     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6516
6517     ptr = strrchr(CURR_DIR, '\\') + 1;
6518     sprintf(path, "'NewSignature26', '%s', '', '', '', '', '', '', ''", ptr);
6519     r = add_signature_entry(hdb, path);
6520     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6521
6522     str = "'NewSignature27', 'FileName2', '', '', '', '', '', '', ''";
6523     r = add_signature_entry(hdb, str);
6524     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6525
6526     hpkg = package_from_db(hdb);
6527     ok(hpkg, "Expected a valid package handle\n");
6528
6529     r = MsiDoAction(hpkg, "AppSearch");
6530     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6531
6532     size = MAX_PATH;
6533     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
6534     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6535     ok(!lstrcmpA(prop, "regszdata"),
6536        "Expected \"regszdata\", got \"%s\"\n", prop);
6537
6538     size = MAX_PATH;
6539     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
6540     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6541     ok(!lstrcmpA(prop, "#42"), "Expected \"#42\", got \"%s\"\n", prop);
6542
6543     size = MAX_PATH;
6544     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
6545     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6546     ok(!lstrcmpA(prop, "#-42"), "Expected \"#-42\", got \"%s\"\n", prop);
6547
6548     ExpandEnvironmentStringsA("%PATH%", path, MAX_PATH);
6549
6550     size = MAX_PATH;
6551     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
6552     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6553     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6554
6555     size = MAX_PATH;
6556     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
6557     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6558     ok(!lstrcmpA(prop,
6559        "my%NOVAR%"), "Expected \"my%%NOVAR%%\", got \"%s\"\n", prop);
6560
6561     size = MAX_PATH;
6562     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
6563     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6564     todo_wine
6565     {
6566         ok(!memcmp(prop, "\0one\0two\0\0", 10),
6567            "Expected \"\\0one\\0two\\0\\0\"\n");
6568     }
6569
6570     size = MAX_PATH;
6571     lstrcpyA(path, "#xCDAB3412EF907856");
6572     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
6573     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6574     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6575
6576     size = MAX_PATH;
6577     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
6578     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6579     ok(!lstrcmpA(prop, "##regszdata"),
6580        "Expected \"##regszdata\", got \"%s\"\n", prop);
6581
6582     size = MAX_PATH;
6583     sprintf(path, "%s\\FileName1", CURR_DIR);
6584     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
6585     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6586     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6587
6588     size = MAX_PATH;
6589     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
6590     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6591     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6592
6593     size = MAX_PATH;
6594     sprintf(path, "%s\\", CURR_DIR);
6595     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
6596     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6597     todo_wine
6598     {
6599         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6600     }
6601
6602     size = MAX_PATH;
6603     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
6604     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6605     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6606
6607     size = MAX_PATH;
6608     sprintf(path, "%s\\", CURR_DIR);
6609     r = MsiGetPropertyA(hpkg, "SIGPROP13", prop, &size);
6610     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6611     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6612
6613     size = MAX_PATH;
6614     r = MsiGetPropertyA(hpkg, "SIGPROP14", prop, &size);
6615     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6616     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6617
6618     size = MAX_PATH;
6619     r = MsiGetPropertyA(hpkg, "SIGPROP15", prop, &size);
6620     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6621     ok(!lstrcmpA(prop, "regszdata"),
6622        "Expected \"regszdata\", got \"%s\"\n", prop);
6623
6624     size = MAX_PATH;
6625     r = MsiGetPropertyA(hpkg, "SIGPROP16", prop, &size);
6626     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6627     ok(!lstrcmpA(prop, "regszdata"),
6628        "Expected \"regszdata\", got \"%s\"\n", prop);
6629
6630     size = MAX_PATH;
6631     r = MsiGetPropertyA(hpkg, "SIGPROP17", prop, &size);
6632     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6633     ok(!lstrcmpA(prop, "regszdata"),
6634        "Expected \"regszdata\", got \"%s\"\n", prop);
6635
6636     size = MAX_PATH;
6637     r = MsiGetPropertyA(hpkg, "SIGPROP18", prop, &size);
6638     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6639     ok(!lstrcmpA(prop, "defvalue"),
6640        "Expected \"defvalue\", got \"%s\"\n", prop);
6641
6642     size = MAX_PATH;
6643     r = MsiGetPropertyA(hpkg, "SIGPROP19", prop, &size);
6644     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6645     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6646
6647     size = MAX_PATH;
6648     r = MsiGetPropertyA(hpkg, "SIGPROP20", prop, &size);
6649     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6650     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6651
6652     size = MAX_PATH;
6653     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
6654     r = MsiGetPropertyA(hpkg, "SIGPROP21", prop, &size);
6655     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6656     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6657
6658     size = MAX_PATH;
6659     r = MsiGetPropertyA(hpkg, "SIGPROP22", prop, &size);
6660     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6661     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6662
6663     size = MAX_PATH;
6664     sprintf(path, "%s\\FileName5.dll", CURR_DIR);
6665     r = MsiGetPropertyA(hpkg, "SIGPROP23", prop, &size);
6666     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6667     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6668
6669     size = MAX_PATH;
6670     lstrcpyA(path, CURR_DIR);
6671     ptr = strrchr(path, '\\') + 1;
6672     *ptr = '\0';
6673     r = MsiGetPropertyA(hpkg, "SIGPROP24", prop, &size);
6674     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6675     todo_wine
6676     {
6677         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6678     }
6679
6680     size = MAX_PATH;
6681     sprintf(path, "%s\\", CURR_DIR);
6682     r = MsiGetPropertyA(hpkg, "SIGPROP25", prop, &size);
6683     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6684     todo_wine
6685     {
6686         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6687     }
6688
6689     size = MAX_PATH;
6690     r = MsiGetPropertyA(hpkg, "SIGPROP26", prop, &size);
6691     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6692     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6693
6694     size = MAX_PATH;
6695     r = MsiGetPropertyA(hpkg, "SIGPROP27", prop, &size);
6696     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6697     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6698
6699     size = MAX_PATH;
6700     r = MsiGetPropertyA(hpkg, "SIGPROP28", prop, &size);
6701     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6702     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6703
6704     RegSetValueA(hklm, NULL, REG_SZ, "", 0);
6705     RegDeleteValueA(hklm, "Value1");
6706     RegDeleteValueA(hklm, "Value2");
6707     RegDeleteValueA(hklm, "Value3");
6708     RegDeleteValueA(hklm, "Value4");
6709     RegDeleteValueA(hklm, "Value5");
6710     RegDeleteValueA(hklm, "Value6");
6711     RegDeleteValueA(hklm, "Value7");
6712     RegDeleteValueA(hklm, "Value8");
6713     RegDeleteValueA(hklm, "Value9");
6714     RegDeleteValueA(hklm, "Value10");
6715     RegDeleteValueA(hklm, "Value11");
6716     RegDeleteValueA(hklm, "Value12");
6717     RegDeleteValueA(hklm, "Value13");
6718     RegDeleteValueA(hklm, "Value14");
6719     RegDeleteValueA(hklm, "Value15");
6720     RegDeleteKeyA(hklm, "");
6721     RegCloseKey(hklm);
6722
6723     RegDeleteValueA(classes, "Value1");
6724     RegDeleteKeyA(classes, "");
6725     RegCloseKey(classes);
6726
6727     RegDeleteValueA(hkcu, "Value1");
6728     RegDeleteKeyA(hkcu, "");
6729     RegCloseKey(hkcu);
6730
6731     RegDeleteValueA(users, "Value1");
6732     RegDeleteKeyA(users, "");
6733     RegCloseKey(users);
6734
6735     DeleteFileA("FileName1");
6736     DeleteFileA("FileName3.dll");
6737     DeleteFileA("FileName4.dll");
6738     DeleteFileA("FileName5.dll");
6739     MsiCloseHandle(hpkg);
6740     DeleteFileA(msifile);
6741 }
6742
6743 static void delete_win_ini(LPCSTR file)
6744 {
6745     CHAR path[MAX_PATH];
6746
6747     GetWindowsDirectoryA(path, MAX_PATH);
6748     lstrcatA(path, "\\");
6749     lstrcatA(path, file);
6750
6751     DeleteFileA(path);
6752 }
6753
6754 static void test_appsearch_inilocator(void)
6755 {
6756     MSIHANDLE hpkg, hdb;
6757     CHAR path[MAX_PATH];
6758     CHAR prop[MAX_PATH];
6759     LPCSTR str;
6760     LPSTR ptr;
6761     DWORD size;
6762     UINT r;
6763
6764     WritePrivateProfileStringA("Section", "Key", "keydata,field2", "IniFile.ini");
6765
6766     create_test_file("FileName1");
6767     sprintf(path, "%s\\FileName1", CURR_DIR);
6768     WritePrivateProfileStringA("Section", "Key2", path, "IniFile.ini");
6769
6770     WritePrivateProfileStringA("Section", "Key3", CURR_DIR, "IniFile.ini");
6771
6772     sprintf(path, "%s\\IDontExist", CURR_DIR);
6773     WritePrivateProfileStringA("Section", "Key4", path, "IniFile.ini");
6774
6775     create_file_with_version("FileName2.dll", MAKELONG(2, 1), MAKELONG(4, 3));
6776     sprintf(path, "%s\\FileName2.dll", CURR_DIR);
6777     WritePrivateProfileStringA("Section", "Key5", path, "IniFile.ini");
6778
6779     create_file_with_version("FileName3.dll", MAKELONG(1, 2), MAKELONG(3, 4));
6780     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
6781     WritePrivateProfileStringA("Section", "Key6", path, "IniFile.ini");
6782
6783     create_file_with_version("FileName4.dll", MAKELONG(2, 1), MAKELONG(4, 3));
6784     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
6785     WritePrivateProfileStringA("Section", "Key7", path, "IniFile.ini");
6786
6787     hdb = create_package_db();
6788     ok(hdb, "Expected a valid database handle\n");
6789
6790     r = create_appsearch_table(hdb);
6791     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6792
6793     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
6794     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6795
6796     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
6797     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6798
6799     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
6800     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6801
6802     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
6803     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6804
6805     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
6806     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6807
6808     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
6809     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6810
6811     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
6812     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6813
6814     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
6815     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6816
6817     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
6818     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6819
6820     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
6821     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6822
6823     r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'");
6824     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6825
6826     r = add_appsearch_entry(hdb, "'SIGPROP12', 'NewSignature12'");
6827     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6828
6829     r = create_inilocator_table(hdb);
6830     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6831
6832     /* msidbLocatorTypeRawValue, field 1 */
6833     str = "'NewSignature1', 'IniFile.ini', 'Section', 'Key', 1, 2";
6834     r = add_inilocator_entry(hdb, str);
6835     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6836
6837     /* msidbLocatorTypeRawValue, field 2 */
6838     str = "'NewSignature2', 'IniFile.ini', 'Section', 'Key', 2, 2";
6839     r = add_inilocator_entry(hdb, str);
6840     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6841
6842     /* msidbLocatorTypeRawValue, entire field */
6843     str = "'NewSignature3', 'IniFile.ini', 'Section', 'Key', 0, 2";
6844     r = add_inilocator_entry(hdb, str);
6845     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6846
6847     /* msidbLocatorTypeFile */
6848     str = "'NewSignature4', 'IniFile.ini', 'Section', 'Key2', 1, 1";
6849     r = add_inilocator_entry(hdb, str);
6850     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6851
6852     /* msidbLocatorTypeDirectory, file */
6853     str = "'NewSignature5', 'IniFile.ini', 'Section', 'Key2', 1, 0";
6854     r = add_inilocator_entry(hdb, str);
6855     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6856
6857     /* msidbLocatorTypeDirectory, directory */
6858     str = "'NewSignature6', 'IniFile.ini', 'Section', 'Key3', 1, 0";
6859     r = add_inilocator_entry(hdb, str);
6860     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6861
6862     /* msidbLocatorTypeFile, file, no signature */
6863     str = "'NewSignature7', 'IniFile.ini', 'Section', 'Key2', 1, 1";
6864     r = add_inilocator_entry(hdb, str);
6865     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6866
6867     /* msidbLocatorTypeFile, dir, no signature */
6868     str = "'NewSignature8', 'IniFile.ini', 'Section', 'Key3', 1, 1";
6869     r = add_inilocator_entry(hdb, str);
6870     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6871
6872     /* msidbLocatorTypeFile, file does not exist */
6873     str = "'NewSignature9', 'IniFile.ini', 'Section', 'Key4', 1, 1";
6874     r = add_inilocator_entry(hdb, str);
6875     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6876
6877     /* msidbLocatorTypeFile, signature with version */
6878     str = "'NewSignature10', 'IniFile.ini', 'Section', 'Key5', 1, 1";
6879     r = add_inilocator_entry(hdb, str);
6880     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6881
6882     /* msidbLocatorTypeFile, signature with version, ver > max */
6883     str = "'NewSignature11', 'IniFile.ini', 'Section', 'Key6', 1, 1";
6884     r = add_inilocator_entry(hdb, str);
6885     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6886
6887     /* msidbLocatorTypeFile, signature with version, sig->name ignored */
6888     str = "'NewSignature12', 'IniFile.ini', 'Section', 'Key7', 1, 1";
6889     r = add_inilocator_entry(hdb, str);
6890     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6891
6892     r = create_signature_table(hdb);
6893     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6894
6895     r = add_signature_entry(hdb, "'NewSignature4', 'FileName1', '', '', '', '', '', '', ''");
6896     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6897
6898     r = add_signature_entry(hdb, "'NewSignature9', 'IDontExist', '', '', '', '', '', '', ''");
6899     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6900
6901     r = add_signature_entry(hdb, "'NewSignature10', 'FileName2.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6902     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6903
6904     r = add_signature_entry(hdb, "'NewSignature11', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6905     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6906
6907     r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''");
6908     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6909
6910     hpkg = package_from_db(hdb);
6911     ok(hpkg, "Expected a valid package handle\n");
6912
6913     r = MsiDoAction(hpkg, "AppSearch");
6914     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6915
6916     size = MAX_PATH;
6917     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
6918     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6919     ok(!lstrcmpA(prop, "keydata"), "Expected \"keydata\", got \"%s\"\n", prop);
6920
6921     size = MAX_PATH;
6922     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
6923     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6924     ok(!lstrcmpA(prop, "field2"), "Expected \"field2\", got \"%s\"\n", prop);
6925
6926     size = MAX_PATH;
6927     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
6928     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6929     ok(!lstrcmpA(prop, "keydata,field2"),
6930        "Expected \"keydata,field2\", got \"%s\"\n", prop);
6931
6932     size = MAX_PATH;
6933     sprintf(path, "%s\\FileName1", CURR_DIR);
6934     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
6935     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6936     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6937
6938     size = MAX_PATH;
6939     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
6940     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6941     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6942
6943     size = MAX_PATH;
6944     sprintf(path, "%s\\", CURR_DIR);
6945     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
6946     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6947     todo_wine
6948     {
6949         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6950     }
6951
6952     size = MAX_PATH;
6953     sprintf(path, "%s\\", CURR_DIR);
6954     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
6955     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6956     todo_wine
6957     {
6958         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6959     }
6960
6961     size = MAX_PATH;
6962     lstrcpyA(path, CURR_DIR);
6963     ptr = strrchr(path, '\\');
6964     *(ptr + 1) = '\0';
6965     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
6966     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6967     todo_wine
6968     {
6969         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6970     }
6971
6972     size = MAX_PATH;
6973     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
6974     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6975     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6976
6977     size = MAX_PATH;
6978     sprintf(path, "%s\\FileName2.dll", CURR_DIR);
6979     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
6980     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6981     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6982
6983     size = MAX_PATH;
6984     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
6985     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6986     ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
6987
6988     size = MAX_PATH;
6989     sprintf(path, "%s\\FileName4.dll", CURR_DIR);
6990     r = MsiGetPropertyA(hpkg, "SIGPROP12", prop, &size);
6991     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
6992     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
6993
6994     delete_win_ini("IniFile.ini");
6995     DeleteFileA("FileName1");
6996     DeleteFileA("FileName2.dll");
6997     DeleteFileA("FileName3.dll");
6998     DeleteFileA("FileName4.dll");
6999     MsiCloseHandle(hpkg);
7000     DeleteFileA(msifile);
7001 }
7002
7003 static void test_appsearch_drlocator(void)
7004 {
7005     MSIHANDLE hpkg, hdb;
7006     CHAR path[MAX_PATH];
7007     CHAR prop[MAX_PATH];
7008     LPCSTR str;
7009     DWORD size;
7010     UINT r;
7011
7012     create_test_file("FileName1");
7013     CreateDirectoryA("one", NULL);
7014     CreateDirectoryA("one\\two", NULL);
7015     CreateDirectoryA("one\\two\\three", NULL);
7016     create_test_file("one\\two\\three\\FileName2");
7017     CreateDirectoryA("another", NULL);
7018     create_file_with_version("FileName3.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7019     create_file_with_version("FileName4.dll", MAKELONG(1, 2), MAKELONG(3, 4));
7020     create_file_with_version("FileName5.dll", MAKELONG(2, 1), MAKELONG(4, 3));
7021
7022     hdb = create_package_db();
7023     ok(hdb, "Expected a valid database handle\n");
7024
7025     r = create_appsearch_table(hdb);
7026     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7027
7028     r = add_appsearch_entry(hdb, "'SIGPROP1', 'NewSignature1'");
7029     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7030
7031     r = add_appsearch_entry(hdb, "'SIGPROP2', 'NewSignature2'");
7032     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7033
7034     r = add_appsearch_entry(hdb, "'SIGPROP3', 'NewSignature3'");
7035     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7036
7037     r = add_appsearch_entry(hdb, "'SIGPROP4', 'NewSignature4'");
7038     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7039
7040     r = add_appsearch_entry(hdb, "'SIGPROP5', 'NewSignature5'");
7041     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7042
7043     r = add_appsearch_entry(hdb, "'SIGPROP6', 'NewSignature6'");
7044     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7045
7046     r = add_appsearch_entry(hdb, "'SIGPROP7', 'NewSignature7'");
7047     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7048
7049     r = add_appsearch_entry(hdb, "'SIGPROP8', 'NewSignature8'");
7050     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7051
7052     r = add_appsearch_entry(hdb, "'SIGPROP9', 'NewSignature9'");
7053     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7054
7055     r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'");
7056     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7057
7058     r = create_drlocator_table(hdb);
7059     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7060
7061     /* no parent, full path, depth 0, signature */
7062     sprintf(path, "'NewSignature1', '', '%s', 0", CURR_DIR);
7063     r = add_drlocator_entry(hdb, path);
7064     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7065
7066     /* no parent, full path, depth 0, no signature */
7067     sprintf(path, "'NewSignature2', '', '%s', 0", CURR_DIR);
7068     r = add_drlocator_entry(hdb, path);
7069     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7070
7071     /* no parent, relative path, depth 0, no signature */
7072     sprintf(path, "'NewSignature3', '', '%s', 0", CURR_DIR + 3);
7073     r = add_drlocator_entry(hdb, path);
7074     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7075
7076     /* no parent, full path, depth 2, signature */
7077     sprintf(path, "'NewSignature4', '', '%s', 2", CURR_DIR);
7078     r = add_drlocator_entry(hdb, path);
7079     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7080
7081     /* no parent, full path, depth 3, signature */
7082     sprintf(path, "'NewSignature5', '', '%s', 3", CURR_DIR);
7083     r = add_drlocator_entry(hdb, path);
7084     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7085
7086     /* no parent, full path, depth 1, signature is dir */
7087     sprintf(path, "'NewSignature6', '', '%s', 1", CURR_DIR);
7088     r = add_drlocator_entry(hdb, path);
7089     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7090
7091     /* parent is in DrLocator, relative path, depth 0, signature */
7092     sprintf(path, "'NewSignature7', 'NewSignature1', 'one\\two\\three', 1");
7093     r = add_drlocator_entry(hdb, path);
7094     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7095
7096     /* no parent, full path, depth 0, signature w/ version */
7097     sprintf(path, "'NewSignature8', '', '%s', 0", CURR_DIR);
7098     r = add_drlocator_entry(hdb, path);
7099     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7100
7101     /* no parent, full path, depth 0, signature w/ version, ver > max */
7102     sprintf(path, "'NewSignature9', '', '%s', 0", CURR_DIR);
7103     r = add_drlocator_entry(hdb, path);
7104     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7105
7106     /* no parent, full path, depth 0, signature w/ version, sig->name not ignored */
7107     sprintf(path, "'NewSignature10', '', '%s', 0", CURR_DIR);
7108     r = add_drlocator_entry(hdb, path);
7109     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7110
7111     r = create_signature_table(hdb);
7112     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7113
7114     str = "'NewSignature1', 'FileName1', '', '', '', '', '', '', ''";
7115     r = add_signature_entry(hdb, str);
7116     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7117
7118     str = "'NewSignature4', 'FileName2', '', '', '', '', '', '', ''";
7119     r = add_signature_entry(hdb, str);
7120     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7121
7122     str = "'NewSignature5', 'FileName2', '', '', '', '', '', '', ''";
7123     r = add_signature_entry(hdb, str);
7124     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7125
7126     str = "'NewSignature6', 'another', '', '', '', '', '', '', ''";
7127     r = add_signature_entry(hdb, str);
7128     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7129
7130     str = "'NewSignature7', 'FileName2', '', '', '', '', '', '', ''";
7131     r = add_signature_entry(hdb, str);
7132     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7133
7134     str = "'NewSignature8', 'FileName3.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
7135     r = add_signature_entry(hdb, str);
7136     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7137
7138     str = "'NewSignature9', 'FileName4.dll', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
7139     r = add_signature_entry(hdb, str);
7140     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7141
7142     str = "'NewSignature10', 'necessary', '1.1.1.1', '2.1.1.1', '', '', '', '', ''";
7143     r = add_signature_entry(hdb, str);
7144     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7145
7146     hpkg = package_from_db(hdb);
7147     ok(hpkg, "Expected a valid package handle\n");
7148
7149     r = MsiDoAction(hpkg, "AppSearch");
7150     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7151
7152     size = MAX_PATH;
7153     sprintf(path, "%s\\FileName1", CURR_DIR);
7154     r = MsiGetPropertyA(hpkg, "SIGPROP1", prop, &size);
7155     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7156     todo_wine
7157     {
7158         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7159     }
7160
7161     size = MAX_PATH;
7162     sprintf(path, "%s\\", CURR_DIR);
7163     r = MsiGetPropertyA(hpkg, "SIGPROP2", prop, &size);
7164     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7165     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7166
7167     size = MAX_PATH;
7168     sprintf(path, "%s\\", CURR_DIR);
7169     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
7170     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7171     ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7172
7173     size = MAX_PATH;
7174     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
7175     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7176     todo_wine
7177     {
7178         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7179     }
7180
7181     size = MAX_PATH;
7182     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
7183     r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size);
7184     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7185     todo_wine
7186     {
7187         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7188     }
7189
7190     size = MAX_PATH;
7191     r = MsiGetPropertyA(hpkg, "SIGPROP6", prop, &size);
7192     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7193     todo_wine
7194     {
7195         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7196     }
7197
7198     size = MAX_PATH;
7199     sprintf(path, "%s\\one\\two\\three\\FileName2", CURR_DIR);
7200     r = MsiGetPropertyA(hpkg, "SIGPROP7", prop, &size);
7201     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7202     todo_wine
7203     {
7204         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7205     }
7206
7207     size = MAX_PATH;
7208     sprintf(path, "%s\\FileName3.dll", CURR_DIR);
7209     r = MsiGetPropertyA(hpkg, "SIGPROP8", prop, &size);
7210     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7211     todo_wine
7212     {
7213         ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
7214     }
7215
7216     size = MAX_PATH;
7217     r = MsiGetPropertyA(hpkg, "SIGPROP9", prop, &size);
7218     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7219     todo_wine
7220     {
7221         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7222     }
7223
7224     size = MAX_PATH;
7225     r = MsiGetPropertyA(hpkg, "SIGPROP10", prop, &size);
7226     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7227     todo_wine
7228     {
7229         ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop);
7230     }
7231
7232     DeleteFileA("FileName1");
7233     DeleteFileA("FileName3.dll");
7234     DeleteFileA("FileName4.dll");
7235     DeleteFileA("FileName5.dll");
7236     DeleteFileA("one\\two\\three\\FileName2");
7237     RemoveDirectoryA("one\\two\\three");
7238     RemoveDirectoryA("one\\two");
7239     RemoveDirectoryA("one");
7240     RemoveDirectoryA("another");
7241     MsiCloseHandle(hpkg);
7242     DeleteFileA(msifile);
7243 }
7244
7245 static void test_featureparents(void)
7246 {
7247     MSIHANDLE hpkg;
7248     UINT r;
7249     MSIHANDLE hdb;
7250     INSTALLSTATE state, action;
7251
7252     hdb = create_package_db();
7253     ok ( hdb, "failed to create package database\n" );
7254
7255     r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'");
7256     ok( r == ERROR_SUCCESS, "cannot add directory: %d\n", r );
7257
7258     r = create_feature_table( hdb );
7259     ok( r == ERROR_SUCCESS, "cannot create Feature table: %d\n", r );
7260
7261     r = create_component_table( hdb );
7262     ok( r == ERROR_SUCCESS, "cannot create Component table: %d\n", r );
7263
7264     r = create_feature_components_table( hdb );
7265     ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r );
7266
7267     r = create_file_table( hdb );
7268     ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r );
7269
7270     /* msidbFeatureAttributesFavorLocal */
7271     r = add_feature_entry( hdb, "'zodiac', '', '', '', 2, 1, '', 0" );
7272     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7273
7274     /* msidbFeatureAttributesFavorSource */
7275     r = add_feature_entry( hdb, "'perseus', '', '', '', 2, 1, '', 1" );
7276     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7277
7278     /* msidbFeatureAttributesFavorLocal */
7279     r = add_feature_entry( hdb, "'orion', '', '', '', 2, 1, '', 0" );
7280     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7281
7282     /* disabled because of install level */
7283     r = add_feature_entry( hdb, "'waters', '', '', '', 15, 101, '', 9" );
7284     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7285
7286     /* child feature of disabled feature */
7287     r = add_feature_entry( hdb, "'bayer', 'waters', '', '', 14, 1, '', 9" );
7288     ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r );
7289
7290     /* component of disabled feature (install level) */
7291     r = add_component_entry( hdb, "'delphinus', '', 'TARGETDIR', 0, '', 'delphinus_file'" );
7292     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7293
7294     /* component of disabled child feature (install level) */
7295     r = add_component_entry( hdb, "'hydrus', '', 'TARGETDIR', 0, '', 'hydrus_file'" );
7296     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7297
7298     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
7299     r = add_component_entry( hdb, "'leo', '', 'TARGETDIR', 0, '', 'leo_file'" );
7300     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7301
7302     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
7303     r = add_component_entry( hdb, "'virgo', '', 'TARGETDIR', 1, '', 'virgo_file'" );
7304     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7305
7306     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
7307     r = add_component_entry( hdb, "'libra', '', 'TARGETDIR', 2, '', 'libra_file'" );
7308     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7309
7310     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesLocalOnly */
7311     r = add_component_entry( hdb, "'cassiopeia', '', 'TARGETDIR', 0, '', 'cassiopeia_file'" );
7312     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7313
7314     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesSourceOnly */
7315     r = add_component_entry( hdb, "'cepheus', '', 'TARGETDIR', 1, '', 'cepheus_file'" );
7316     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7317
7318     /* msidbFeatureAttributesFavorSource:msidbComponentAttributesOptional */
7319     r = add_component_entry( hdb, "'andromeda', '', 'TARGETDIR', 2, '', 'andromeda_file'" );
7320     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7321
7322     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesLocalOnly */
7323     r = add_component_entry( hdb, "'canis', '', 'TARGETDIR', 0, '', 'canis_file'" );
7324     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7325
7326     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesSourceOnly */
7327     r = add_component_entry( hdb, "'monoceros', '', 'TARGETDIR', 1, '', 'monoceros_file'" );
7328     ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r );
7329
7330     /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */
7331     r = add_component_entry( hdb, "'lepus', '', 'TARGETDIR', 2, '', 'lepus_file'" );
7332
7333     r = add_feature_components_entry( hdb, "'zodiac', 'leo'" );
7334     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7335
7336     r = add_feature_components_entry( hdb, "'zodiac', 'virgo'" );
7337     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7338
7339     r = add_feature_components_entry( hdb, "'zodiac', 'libra'" );
7340     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7341
7342     r = add_feature_components_entry( hdb, "'perseus', 'cassiopeia'" );
7343     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7344
7345     r = add_feature_components_entry( hdb, "'perseus', 'cepheus'" );
7346     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7347
7348     r = add_feature_components_entry( hdb, "'perseus', 'andromeda'" );
7349     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7350
7351     r = add_feature_components_entry( hdb, "'orion', 'leo'" );
7352     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7353
7354     r = add_feature_components_entry( hdb, "'orion', 'virgo'" );
7355     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7356
7357     r = add_feature_components_entry( hdb, "'orion', 'libra'" );
7358     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7359
7360     r = add_feature_components_entry( hdb, "'orion', 'cassiopeia'" );
7361     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7362
7363     r = add_feature_components_entry( hdb, "'orion', 'cepheus'" );
7364     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7365
7366     r = add_feature_components_entry( hdb, "'orion', 'andromeda'" );
7367     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7368
7369     r = add_feature_components_entry( hdb, "'orion', 'canis'" );
7370     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7371
7372     r = add_feature_components_entry( hdb, "'orion', 'monoceros'" );
7373     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7374
7375     r = add_feature_components_entry( hdb, "'orion', 'lepus'" );
7376     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7377
7378     r = add_feature_components_entry( hdb, "'waters', 'delphinus'" );
7379     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7380
7381     r = add_feature_components_entry( hdb, "'bayer', 'hydrus'" );
7382     ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r );
7383
7384     r = add_file_entry( hdb, "'leo_file', 'leo', 'leo.txt', 100, '', '1033', 8192, 1" );
7385     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7386
7387     r = add_file_entry( hdb, "'virgo_file', 'virgo', 'virgo.txt', 0, '', '1033', 8192, 1" );
7388     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7389
7390     r = add_file_entry( hdb, "'libra_file', 'libra', 'libra.txt', 0, '', '1033', 8192, 1" );
7391     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7392
7393     r = add_file_entry( hdb, "'cassiopeia_file', 'cassiopeia', 'cassiopeia.txt', 0, '', '1033', 8192, 1" );
7394     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7395
7396     r = add_file_entry( hdb, "'cepheus_file', 'cepheus', 'cepheus.txt', 0, '', '1033', 8192, 1" );
7397     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7398
7399     r = add_file_entry( hdb, "'andromeda_file', 'andromeda', 'andromeda.txt', 0, '', '1033', 8192, 1" );
7400     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7401
7402     r = add_file_entry( hdb, "'canis_file', 'canis', 'canis.txt', 0, '', '1033', 8192, 1" );
7403     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7404
7405     r = add_file_entry( hdb, "'monoceros_file', 'monoceros', 'monoceros.txt', 0, '', '1033', 8192, 1" );
7406     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7407
7408     r = add_file_entry( hdb, "'lepus_file', 'lepus', 'lepus.txt', 0, '', '1033', 8192, 1" );
7409     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7410
7411     r = add_file_entry( hdb, "'delphinus_file', 'delphinus', 'delphinus.txt', 0, '', '1033', 8192, 1" );
7412     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7413
7414     r = add_file_entry( hdb, "'hydrus_file', 'hydrus', 'hydrus.txt', 0, '', '1033', 8192, 1" );
7415     ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r);
7416
7417     hpkg = package_from_db( hdb );
7418     ok( hpkg, "failed to create package\n");
7419
7420     MsiCloseHandle( hdb );
7421
7422     r = MsiDoAction( hpkg, "CostInitialize");
7423     ok( r == ERROR_SUCCESS, "cost init failed\n");
7424
7425     r = MsiDoAction( hpkg, "FileCost");
7426     ok( r == ERROR_SUCCESS, "file cost failed\n");
7427
7428     r = MsiDoAction( hpkg, "CostFinalize");
7429     ok( r == ERROR_SUCCESS, "cost finalize failed\n");
7430
7431     state = 0xdeadbee;
7432     action = 0xdeadbee;
7433     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
7434     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7435     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7436     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7437
7438     state = 0xdeadbee;
7439     action = 0xdeadbee;
7440     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
7441     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7442     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7443     ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action);
7444
7445     state = 0xdeadbee;
7446     action = 0xdeadbee;
7447     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
7448     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7449     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7450     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7451
7452     state = 0xdeadbee;
7453     action = 0xdeadbee;
7454     r = MsiGetFeatureState(hpkg, "waters", &state, &action);
7455     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7456     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7457     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7458
7459     state = 0xdeadbee;
7460     action = 0xdeadbee;
7461     r = MsiGetFeatureState(hpkg, "bayer", &state, &action);
7462     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7463     ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state);
7464     ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action);
7465
7466     state = 0xdeadbee;
7467     action = 0xdeadbee;
7468     r = MsiGetComponentState(hpkg, "leo", &state, &action);
7469     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7470     ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
7471     ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action);
7472
7473     state = 0xdeadbee;
7474     action = 0xdeadbee;
7475     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
7476     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7477     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
7478     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
7479
7480     state = 0xdeadbee;
7481     action = 0xdeadbee;
7482     r = MsiGetComponentState(hpkg, "libra", &state, &action);
7483     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7484     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
7485     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
7486
7487     state = 0xdeadbee;
7488     action = 0xdeadbee;
7489     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
7490     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7491     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
7492     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
7493
7494     state = 0xdeadbee;
7495     action = 0xdeadbee;
7496     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
7497     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7498     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
7499     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
7500
7501     state = 0xdeadbee;
7502     action = 0xdeadbee;
7503     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
7504     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7505     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
7506     ok( action == INSTALLSTATE_LOCAL, "Expected andromeda INSTALLSTATE_LOCAL, got %d\n", action);
7507
7508     state = 0xdeadbee;
7509     action = 0xdeadbee;
7510     r = MsiGetComponentState(hpkg, "canis", &state, &action);
7511     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7512     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
7513     ok( action == INSTALLSTATE_LOCAL, "Expected canis INSTALLSTATE_LOCAL, got %d\n", action);
7514
7515     state = 0xdeadbee;
7516     action = 0xdeadbee;
7517     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
7518     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7519     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
7520     ok( action == INSTALLSTATE_SOURCE, "Expected monoceros INSTALLSTATE_SOURCE, got %d\n", action);
7521
7522     state = 0xdeadbee;
7523     action = 0xdeadbee;
7524     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
7525     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7526     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
7527     ok( action == INSTALLSTATE_LOCAL, "Expected lepus INSTALLSTATE_LOCAL, got %d\n", action);
7528
7529     state = 0xdeadbee;
7530     action = 0xdeadbee;
7531     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
7532     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7533     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
7534     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
7535
7536     state = 0xdeadbee;
7537     action = 0xdeadbee;
7538     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
7539     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7540     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
7541     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
7542
7543     r = MsiSetFeatureState(hpkg, "orion", INSTALLSTATE_ABSENT);
7544     ok( r == ERROR_SUCCESS, "failed to set feature state: %d\n", r);
7545
7546     state = 0xdeadbee;
7547     action = 0xdeadbee;
7548     r = MsiGetFeatureState(hpkg, "zodiac", &state, &action);
7549     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7550     ok( state == INSTALLSTATE_ABSENT, "Expected zodiac INSTALLSTATE_ABSENT, got %d\n", state);
7551     ok( action == INSTALLSTATE_LOCAL, "Expected zodiac INSTALLSTATE_LOCAL, got %d\n", action);
7552
7553     state = 0xdeadbee;
7554     action = 0xdeadbee;
7555     r = MsiGetFeatureState(hpkg, "perseus", &state, &action);
7556     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7557     ok( state == INSTALLSTATE_ABSENT, "Expected perseus INSTALLSTATE_ABSENT, got %d\n", state);
7558     ok( action == INSTALLSTATE_SOURCE, "Expected perseus INSTALLSTATE_SOURCE, got %d\n", action);
7559
7560     state = 0xdeadbee;
7561     action = 0xdeadbee;
7562     r = MsiGetFeatureState(hpkg, "orion", &state, &action);
7563     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7564     ok( state == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", state);
7565     ok( action == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", action);
7566
7567     state = 0xdeadbee;
7568     action = 0xdeadbee;
7569     r = MsiGetComponentState(hpkg, "leo", &state, &action);
7570     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7571     ok( state == INSTALLSTATE_UNKNOWN, "Expected leo INSTALLSTATE_UNKNOWN, got %d\n", state);
7572     ok( action == INSTALLSTATE_LOCAL, "Expected leo INSTALLSTATE_LOCAL, got %d\n", action);
7573
7574     state = 0xdeadbee;
7575     action = 0xdeadbee;
7576     r = MsiGetComponentState(hpkg, "virgo", &state, &action);
7577     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7578     ok( state == INSTALLSTATE_UNKNOWN, "Expected virgo INSTALLSTATE_UNKNOWN, got %d\n", state);
7579     ok( action == INSTALLSTATE_SOURCE, "Expected virgo INSTALLSTATE_SOURCE, got %d\n", action);
7580
7581     state = 0xdeadbee;
7582     action = 0xdeadbee;
7583     r = MsiGetComponentState(hpkg, "libra", &state, &action);
7584     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7585     ok( state == INSTALLSTATE_UNKNOWN, "Expected libra INSTALLSTATE_UNKNOWN, got %d\n", state);
7586     ok( action == INSTALLSTATE_LOCAL, "Expected libra INSTALLSTATE_LOCAL, got %d\n", action);
7587
7588     state = 0xdeadbee;
7589     action = 0xdeadbee;
7590     r = MsiGetComponentState(hpkg, "cassiopeia", &state, &action);
7591     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7592     ok( state == INSTALLSTATE_UNKNOWN, "Expected cassiopeia INSTALLSTATE_UNKNOWN, got %d\n", state);
7593     ok( action == INSTALLSTATE_LOCAL, "Expected cassiopeia INSTALLSTATE_LOCAL, got %d\n", action);
7594
7595     state = 0xdeadbee;
7596     action = 0xdeadbee;
7597     r = MsiGetComponentState(hpkg, "cepheus", &state, &action);
7598     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7599     ok( state == INSTALLSTATE_UNKNOWN, "Expected cepheus INSTALLSTATE_UNKNOWN, got %d\n", state);
7600     ok( action == INSTALLSTATE_SOURCE, "Expected cepheus INSTALLSTATE_SOURCE, got %d\n", action);
7601
7602     state = 0xdeadbee;
7603     action = 0xdeadbee;
7604     r = MsiGetComponentState(hpkg, "andromeda", &state, &action);
7605     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7606     ok( state == INSTALLSTATE_UNKNOWN, "Expected andromeda INSTALLSTATE_UNKNOWN, got %d\n", state);
7607     ok( action == INSTALLSTATE_SOURCE, "Expected andromeda INSTALLSTATE_SOURCE, got %d\n", action);
7608
7609     state = 0xdeadbee;
7610     action = 0xdeadbee;
7611     r = MsiGetComponentState(hpkg, "canis", &state, &action);
7612     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7613     ok( state == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", state);
7614     ok( action == INSTALLSTATE_UNKNOWN, "Expected canis INSTALLSTATE_UNKNOWN, got %d\n", action);
7615
7616     state = 0xdeadbee;
7617     action = 0xdeadbee;
7618     r = MsiGetComponentState(hpkg, "monoceros", &state, &action);
7619     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7620     ok( state == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", state);
7621     ok( action == INSTALLSTATE_UNKNOWN, "Expected monoceros INSTALLSTATE_UNKNOWN, got %d\n", action);
7622
7623     state = 0xdeadbee;
7624     action = 0xdeadbee;
7625     r = MsiGetComponentState(hpkg, "lepus", &state, &action);
7626     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7627     ok( state == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", state);
7628     ok( action == INSTALLSTATE_UNKNOWN, "Expected lepus INSTALLSTATE_UNKNOWN, got %d\n", action);
7629
7630     state = 0xdeadbee;
7631     action = 0xdeadbee;
7632     r = MsiGetComponentState(hpkg, "delphinus", &state, &action);
7633     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7634     ok( state == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", state);
7635     ok( action == INSTALLSTATE_UNKNOWN, "Expected delphinus INSTALLSTATE_UNKNOWN, got %d\n", action);
7636
7637     state = 0xdeadbee;
7638     action = 0xdeadbee;
7639     r = MsiGetComponentState(hpkg, "hydrus", &state, &action);
7640     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r );
7641     ok( state == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", state);
7642     ok( action == INSTALLSTATE_UNKNOWN, "Expected hydrus INSTALLSTATE_UNKNOWN, got %d\n", action);
7643     
7644     MsiCloseHandle(hpkg);
7645     DeleteFileA(msifile);
7646 }
7647
7648 static void test_installprops(void)
7649 {
7650     MSIHANDLE hpkg, hdb;
7651     CHAR path[MAX_PATH];
7652     CHAR buf[MAX_PATH];
7653     DWORD size, type;
7654     LANGID langid;
7655     HKEY hkey1, hkey2;
7656     int res;
7657     UINT r;
7658
7659     GetCurrentDirectory(MAX_PATH, path);
7660     lstrcat(path, "\\");
7661     lstrcat(path, msifile);
7662
7663     hdb = create_package_db();
7664     ok( hdb, "failed to create database\n");
7665
7666     hpkg = package_from_db(hdb);
7667     ok( hpkg, "failed to create package\n");
7668
7669     MsiCloseHandle(hdb);
7670
7671     size = MAX_PATH;
7672     r = MsiGetProperty(hpkg, "DATABASE", buf, &size);
7673     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7674     ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
7675
7676     RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\MS Setup (ACME)\\User Info", &hkey1);
7677
7678     RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hkey2);
7679
7680     size = MAX_PATH;
7681     type = REG_SZ;
7682     *path = '\0';
7683     if (RegQueryValueEx(hkey1, "DefName", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
7684     {
7685         size = MAX_PATH;
7686         type = REG_SZ;
7687         RegQueryValueEx(hkey2, "RegisteredOwner", NULL, &type, (LPBYTE)path, &size);
7688     }
7689
7690     /* win9x doesn't set this */
7691     if (*path)
7692     {
7693         size = MAX_PATH;
7694         r = MsiGetProperty(hpkg, "USERNAME", buf, &size);
7695         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7696         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
7697     }
7698
7699     size = MAX_PATH;
7700     type = REG_SZ;
7701     *path = '\0';
7702     if (RegQueryValueEx(hkey1, "DefCompany", NULL, &type, (LPBYTE)path, &size) != ERROR_SUCCESS)
7703     {
7704         size = MAX_PATH;
7705         type = REG_SZ;
7706         RegQueryValueEx(hkey2, "RegisteredOrganization", NULL, &type, (LPBYTE)path, &size);
7707     }
7708
7709     if (*path)
7710     {
7711         size = MAX_PATH;
7712         r = MsiGetProperty(hpkg, "COMPANYNAME", buf, &size);
7713         ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7714         ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf);
7715     }
7716
7717     size = MAX_PATH;
7718     r = MsiGetProperty(hpkg, "VersionDatabase", buf, &size);
7719     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7720     trace("VersionDatabase = %s\n", buf);
7721
7722     size = MAX_PATH;
7723     r = MsiGetProperty(hpkg, "VersionMsi", buf, &size);
7724     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7725     trace("VersionMsi = %s\n", buf);
7726
7727     size = MAX_PATH;
7728     r = MsiGetProperty(hpkg, "Date", buf, &size);
7729     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7730     trace("Date = %s\n", buf);
7731
7732     size = MAX_PATH;
7733     r = MsiGetProperty(hpkg, "Time", buf, &size);
7734     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7735     trace("Time = %s\n", buf);
7736
7737     size = MAX_PATH;
7738     r = MsiGetProperty(hpkg, "PackageCode", buf, &size);
7739     ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r);
7740     trace("PackageCode = %s\n", buf);
7741
7742     langid = GetUserDefaultLangID();
7743     sprintf(path, "%d", langid);
7744
7745     size = MAX_PATH;
7746     r = MsiGetProperty(hpkg, "UserLanguageID", buf, &size);
7747     ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS< got %d\n", r);
7748     ok( !lstrcmpA(buf, path), "Expected \"%s\", got \"%s\"\n", path, buf);
7749
7750     res = GetSystemMetrics(SM_CXSCREEN);
7751     size = MAX_PATH;
7752     r = MsiGetProperty(hpkg, "ScreenX", buf, &size);
7753     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
7754
7755     res = GetSystemMetrics(SM_CYSCREEN);
7756     size = MAX_PATH;
7757     r = MsiGetProperty(hpkg, "ScreenY", buf, &size);
7758     ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
7759
7760     CloseHandle(hkey1);
7761     CloseHandle(hkey2);
7762     MsiCloseHandle(hpkg);
7763     DeleteFile(msifile);
7764 }
7765
7766 static void test_launchconditions(void)
7767 {
7768     MSIHANDLE hpkg;
7769     MSIHANDLE hdb;
7770     UINT r;
7771
7772     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
7773
7774     hdb = create_package_db();
7775     ok( hdb, "failed to create package database\n" );
7776
7777     r = create_launchcondition_table( hdb );
7778     ok( r == ERROR_SUCCESS, "cannot create LaunchCondition table: %d\n", r );
7779
7780     r = add_launchcondition_entry( hdb, "'X = \"1\"', 'one'" );
7781     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
7782
7783     /* invalid condition */
7784     r = add_launchcondition_entry( hdb, "'X != \"1\"', 'one'" );
7785     ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
7786
7787     hpkg = package_from_db( hdb );
7788     ok( hpkg, "failed to create package\n");
7789
7790     MsiCloseHandle( hdb );
7791
7792     r = MsiSetProperty( hpkg, "X", "1" );
7793     ok( r == ERROR_SUCCESS, "failed to set property\n" );
7794
7795     /* invalid conditions are ignored */
7796     r = MsiDoAction( hpkg, "LaunchConditions" );
7797     ok( r == ERROR_SUCCESS, "cost init failed\n" );
7798
7799     /* verify LaunchConditions still does some verification */
7800     r = MsiSetProperty( hpkg, "X", "2" );
7801     ok( r == ERROR_SUCCESS, "failed to set property\n" );
7802
7803     r = MsiDoAction( hpkg, "LaunchConditions" );
7804     ok( r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %d\n", r );
7805
7806     MsiCloseHandle( hpkg );
7807     DeleteFile( msifile );
7808 }
7809
7810 static void test_ccpsearch(void)
7811 {
7812     MSIHANDLE hdb, hpkg;
7813     CHAR prop[MAX_PATH];
7814     DWORD size = MAX_PATH;
7815     UINT r;
7816
7817     MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
7818
7819     hdb = create_package_db();
7820     ok(hdb, "failed to create package database\n");
7821
7822     r = create_ccpsearch_table(hdb);
7823     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7824
7825     r = add_ccpsearch_entry(hdb, "'CCP_random'");
7826     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7827
7828     r = add_ccpsearch_entry(hdb, "'RMCCP_random'");
7829     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7830
7831     r = create_reglocator_table(hdb);
7832     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7833
7834     r = add_reglocator_entry(hdb, "'CCP_random', 0, 'htmlfile\\shell\\open\\nonexistent', '', 1");
7835     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7836
7837     r = create_drlocator_table(hdb);
7838     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7839
7840     r = add_drlocator_entry(hdb, "'RMCCP_random', '', 'C:\\', '0'");
7841     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7842
7843     r = create_signature_table(hdb);
7844     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7845
7846     hpkg = package_from_db(hdb);
7847     ok(hpkg, "failed to create package\n");
7848
7849     MsiCloseHandle(hdb);
7850
7851     r = MsiDoAction(hpkg, "CCPSearch");
7852     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7853
7854     r = MsiGetPropertyA(hpkg, "CCP_Success", prop, &size);
7855     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7856     ok(!lstrcmpA(prop, "1"), "Expected 1, got %s\n", prop);
7857
7858     MsiCloseHandle(hpkg);
7859     DeleteFileA(msifile);
7860 }
7861
7862 static void test_complocator(void)
7863 {
7864     MSIHANDLE hdb, hpkg;
7865     UINT r;
7866     CHAR prop[MAX_PATH];
7867     CHAR expected[MAX_PATH];
7868     DWORD size = MAX_PATH;
7869
7870     hdb = create_package_db();
7871     ok(hdb, "failed to create package database\n");
7872
7873     r = create_appsearch_table(hdb);
7874     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7875
7876     r = add_appsearch_entry(hdb, "'ABELISAURUS', 'abelisaurus'");
7877     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7878
7879     r = add_appsearch_entry(hdb, "'BACTROSAURUS', 'bactrosaurus'");
7880     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7881
7882     r = add_appsearch_entry(hdb, "'CAMELOTIA', 'camelotia'");
7883     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7884
7885     r = add_appsearch_entry(hdb, "'DICLONIUS', 'diclonius'");
7886     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7887
7888     r = add_appsearch_entry(hdb, "'ECHINODON', 'echinodon'");
7889     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7890
7891     r = add_appsearch_entry(hdb, "'FALCARIUS', 'falcarius'");
7892     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7893
7894     r = add_appsearch_entry(hdb, "'GALLIMIMUS', 'gallimimus'");
7895     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7896
7897     r = add_appsearch_entry(hdb, "'HAGRYPHUS', 'hagryphus'");
7898     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7899
7900     r = add_appsearch_entry(hdb, "'IGUANODON', 'iguanodon'");
7901     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7902
7903     r = add_appsearch_entry(hdb, "'JOBARIA', 'jobaria'");
7904     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7905
7906     r = add_appsearch_entry(hdb, "'KAKURU', 'kakuru'");
7907     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7908
7909     r = add_appsearch_entry(hdb, "'LABOCANIA', 'labocania'");
7910     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7911
7912     r = add_appsearch_entry(hdb, "'MEGARAPTOR', 'megaraptor'");
7913     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7914
7915     r = add_appsearch_entry(hdb, "'NEOSODON', 'neosodon'");
7916     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7917
7918     r = add_appsearch_entry(hdb, "'OLOROTITAN', 'olorotitan'");
7919     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7920
7921     r = add_appsearch_entry(hdb, "'PANTYDRACO', 'pantydraco'");
7922     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7923
7924     r = create_complocator_table(hdb);
7925     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7926
7927     r = add_complocator_entry(hdb, "'abelisaurus', '{E3619EED-305A-418C-B9C7-F7D7377F0934}', 1");
7928     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7929
7930     r = add_complocator_entry(hdb, "'bactrosaurus', '{D56B688D-542F-42Ef-90FD-B6DA76EE8119}', 0");
7931     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7932
7933     r = add_complocator_entry(hdb, "'camelotia', '{8211BE36-2466-47E3-AFB7-6AC72E51AED2}', 1");
7934     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7935
7936     r = add_complocator_entry(hdb, "'diclonius', '{5C767B20-A33C-45A4-B80B-555E512F01AE}', 0");
7937     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7938
7939     r = add_complocator_entry(hdb, "'echinodon', '{A19E16C5-C75D-4699-8111-C4338C40C3CB}', 1");
7940     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7941
7942     r = add_complocator_entry(hdb, "'falcarius', '{17762FA1-A7AE-4CC6-8827-62873C35361D}', 0");
7943     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7944
7945     r = add_complocator_entry(hdb, "'gallimimus', '{75EBF568-C959-41E0-A99E-9050638CF5FB}', 1");
7946     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7947
7948     r = add_complocator_entry(hdb, "'hagrphus', '{D4969B72-17D9-4AB6-BE49-78F2FEE857AC}', 0");
7949     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7950
7951     r = add_complocator_entry(hdb, "'iguanodon', '{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}', 1");
7952     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7953
7954     r = add_complocator_entry(hdb, "'jobaria', '{243C22B1-8C51-4151-B9D1-1AE5265E079E}', 0");
7955     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7956
7957     r = add_complocator_entry(hdb, "'kakuru', '{5D0F03BA-50BC-44F2-ABB1-72C972F4E514}', 1");
7958     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7959
7960     r = add_complocator_entry(hdb, "'labocania', '{C7DDB60C-7828-4046-A6F8-699D5E92F1ED}', 0");
7961     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7962
7963     r = add_complocator_entry(hdb, "'megaraptor', '{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}', 1");
7964     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7965
7966     r = add_complocator_entry(hdb, "'neosodon', '{0B499649-197A-48EF-93D2-AF1C17ED6E90}', 0");
7967     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7968
7969     r = add_complocator_entry(hdb, "'olorotitan', '{54E9E91F-AED2-46D5-A25A-7E50AFA24513}', 1");
7970     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7971
7972     r = add_complocator_entry(hdb, "'pantydraco', '{2A989951-5565-4FA7-93A7-E800A3E67D71}', 0");
7973     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7974
7975     r = create_signature_table(hdb);
7976     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7977
7978     r = add_signature_entry(hdb, "'abelisaurus', 'abelisaurus', '', '', '', '', '', '', ''");
7979     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7980
7981     r = add_signature_entry(hdb, "'bactrosaurus', 'bactrosaurus', '', '', '', '', '', '', ''");
7982     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7983
7984     r = add_signature_entry(hdb, "'camelotia', 'camelotia', '', '', '', '', '', '', ''");
7985     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7986
7987     r = add_signature_entry(hdb, "'diclonius', 'diclonius', '', '', '', '', '', '', ''");
7988     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7989
7990     r = add_signature_entry(hdb, "'iguanodon', 'iguanodon', '', '', '', '', '', '', ''");
7991     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7992
7993     r = add_signature_entry(hdb, "'jobaria', 'jobaria', '', '', '', '', '', '', ''");
7994     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7995
7996     r = add_signature_entry(hdb, "'kakuru', 'kakuru', '', '', '', '', '', '', ''");
7997     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
7998
7999     r = add_signature_entry(hdb, "'labocania', 'labocania', '', '', '', '', '', '', ''");
8000     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8001
8002     hpkg = package_from_db(hdb);
8003     ok(hpkg, "failed to create package\n");
8004
8005     MsiCloseHandle(hdb);
8006
8007     create_test_file("abelisaurus");
8008     create_test_file("bactrosaurus");
8009     create_test_file("camelotia");
8010     create_test_file("diclonius");
8011     create_test_file("echinodon");
8012     create_test_file("falcarius");
8013     create_test_file("gallimimus");
8014     create_test_file("hagryphus");
8015     CreateDirectoryA("iguanodon", NULL);
8016     CreateDirectoryA("jobaria", NULL);
8017     CreateDirectoryA("kakuru", NULL);
8018     CreateDirectoryA("labocania", NULL);
8019     CreateDirectoryA("megaraptor", NULL);
8020     CreateDirectoryA("neosodon", NULL);
8021     CreateDirectoryA("olorotitan", NULL);
8022     CreateDirectoryA("pantydraco", NULL);
8023
8024     set_component_path("abelisaurus", MSIINSTALLCONTEXT_MACHINE,
8025                        "{E3619EED-305A-418C-B9C7-F7D7377F0934}", NULL, FALSE);
8026     set_component_path("bactrosaurus", MSIINSTALLCONTEXT_MACHINE,
8027                        "{D56B688D-542F-42Ef-90FD-B6DA76EE8119}", NULL, FALSE);
8028     set_component_path("echinodon", MSIINSTALLCONTEXT_MACHINE,
8029                        "{A19E16C5-C75D-4699-8111-C4338C40C3CB}", NULL, FALSE);
8030     set_component_path("falcarius", MSIINSTALLCONTEXT_MACHINE,
8031                        "{17762FA1-A7AE-4CC6-8827-62873C35361D}", NULL, FALSE);
8032     set_component_path("iguanodon", MSIINSTALLCONTEXT_MACHINE,
8033                        "{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}", NULL, FALSE);
8034     set_component_path("jobaria", MSIINSTALLCONTEXT_MACHINE,
8035                        "{243C22B1-8C51-4151-B9D1-1AE5265E079E}", NULL, FALSE);
8036     set_component_path("megaraptor", MSIINSTALLCONTEXT_MACHINE,
8037                        "{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}", NULL, FALSE);
8038     set_component_path("neosodon", MSIINSTALLCONTEXT_MACHINE,
8039                        "{0B499649-197A-48EF-93D2-AF1C17ED6E90}", NULL, FALSE);
8040
8041     r = MsiDoAction(hpkg, "AppSearch");
8042     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8043
8044     size = MAX_PATH;
8045     r = MsiGetPropertyA(hpkg, "ABELISAURUS", prop, &size);
8046     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8047
8048     lstrcpyA(expected, CURR_DIR);
8049     lstrcatA(expected, "\\abelisaurus");
8050     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
8051        "Expected %s or empty string, got %s\n", expected, prop);
8052
8053     size = MAX_PATH;
8054     r = MsiGetPropertyA(hpkg, "BACTROSAURUS", prop, &size);
8055     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8056     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8057
8058     size = MAX_PATH;
8059     r = MsiGetPropertyA(hpkg, "CAMELOTIA", prop, &size);
8060     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8061     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8062
8063     size = MAX_PATH;
8064     r = MsiGetPropertyA(hpkg, "DICLONIUS", prop, &size);
8065     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8066     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8067
8068     size = MAX_PATH;
8069     r = MsiGetPropertyA(hpkg, "ECHINODON", prop, &size);
8070     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8071
8072     lstrcpyA(expected, CURR_DIR);
8073     lstrcatA(expected, "\\");
8074     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
8075        "Expected %s or empty string, got %s\n", expected, prop);
8076
8077     size = MAX_PATH;
8078     r = MsiGetPropertyA(hpkg, "FALCARIUS", prop, &size);
8079     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8080     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8081
8082     size = MAX_PATH;
8083     r = MsiGetPropertyA(hpkg, "GALLIMIMUS", prop, &size);
8084     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8085     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8086
8087     size = MAX_PATH;
8088     r = MsiGetPropertyA(hpkg, "HAGRYPHUS", prop, &size);
8089     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8090     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8091
8092     size = MAX_PATH;
8093     r = MsiGetPropertyA(hpkg, "IGUANODON", prop, &size);
8094     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8095     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8096
8097     size = MAX_PATH;
8098     r = MsiGetPropertyA(hpkg, "JOBARIA", prop, &size);
8099     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8100     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8101
8102     size = MAX_PATH;
8103     r = MsiGetPropertyA(hpkg, "KAKURU", prop, &size);
8104     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8105     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8106
8107     size = MAX_PATH;
8108     r = MsiGetPropertyA(hpkg, "LABOCANIA", prop, &size);
8109     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8110     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8111
8112     size = MAX_PATH;
8113     r = MsiGetPropertyA(hpkg, "MEGARAPTOR", prop, &size);
8114     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8115
8116     lstrcpyA(expected, CURR_DIR);
8117     lstrcatA(expected, "\\");
8118     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
8119        "Expected %s or empty string, got %s\n", expected, prop);
8120
8121     size = MAX_PATH;
8122     r = MsiGetPropertyA(hpkg, "NEOSODON", prop, &size);
8123     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8124
8125     lstrcpyA(expected, CURR_DIR);
8126     lstrcatA(expected, "\\neosodon\\");
8127     ok(!lstrcmpA(prop, expected) || !lstrcmpA(prop, ""),
8128        "Expected %s or empty string, got %s\n", expected, prop);
8129
8130     size = MAX_PATH;
8131     r = MsiGetPropertyA(hpkg, "OLOROTITAN", prop, &size);
8132     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8133     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8134
8135     size = MAX_PATH;
8136     r = MsiGetPropertyA(hpkg, "PANTYDRACO", prop, &size);
8137     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8138     ok(!lstrcmpA(prop, ""), "Expected , got %s\n", prop);
8139
8140     MsiCloseHandle(hpkg);
8141     DeleteFileA("abelisaurus");
8142     DeleteFileA("bactrosaurus");
8143     DeleteFileA("camelotia");
8144     DeleteFileA("diclonius");
8145     DeleteFileA("echinodon");
8146     DeleteFileA("falcarius");
8147     DeleteFileA("gallimimus");
8148     DeleteFileA("hagryphus");
8149     RemoveDirectoryA("iguanodon");
8150     RemoveDirectoryA("jobaria");
8151     RemoveDirectoryA("kakuru");
8152     RemoveDirectoryA("labocania");
8153     RemoveDirectoryA("megaraptor");
8154     RemoveDirectoryA("neosodon");
8155     RemoveDirectoryA("olorotitan");
8156     RemoveDirectoryA("pantydraco");
8157     delete_component_path("{E3619EED-305A-418C-B9C7-F7D7377F0934}",
8158                           MSIINSTALLCONTEXT_MACHINE, NULL);
8159     delete_component_path("{D56B688D-542F-42Ef-90FD-B6DA76EE8119}",
8160                           MSIINSTALLCONTEXT_MACHINE, NULL);
8161     delete_component_path("{A19E16C5-C75D-4699-8111-C4338C40C3CB}",
8162                           MSIINSTALLCONTEXT_MACHINE, NULL);
8163     delete_component_path("{17762FA1-A7AE-4CC6-8827-62873C35361D}",
8164                           MSIINSTALLCONTEXT_MACHINE, NULL);
8165     delete_component_path("{8E0DA02E-F6A7-4A8F-B25D-6F564C492308}",
8166                           MSIINSTALLCONTEXT_MACHINE, NULL);
8167     delete_component_path("{243C22B1-8C51-4151-B9D1-1AE5265E079E}",
8168                           MSIINSTALLCONTEXT_MACHINE, NULL);
8169     delete_component_path("{8B1034B7-BD5E-41ac-B52C-0105D3DFD74D}",
8170                           MSIINSTALLCONTEXT_MACHINE, NULL);
8171     delete_component_path("{0B499649-197A-48EF-93D2-AF1C17ED6E90}",
8172                           MSIINSTALLCONTEXT_MACHINE, NULL);
8173     DeleteFileA(msifile);
8174 }
8175
8176 static void set_suminfo_prop(MSIHANDLE db, DWORD prop, DWORD val)
8177 {
8178     MSIHANDLE summary;
8179     UINT r;
8180
8181     r = MsiGetSummaryInformationA(db, NULL, 1, &summary);
8182     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8183
8184     r = MsiSummaryInfoSetPropertyA(summary, prop, VT_I4, val, NULL, NULL);
8185     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8186
8187     r = MsiSummaryInfoPersist(summary);
8188     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
8189
8190     MsiCloseHandle(summary);
8191 }
8192
8193 static void test_MsiGetSourcePath(void)
8194 {
8195     MSIHANDLE hdb, hpkg;
8196     CHAR path[MAX_PATH];
8197     CHAR cwd[MAX_PATH];
8198     CHAR subsrc[MAX_PATH];
8199     CHAR sub2[MAX_PATH];
8200     DWORD size;
8201     UINT r;
8202
8203     lstrcpyA(cwd, CURR_DIR);
8204     lstrcatA(cwd, "\\");
8205
8206     lstrcpyA(subsrc, cwd);
8207     lstrcatA(subsrc, "subsource");
8208     lstrcatA(subsrc, "\\");
8209
8210     lstrcpyA(sub2, subsrc);
8211     lstrcatA(sub2, "sub2");
8212     lstrcatA(sub2, "\\");
8213
8214     /* uncompressed source */
8215
8216     hdb = create_package_db();
8217     ok( hdb, "failed to create database\n");
8218
8219     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
8220
8221     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
8222     ok(r == S_OK, "failed\n");
8223
8224     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'subtarget:subsource'");
8225     ok(r == S_OK, "failed\n");
8226
8227     r = add_directory_entry(hdb, "'SubDir2', 'SubDir', 'sub2'");
8228     ok(r == S_OK, "failed\n");
8229
8230     r = MsiDatabaseCommit(hdb);
8231     ok(r == ERROR_SUCCESS , "Failed to commit database\n");
8232
8233     hpkg = package_from_db(hdb);
8234     ok(hpkg, "failed to create package\n");
8235
8236     MsiCloseHandle(hdb);
8237
8238     /* invalid database handle */
8239     size = MAX_PATH;
8240     lstrcpyA(path, "kiwi");
8241     r = MsiGetSourcePath(-1, "TARGETDIR", path, &size);
8242     ok(r == ERROR_INVALID_HANDLE,
8243        "Expected ERROR_INVALID_HANDLE, got %d\n", r);
8244     ok(!lstrcmpA(path, "kiwi"),
8245        "Expected path to be unchanged, got \"%s\"\n", path);
8246     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8247
8248     /* NULL szFolder */
8249     size = MAX_PATH;
8250     lstrcpyA(path, "kiwi");
8251     r = MsiGetSourcePath(hpkg, NULL, path, &size);
8252     ok(r == ERROR_INVALID_PARAMETER,
8253        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
8254     ok(!lstrcmpA(path, "kiwi"),
8255        "Expected path to be unchanged, got \"%s\"\n", path);
8256     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8257
8258     /* empty szFolder */
8259     size = MAX_PATH;
8260     lstrcpyA(path, "kiwi");
8261     r = MsiGetSourcePath(hpkg, "", path, &size);
8262     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8263     ok(!lstrcmpA(path, "kiwi"),
8264        "Expected path to be unchanged, got \"%s\"\n", path);
8265     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8266
8267     /* try TARGETDIR */
8268     size = MAX_PATH;
8269     lstrcpyA(path, "kiwi");
8270     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8271     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8272     ok(!lstrcmpA(path, "kiwi"),
8273        "Expected path to be unchanged, got \"%s\"\n", path);
8274     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8275
8276     /* try SourceDir */
8277     size = MAX_PATH;
8278     lstrcpyA(path, "kiwi");
8279     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8280     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8281     ok(!lstrcmpA(path, "kiwi"),
8282        "Expected path to be unchanged, got \"%s\"\n", path);
8283     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8284
8285     /* try SOURCEDIR */
8286     size = MAX_PATH;
8287     lstrcpyA(path, "kiwi");
8288     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8289     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8290     ok(!lstrcmpA(path, "kiwi"),
8291        "Expected path to be unchanged, got \"%s\"\n", path);
8292     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8293
8294     /* source path does not exist, but the property exists */
8295     size = MAX_PATH;
8296     lstrcpyA(path, "kiwi");
8297     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
8298     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8299     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
8300     ok(size == 0, "Expected 0, got %d\n", size);
8301
8302     /* try SubDir */
8303     size = MAX_PATH;
8304     lstrcpyA(path, "kiwi");
8305     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8306     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8307     ok(!lstrcmpA(path, "kiwi"),
8308        "Expected path to be unchanged, got \"%s\"\n", path);
8309     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8310
8311     /* try SubDir2 */
8312     size = MAX_PATH;
8313     lstrcpyA(path, "kiwi");
8314     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8315     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8316     ok(!lstrcmpA(path, "kiwi"),
8317        "Expected path to be unchanged, got \"%s\"\n", path);
8318     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8319
8320     r = MsiDoAction(hpkg, "CostInitialize");
8321     ok(r == ERROR_SUCCESS, "cost init failed\n");
8322
8323     /* try TARGETDIR after CostInitialize */
8324     size = MAX_PATH;
8325     lstrcpyA(path, "kiwi");
8326     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8327     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8328     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8329     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8330
8331     /* try SourceDir after CostInitialize */
8332     size = MAX_PATH;
8333     lstrcpyA(path, "kiwi");
8334     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8335     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8336     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8337     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8338
8339     /* try SOURCEDIR after CostInitialize */
8340     size = MAX_PATH;
8341     lstrcpyA(path, "kiwi");
8342     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8343     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8344     ok(!lstrcmpA(path, "kiwi"),
8345        "Expected path to be unchanged, got \"%s\"\n", path);
8346     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8347
8348     /* source path does not exist, but the property exists */
8349     size = MAX_PATH;
8350     lstrcpyA(path, "kiwi");
8351     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
8352     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8353     todo_wine
8354     {
8355         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8356         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8357     }
8358
8359     /* try SubDir after CostInitialize */
8360     size = MAX_PATH;
8361     lstrcpyA(path, "kiwi");
8362     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8363     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8364     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8365     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8366
8367     /* try SubDir2 after CostInitialize */
8368     size = MAX_PATH;
8369     lstrcpyA(path, "kiwi");
8370     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8371     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8372     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
8373     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
8374
8375     r = MsiDoAction(hpkg, "ResolveSource");
8376     ok(r == ERROR_SUCCESS, "file cost failed\n");
8377
8378     /* try TARGETDIR after ResolveSource */
8379     size = MAX_PATH;
8380     lstrcpyA(path, "kiwi");
8381     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8382     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8383     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8384     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8385
8386     /* try SourceDir after ResolveSource */
8387     size = MAX_PATH;
8388     lstrcpyA(path, "kiwi");
8389     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8390     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8391     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8392     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8393
8394     /* try SOURCEDIR after ResolveSource */
8395     size = MAX_PATH;
8396     lstrcpyA(path, "kiwi");
8397     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8398     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8399     ok(!lstrcmpA(path, "kiwi"),
8400        "Expected path to be unchanged, got \"%s\"\n", path);
8401     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8402
8403     /* source path does not exist, but the property exists */
8404     size = MAX_PATH;
8405     lstrcpyA(path, "kiwi");
8406     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
8407     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8408     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8409     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8410
8411     /* try SubDir after ResolveSource */
8412     size = MAX_PATH;
8413     lstrcpyA(path, "kiwi");
8414     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8415     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8416     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8417     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8418
8419     /* try SubDir2 after ResolveSource */
8420     size = MAX_PATH;
8421     lstrcpyA(path, "kiwi");
8422     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8423     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8424     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
8425     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
8426
8427     r = MsiDoAction(hpkg, "FileCost");
8428     ok(r == ERROR_SUCCESS, "file cost failed\n");
8429
8430     /* try TARGETDIR after FileCost */
8431     size = MAX_PATH;
8432     lstrcpyA(path, "kiwi");
8433     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8434     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8435     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8436     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8437
8438     /* try SourceDir after FileCost */
8439     size = MAX_PATH;
8440     lstrcpyA(path, "kiwi");
8441     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8442     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8443     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8444     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8445
8446     /* try SOURCEDIR after FileCost */
8447     size = MAX_PATH;
8448     lstrcpyA(path, "kiwi");
8449     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8450     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8451     ok(!lstrcmpA(path, "kiwi"),
8452        "Expected path to be unchanged, got \"%s\"\n", path);
8453     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8454
8455     /* try SubDir after FileCost */
8456     size = MAX_PATH;
8457     lstrcpyA(path, "kiwi");
8458     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8459     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8460     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8461     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8462
8463     /* try SubDir2 after FileCost */
8464     size = MAX_PATH;
8465     lstrcpyA(path, "kiwi");
8466     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8467     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8468     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
8469     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
8470
8471     r = MsiDoAction(hpkg, "CostFinalize");
8472     ok(r == ERROR_SUCCESS, "file cost failed\n");
8473
8474     /* try TARGETDIR after CostFinalize */
8475     size = MAX_PATH;
8476     lstrcpyA(path, "kiwi");
8477     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8478     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8479     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8480     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8481
8482     /* try SourceDir after CostFinalize */
8483     size = MAX_PATH;
8484     lstrcpyA(path, "kiwi");
8485     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8486     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8487     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8488     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8489
8490     /* try SOURCEDIR after CostFinalize */
8491     size = MAX_PATH;
8492     lstrcpyA(path, "kiwi");
8493     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8494     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8495     ok(!lstrcmpA(path, "kiwi"),
8496        "Expected path to be unchanged, got \"%s\"\n", path);
8497     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8498
8499     /* try SubDir after CostFinalize */
8500     size = MAX_PATH;
8501     lstrcpyA(path, "kiwi");
8502     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8503     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8504     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8505     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8506
8507     /* try SubDir2 after CostFinalize */
8508     size = MAX_PATH;
8509     lstrcpyA(path, "kiwi");
8510     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8511     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8512     ok(!lstrcmpA(path, sub2), "Expected \"%s\", got \"%s\"\n", sub2, path);
8513     ok(size == lstrlenA(sub2), "Expected %d, got %d\n", lstrlenA(sub2), size);
8514
8515     /* nonexistent directory */
8516     size = MAX_PATH;
8517     lstrcpyA(path, "kiwi");
8518     r = MsiGetSourcePath(hpkg, "IDontExist", path, &size);
8519     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
8520     ok(!lstrcmpA(path, "kiwi"),
8521        "Expected path to be unchanged, got \"%s\"\n", path);
8522     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
8523
8524     /* NULL szPathBuf */
8525     size = MAX_PATH;
8526     r = MsiGetSourcePath(hpkg, "SourceDir", NULL, &size);
8527     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8528     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8529
8530     /* NULL pcchPathBuf */
8531     lstrcpyA(path, "kiwi");
8532     r = MsiGetSourcePath(hpkg, "SourceDir", path, NULL);
8533     ok(r == ERROR_INVALID_PARAMETER,
8534        "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
8535     ok(!lstrcmpA(path, "kiwi"),
8536        "Expected path to be unchanged, got \"%s\"\n", path);
8537
8538     /* pcchPathBuf is 0 */
8539     size = 0;
8540     lstrcpyA(path, "kiwi");
8541     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8542     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
8543     ok(!lstrcmpA(path, "kiwi"),
8544        "Expected path to be unchanged, got \"%s\"\n", path);
8545     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8546
8547     /* pcchPathBuf does not have room for NULL terminator */
8548     size = lstrlenA(cwd);
8549     lstrcpyA(path, "kiwi");
8550     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8551     ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
8552     ok(!strncmp(path, cwd, lstrlenA(cwd) - 1),
8553        "Expected path with no backslash, got \"%s\"\n", path);
8554     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8555
8556     /* pcchPathBuf has room for NULL terminator */
8557     size = lstrlenA(cwd) + 1;
8558     lstrcpyA(path, "kiwi");
8559     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8560     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8561     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8562     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8563
8564     MsiCloseHandle(hpkg);
8565
8566     /* compressed source */
8567
8568     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
8569     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8570
8571     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeCompressed);
8572
8573     hpkg = package_from_db(hdb);
8574     ok(hpkg, "failed to create package\n");
8575
8576     r = MsiDoAction(hpkg, "CostInitialize");
8577     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8578     r = MsiDoAction(hpkg, "FileCost");
8579     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8580     r = MsiDoAction(hpkg, "CostFinalize");
8581     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8582
8583     /* try TARGETDIR after CostFinalize */
8584     size = MAX_PATH;
8585     lstrcpyA(path, "kiwi");
8586     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
8587     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8588     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8589     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8590
8591     /* try SourceDir after CostFinalize */
8592     size = MAX_PATH;
8593     lstrcpyA(path, "kiwi");
8594     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
8595     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8596     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8597     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8598
8599     /* try SOURCEDIR after CostFinalize */
8600     size = MAX_PATH;
8601     lstrcpyA(path, "kiwi");
8602     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
8603     todo_wine
8604     {
8605         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8606         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8607         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8608     }
8609
8610     /* try SubDir after CostFinalize */
8611     size = MAX_PATH;
8612     lstrcpyA(path, "kiwi");
8613     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8614     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8615     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8616     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8617
8618     /* try SubDir2 after CostFinalize */
8619     size = MAX_PATH;
8620     lstrcpyA(path, "kiwi");
8621     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8622     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8623     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
8624     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
8625
8626     MsiCloseHandle(hpkg);
8627     DeleteFile(msifile);
8628 }
8629
8630 static void test_shortlongsource(void)
8631 {
8632     MSIHANDLE hdb, hpkg;
8633     CHAR path[MAX_PATH];
8634     CHAR cwd[MAX_PATH];
8635     CHAR subsrc[MAX_PATH];
8636     DWORD size;
8637     UINT r;
8638
8639     lstrcpyA(cwd, CURR_DIR);
8640     lstrcatA(cwd, "\\");
8641
8642     lstrcpyA(subsrc, cwd);
8643     lstrcatA(subsrc, "long");
8644     lstrcatA(subsrc, "\\");
8645
8646     /* long file names */
8647
8648     hdb = create_package_db();
8649     ok( hdb, "failed to create database\n");
8650
8651     set_suminfo_prop(hdb, PID_WORDCOUNT, 0);
8652
8653     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
8654     ok(r == S_OK, "failed\n");
8655
8656     r = add_directory_entry(hdb, "'SubDir', 'TARGETDIR', 'short|long'");
8657     ok(r == S_OK, "failed\n");
8658
8659     /* CostInitialize:short */
8660     r = add_directory_entry(hdb, "'SubDir2', 'TARGETDIR', 'one|two'");
8661     ok(r == S_OK, "failed\n");
8662
8663     /* CostInitialize:long */
8664     r = add_directory_entry(hdb, "'SubDir3', 'TARGETDIR', 'three|four'");
8665     ok(r == S_OK, "failed\n");
8666
8667     /* FileCost:short */
8668     r = add_directory_entry(hdb, "'SubDir4', 'TARGETDIR', 'five|six'");
8669     ok(r == S_OK, "failed\n");
8670
8671     /* FileCost:long */
8672     r = add_directory_entry(hdb, "'SubDir5', 'TARGETDIR', 'seven|eight'");
8673     ok(r == S_OK, "failed\n");
8674
8675     /* CostFinalize:short */
8676     r = add_directory_entry(hdb, "'SubDir6', 'TARGETDIR', 'nine|ten'");
8677     ok(r == S_OK, "failed\n");
8678
8679     /* CostFinalize:long */
8680     r = add_directory_entry(hdb, "'SubDir7', 'TARGETDIR', 'eleven|twelve'");
8681     ok(r == S_OK, "failed\n");
8682
8683     MsiDatabaseCommit(hdb);
8684
8685     hpkg = package_from_db(hdb);
8686     ok(hpkg, "failed to create package\n");
8687
8688     MsiCloseHandle(hdb);
8689
8690     CreateDirectoryA("one", NULL);
8691     CreateDirectoryA("four", NULL);
8692
8693     r = MsiDoAction(hpkg, "CostInitialize");
8694     ok(r == ERROR_SUCCESS, "file cost failed\n");
8695
8696     CreateDirectory("five", NULL);
8697     CreateDirectory("eight", NULL);
8698
8699     r = MsiDoAction(hpkg, "FileCost");
8700     ok(r == ERROR_SUCCESS, "file cost failed\n");
8701
8702     CreateDirectory("nine", NULL);
8703     CreateDirectory("twelve", NULL);
8704
8705     r = MsiDoAction(hpkg, "CostFinalize");
8706     ok(r == ERROR_SUCCESS, "file cost failed\n");
8707
8708     /* neither short nor long source directories exist */
8709     size = MAX_PATH;
8710     lstrcpyA(path, "kiwi");
8711     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8712     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8713     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8714     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8715
8716     CreateDirectoryA("short", NULL);
8717
8718     /* short source directory exists */
8719     size = MAX_PATH;
8720     lstrcpyA(path, "kiwi");
8721     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8722     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8723     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8724     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8725
8726     CreateDirectoryA("long", NULL);
8727
8728     /* both short and long source directories exist */
8729     size = MAX_PATH;
8730     lstrcpyA(path, "kiwi");
8731     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8732     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8733     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8734     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8735
8736     lstrcpyA(subsrc, cwd);
8737     lstrcatA(subsrc, "two");
8738     lstrcatA(subsrc, "\\");
8739
8740     /* short dir exists before CostInitialize */
8741     size = MAX_PATH;
8742     lstrcpyA(path, "kiwi");
8743     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8744     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8745     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8746     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8747
8748     lstrcpyA(subsrc, cwd);
8749     lstrcatA(subsrc, "four");
8750     lstrcatA(subsrc, "\\");
8751
8752     /* long dir exists before CostInitialize */
8753     size = MAX_PATH;
8754     lstrcpyA(path, "kiwi");
8755     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
8756     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8757     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8758     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8759
8760     lstrcpyA(subsrc, cwd);
8761     lstrcatA(subsrc, "six");
8762     lstrcatA(subsrc, "\\");
8763
8764     /* short dir exists before FileCost */
8765     size = MAX_PATH;
8766     lstrcpyA(path, "kiwi");
8767     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
8768     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8769     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8770     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8771
8772     lstrcpyA(subsrc, cwd);
8773     lstrcatA(subsrc, "eight");
8774     lstrcatA(subsrc, "\\");
8775
8776     /* long dir exists before FileCost */
8777     size = MAX_PATH;
8778     lstrcpyA(path, "kiwi");
8779     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
8780     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8781     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8782     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8783
8784     lstrcpyA(subsrc, cwd);
8785     lstrcatA(subsrc, "ten");
8786     lstrcatA(subsrc, "\\");
8787
8788     /* short dir exists before CostFinalize */
8789     size = MAX_PATH;
8790     lstrcpyA(path, "kiwi");
8791     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
8792     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8793     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8794     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8795
8796     lstrcpyA(subsrc, cwd);
8797     lstrcatA(subsrc, "twelve");
8798     lstrcatA(subsrc, "\\");
8799
8800     /* long dir exists before CostFinalize */
8801     size = MAX_PATH;
8802     lstrcpyA(path, "kiwi");
8803     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
8804     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8805     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8806     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8807
8808     MsiCloseHandle(hpkg);
8809     RemoveDirectoryA("short");
8810     RemoveDirectoryA("long");
8811     RemoveDirectoryA("one");
8812     RemoveDirectoryA("four");
8813     RemoveDirectoryA("five");
8814     RemoveDirectoryA("eight");
8815     RemoveDirectoryA("nine");
8816     RemoveDirectoryA("twelve");
8817
8818     /* short file names */
8819
8820     r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb);
8821     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8822
8823     set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeSFN);
8824
8825     hpkg = package_from_db(hdb);
8826     ok(hpkg, "failed to create package\n");
8827
8828     MsiCloseHandle(hdb);
8829
8830     CreateDirectoryA("one", NULL);
8831     CreateDirectoryA("four", NULL);
8832
8833     r = MsiDoAction(hpkg, "CostInitialize");
8834     ok(r == ERROR_SUCCESS, "file cost failed\n");
8835
8836     CreateDirectory("five", NULL);
8837     CreateDirectory("eight", NULL);
8838
8839     r = MsiDoAction(hpkg, "FileCost");
8840     ok(r == ERROR_SUCCESS, "file cost failed\n");
8841
8842     CreateDirectory("nine", NULL);
8843     CreateDirectory("twelve", NULL);
8844
8845     r = MsiDoAction(hpkg, "CostFinalize");
8846     ok(r == ERROR_SUCCESS, "file cost failed\n");
8847
8848     lstrcpyA(subsrc, cwd);
8849     lstrcatA(subsrc, "short");
8850     lstrcatA(subsrc, "\\");
8851
8852     /* neither short nor long source directories exist */
8853     size = MAX_PATH;
8854     lstrcpyA(path, "kiwi");
8855     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8856     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8857     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8858     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8859
8860     CreateDirectoryA("short", NULL);
8861
8862     /* short source directory exists */
8863     size = MAX_PATH;
8864     lstrcpyA(path, "kiwi");
8865     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8866     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8867     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8868     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8869
8870     CreateDirectoryA("long", NULL);
8871
8872     /* both short and long source directories exist */
8873     size = MAX_PATH;
8874     lstrcpyA(path, "kiwi");
8875     r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
8876     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8877     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8878     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8879
8880     lstrcpyA(subsrc, cwd);
8881     lstrcatA(subsrc, "one");
8882     lstrcatA(subsrc, "\\");
8883
8884     /* short dir exists before CostInitialize */
8885     size = MAX_PATH;
8886     lstrcpyA(path, "kiwi");
8887     r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
8888     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8889     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8890     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8891
8892     lstrcpyA(subsrc, cwd);
8893     lstrcatA(subsrc, "three");
8894     lstrcatA(subsrc, "\\");
8895
8896     /* long dir exists before CostInitialize */
8897     size = MAX_PATH;
8898     lstrcpyA(path, "kiwi");
8899     r = MsiGetSourcePath(hpkg, "SubDir3", path, &size);
8900     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8901     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8902     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8903
8904     lstrcpyA(subsrc, cwd);
8905     lstrcatA(subsrc, "five");
8906     lstrcatA(subsrc, "\\");
8907
8908     /* short dir exists before FileCost */
8909     size = MAX_PATH;
8910     lstrcpyA(path, "kiwi");
8911     r = MsiGetSourcePath(hpkg, "SubDir4", path, &size);
8912     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8913     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8914     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8915
8916     lstrcpyA(subsrc, cwd);
8917     lstrcatA(subsrc, "seven");
8918     lstrcatA(subsrc, "\\");
8919
8920     /* long dir exists before FileCost */
8921     size = MAX_PATH;
8922     lstrcpyA(path, "kiwi");
8923     r = MsiGetSourcePath(hpkg, "SubDir5", path, &size);
8924     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8925     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8926     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8927
8928     lstrcpyA(subsrc, cwd);
8929     lstrcatA(subsrc, "nine");
8930     lstrcatA(subsrc, "\\");
8931
8932     /* short dir exists before CostFinalize */
8933     size = MAX_PATH;
8934     lstrcpyA(path, "kiwi");
8935     r = MsiGetSourcePath(hpkg, "SubDir6", path, &size);
8936     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8937     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8938     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8939
8940     lstrcpyA(subsrc, cwd);
8941     lstrcatA(subsrc, "eleven");
8942     lstrcatA(subsrc, "\\");
8943
8944     /* long dir exists before CostFinalize */
8945     size = MAX_PATH;
8946     lstrcpyA(path, "kiwi");
8947     r = MsiGetSourcePath(hpkg, "SubDir7", path, &size);
8948     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8949     ok(!lstrcmpA(path, subsrc), "Expected \"%s\", got \"%s\"\n", subsrc, path);
8950     ok(size == lstrlenA(subsrc), "Expected %d, got %d\n", lstrlenA(subsrc), size);
8951
8952     MsiCloseHandle(hpkg);
8953     RemoveDirectoryA("short");
8954     RemoveDirectoryA("long");
8955     RemoveDirectoryA("one");
8956     RemoveDirectoryA("four");
8957     RemoveDirectoryA("five");
8958     RemoveDirectoryA("eight");
8959     RemoveDirectoryA("nine");
8960     RemoveDirectoryA("twelve");
8961     DeleteFileA(msifile);
8962 }
8963
8964 static void test_sourcedir(void)
8965 {
8966     MSIHANDLE hdb, hpkg;
8967     CHAR package[10];
8968     CHAR path[MAX_PATH];
8969     CHAR cwd[MAX_PATH];
8970     CHAR subsrc[MAX_PATH];
8971     DWORD size;
8972     UINT r;
8973
8974     lstrcpyA(cwd, CURR_DIR);
8975     lstrcatA(cwd, "\\");
8976
8977     lstrcpyA(subsrc, cwd);
8978     lstrcatA(subsrc, "long");
8979     lstrcatA(subsrc, "\\");
8980
8981     hdb = create_package_db();
8982     ok( hdb, "failed to create database\n");
8983
8984     r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'");
8985     ok(r == S_OK, "failed\n");
8986
8987     sprintf(package, "#%li", hdb);
8988     r = MsiOpenPackage(package, &hpkg);
8989     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8990
8991     /* properties only */
8992
8993     /* SourceDir prop */
8994     size = MAX_PATH;
8995     lstrcpyA(path, "kiwi");
8996     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
8997     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
8998     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
8999     ok(size == 0, "Expected 0, got %d\n", size);
9000
9001     /* SOURCEDIR prop */
9002     size = MAX_PATH;
9003     lstrcpyA(path, "kiwi");
9004     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9005     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9006     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9007     ok(size == 0, "Expected 0, got %d\n", size);
9008
9009     r = MsiDoAction(hpkg, "CostInitialize");
9010     ok(r == ERROR_SUCCESS, "file cost failed\n");
9011
9012     /* SourceDir after CostInitialize */
9013     size = MAX_PATH;
9014     lstrcpyA(path, "kiwi");
9015     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9016     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9017     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9018     ok(size == 0, "Expected 0, got %d\n", size);
9019
9020     /* SOURCEDIR after CostInitialize */
9021     size = MAX_PATH;
9022     lstrcpyA(path, "kiwi");
9023     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9024     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9025     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9026     ok(size == 0, "Expected 0, got %d\n", size);
9027
9028     r = MsiDoAction(hpkg, "FileCost");
9029     ok(r == ERROR_SUCCESS, "file cost failed\n");
9030
9031     /* SourceDir after FileCost */
9032     size = MAX_PATH;
9033     lstrcpyA(path, "kiwi");
9034     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9035     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9036     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9037     ok(size == 0, "Expected 0, got %d\n", size);
9038
9039     /* SOURCEDIR after FileCost */
9040     size = MAX_PATH;
9041     lstrcpyA(path, "kiwi");
9042     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9043     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9044     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9045     ok(size == 0, "Expected 0, got %d\n", size);
9046
9047     r = MsiDoAction(hpkg, "CostFinalize");
9048     ok(r == ERROR_SUCCESS, "file cost failed\n");
9049
9050     /* SourceDir after CostFinalize */
9051     size = MAX_PATH;
9052     lstrcpyA(path, "kiwi");
9053     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9054     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9055     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9056     ok(size == 0, "Expected 0, got %d\n", size);
9057
9058     /* SOURCEDIR after CostFinalize */
9059     size = MAX_PATH;
9060     lstrcpyA(path, "kiwi");
9061     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9062     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9063     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9064     ok(size == 0, "Expected 0, got %d\n", size);
9065
9066     r = MsiDoAction(hpkg, "ResolveSource");
9067     ok(r == ERROR_SUCCESS, "file cost failed\n");
9068
9069     /* SourceDir after ResolveSource */
9070     size = MAX_PATH;
9071     lstrcpyA(path, "kiwi");
9072     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9073     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9074     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9075     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9076
9077     /* SOURCEDIR after ResolveSource */
9078     size = MAX_PATH;
9079     lstrcpyA(path, "kiwi");
9080     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9081     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9082     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9083     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9084
9085     /* random casing */
9086     size = MAX_PATH;
9087     lstrcpyA(path, "kiwi");
9088     r = MsiGetProperty(hpkg, "SoUrCeDiR", path, &size);
9089     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9090     ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9091     ok(size == 0, "Expected 0, got %d\n", size);
9092
9093     MsiCloseHandle(hpkg);
9094
9095     /* reset the package state */
9096     sprintf(package, "#%li", hdb);
9097     r = MsiOpenPackage(package, &hpkg);
9098     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9099
9100     /* test how MsiGetSourcePath affects the properties */
9101
9102     /* SourceDir prop */
9103     size = MAX_PATH;
9104     lstrcpyA(path, "kiwi");
9105     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9106     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9107     todo_wine
9108     {
9109         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9110         ok(size == 0, "Expected 0, got %d\n", size);
9111     }
9112
9113     size = MAX_PATH;
9114     lstrcpyA(path, "kiwi");
9115     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9116     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9117     ok(!lstrcmpA(path, "kiwi"),
9118        "Expected path to be unchanged, got \"%s\"\n", path);
9119     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9120
9121     /* SourceDir after MsiGetSourcePath */
9122     size = MAX_PATH;
9123     lstrcpyA(path, "kiwi");
9124     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9125     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9126     todo_wine
9127     {
9128         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9129         ok(size == 0, "Expected 0, got %d\n", size);
9130     }
9131
9132     /* SOURCEDIR prop */
9133     size = MAX_PATH;
9134     lstrcpyA(path, "kiwi");
9135     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9136     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9137     todo_wine
9138     {
9139         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9140         ok(size == 0, "Expected 0, got %d\n", size);
9141     }
9142
9143     size = MAX_PATH;
9144     lstrcpyA(path, "kiwi");
9145     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9146     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9147     ok(!lstrcmpA(path, "kiwi"),
9148        "Expected path to be unchanged, got \"%s\"\n", path);
9149     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9150
9151     /* SOURCEDIR prop after MsiGetSourcePath */
9152     size = MAX_PATH;
9153     lstrcpyA(path, "kiwi");
9154     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9155     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9156     todo_wine
9157     {
9158         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9159         ok(size == 0, "Expected 0, got %d\n", size);
9160     }
9161
9162     r = MsiDoAction(hpkg, "CostInitialize");
9163     ok(r == ERROR_SUCCESS, "file cost failed\n");
9164
9165     /* SourceDir after CostInitialize */
9166     size = MAX_PATH;
9167     lstrcpyA(path, "kiwi");
9168     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9169     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9170     todo_wine
9171     {
9172         ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
9173         ok(size == 0, "Expected 0, got %d\n", size);
9174     }
9175
9176     size = MAX_PATH;
9177     lstrcpyA(path, "kiwi");
9178     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
9179     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9180     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9181     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9182
9183     /* SourceDir after MsiGetSourcePath */
9184     size = MAX_PATH;
9185     lstrcpyA(path, "kiwi");
9186     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9187     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9188     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9189     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9190
9191     /* SOURCEDIR after CostInitialize */
9192     size = MAX_PATH;
9193     lstrcpyA(path, "kiwi");
9194     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9195     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9196     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9197     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9198
9199     /* SOURCEDIR source path still does not exist */
9200     size = MAX_PATH;
9201     lstrcpyA(path, "kiwi");
9202     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9203     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9204     ok(!lstrcmpA(path, "kiwi"),
9205        "Expected path to be unchanged, got \"%s\"\n", path);
9206     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9207
9208     r = MsiDoAction(hpkg, "FileCost");
9209     ok(r == ERROR_SUCCESS, "file cost failed\n");
9210
9211     /* SourceDir after FileCost */
9212     size = MAX_PATH;
9213     lstrcpyA(path, "kiwi");
9214     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9215     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9216     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9217     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9218
9219     /* SOURCEDIR after FileCost */
9220     size = MAX_PATH;
9221     lstrcpyA(path, "kiwi");
9222     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9223     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9224     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9225     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9226
9227     /* SOURCEDIR source path still does not exist */
9228     size = MAX_PATH;
9229     lstrcpyA(path, "kiwi");
9230     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9231     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9232     ok(!lstrcmpA(path, "kiwi"),
9233        "Expected path to be unchanged, got \"%s\"\n", path);
9234     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9235
9236     r = MsiDoAction(hpkg, "CostFinalize");
9237     ok(r == ERROR_SUCCESS, "file cost failed\n");
9238
9239     /* SourceDir after CostFinalize */
9240     size = MAX_PATH;
9241     lstrcpyA(path, "kiwi");
9242     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9243     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9244     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9245     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9246
9247     /* SOURCEDIR after CostFinalize */
9248     size = MAX_PATH;
9249     lstrcpyA(path, "kiwi");
9250     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9251     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9252     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9253     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9254
9255     /* SOURCEDIR source path still does not exist */
9256     size = MAX_PATH;
9257     lstrcpyA(path, "kiwi");
9258     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9259     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9260     ok(!lstrcmpA(path, "kiwi"),
9261        "Expected path to be unchanged, got \"%s\"\n", path);
9262     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9263
9264     r = MsiDoAction(hpkg, "ResolveSource");
9265     ok(r == ERROR_SUCCESS, "file cost failed\n");
9266
9267     /* SourceDir after ResolveSource */
9268     size = MAX_PATH;
9269     lstrcpyA(path, "kiwi");
9270     r = MsiGetProperty(hpkg, "SourceDir", path, &size);
9271     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9272     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9273     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9274
9275     /* SOURCEDIR after ResolveSource */
9276     size = MAX_PATH;
9277     lstrcpyA(path, "kiwi");
9278     r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
9279     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9280     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
9281     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
9282
9283     /* SOURCEDIR source path still does not exist */
9284     size = MAX_PATH;
9285     lstrcpyA(path, "kiwi");
9286     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
9287     ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
9288     ok(!lstrcmpA(path, "kiwi"),
9289        "Expected path to be unchanged, got \"%s\"\n", path);
9290     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
9291
9292     MsiCloseHandle(hdb);
9293     MsiCloseHandle(hpkg);
9294     DeleteFileA(msifile);
9295 }
9296
9297 struct access_res
9298 {
9299     BOOL gothandle;
9300     DWORD lasterr;
9301     BOOL ignore;
9302 };
9303
9304 static const struct access_res create[16] =
9305 {
9306     { TRUE, ERROR_SUCCESS, TRUE },
9307     { TRUE, ERROR_SUCCESS, TRUE },
9308     { TRUE, ERROR_SUCCESS, FALSE },
9309     { TRUE, ERROR_SUCCESS, FALSE },
9310     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9311     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9312     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9313     { TRUE, ERROR_SUCCESS, FALSE },
9314     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9315     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9316     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9317     { TRUE, ERROR_SUCCESS, TRUE },
9318     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9319     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9320     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9321     { TRUE, ERROR_SUCCESS, TRUE }
9322 };
9323
9324 static const struct access_res create_commit[16] =
9325 {
9326     { TRUE, ERROR_SUCCESS, TRUE },
9327     { TRUE, ERROR_SUCCESS, TRUE },
9328     { TRUE, ERROR_SUCCESS, FALSE },
9329     { TRUE, ERROR_SUCCESS, FALSE },
9330     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9331     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9332     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9333     { TRUE, ERROR_SUCCESS, FALSE },
9334     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9335     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9336     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9337     { TRUE, ERROR_SUCCESS, TRUE },
9338     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9339     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9340     { FALSE, ERROR_SHARING_VIOLATION, FALSE },
9341     { TRUE, ERROR_SUCCESS, TRUE }
9342 };
9343
9344 static const struct access_res create_close[16] =
9345 {
9346     { TRUE, ERROR_SUCCESS, FALSE },
9347     { TRUE, ERROR_SUCCESS, FALSE },
9348     { TRUE, ERROR_SUCCESS, FALSE },
9349     { TRUE, ERROR_SUCCESS, FALSE },
9350     { TRUE, ERROR_SUCCESS, FALSE },
9351     { TRUE, ERROR_SUCCESS, FALSE },
9352     { TRUE, ERROR_SUCCESS, FALSE },
9353     { TRUE, ERROR_SUCCESS, FALSE },
9354     { TRUE, ERROR_SUCCESS, FALSE },
9355     { TRUE, ERROR_SUCCESS, FALSE },
9356     { TRUE, ERROR_SUCCESS, FALSE },
9357     { TRUE, ERROR_SUCCESS, FALSE },
9358     { TRUE, ERROR_SUCCESS, FALSE },
9359     { TRUE, ERROR_SUCCESS, FALSE },
9360     { TRUE, ERROR_SUCCESS, FALSE },
9361     { TRUE, ERROR_SUCCESS }
9362 };
9363
9364 static void _test_file_access(LPCSTR file, const struct access_res *ares, DWORD line)
9365 {
9366     DWORD access = 0, share = 0;
9367     DWORD lasterr;
9368     HANDLE hfile;
9369     int i, j, idx = 0;
9370
9371     for (i = 0; i < 4; i++)
9372     {
9373         if (i == 0) access = 0;
9374         if (i == 1) access = GENERIC_READ;
9375         if (i == 2) access = GENERIC_WRITE;
9376         if (i == 3) access = GENERIC_READ | GENERIC_WRITE;
9377
9378         for (j = 0; j < 4; j++)
9379         {
9380             if (ares[idx].ignore)
9381                 continue;
9382
9383             if (j == 0) share = 0;
9384             if (j == 1) share = FILE_SHARE_READ;
9385             if (j == 2) share = FILE_SHARE_WRITE;
9386             if (j == 3) share = FILE_SHARE_READ | FILE_SHARE_WRITE;
9387
9388             SetLastError(0xdeadbeef);
9389             hfile = CreateFileA(file, access, share, NULL, OPEN_EXISTING,
9390                                 FILE_ATTRIBUTE_NORMAL, 0);
9391             lasterr = GetLastError();
9392
9393             ok((hfile != INVALID_HANDLE_VALUE) == ares[idx].gothandle,
9394                "(%d, handle, %d): Expected %d, got %d\n",
9395                line, idx, ares[idx].gothandle,
9396                (hfile != INVALID_HANDLE_VALUE));
9397
9398             ok(lasterr == ares[idx].lasterr ||
9399                lasterr == 0xdeadbeef, /* win9x */
9400                "(%d, lasterr, %d): Expected %d, got %d\n",
9401                line, idx, ares[idx].lasterr, lasterr);
9402
9403             CloseHandle(hfile);
9404             idx++;
9405         }
9406     }
9407 }
9408
9409 #define test_file_access(file, ares) _test_file_access(file, ares, __LINE__)
9410
9411 static void test_access(void)
9412 {
9413     MSIHANDLE hdb;
9414     UINT r;
9415
9416     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATE, &hdb);
9417     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9418
9419     test_file_access(msifile, create);
9420
9421     r = MsiDatabaseCommit(hdb);
9422     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9423
9424     test_file_access(msifile, create_commit);
9425
9426     MsiCloseHandle(hdb);
9427
9428     test_file_access(msifile, create_close);
9429
9430     DeleteFileA(msifile);
9431
9432     r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATEDIRECT, &hdb);
9433     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9434
9435     test_file_access(msifile, create);
9436
9437     r = MsiDatabaseCommit(hdb);
9438     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9439
9440     test_file_access(msifile, create_commit);
9441
9442     MsiCloseHandle(hdb);
9443
9444     test_file_access(msifile, create_close);
9445
9446     DeleteFileA(msifile);
9447 }
9448
9449 static void test_emptypackage(void)
9450 {
9451     MSIHANDLE hpkg, hdb, hsuminfo;
9452     MSIHANDLE hview, hrec;
9453     MSICONDITION condition;
9454     CHAR buffer[MAX_PATH];
9455     DWORD size;
9456     UINT r;
9457
9458     r = MsiOpenPackageA("", &hpkg);
9459     todo_wine
9460     {
9461         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9462     }
9463
9464     hdb = MsiGetActiveDatabase(hpkg);
9465     todo_wine
9466     {
9467         ok(hdb != 0, "Expected a valid database handle\n");
9468     }
9469
9470     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Tables`", &hview);
9471     todo_wine
9472     {
9473         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9474     }
9475     r = MsiViewExecute(hview, 0);
9476     todo_wine
9477     {
9478         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9479     }
9480
9481     r = MsiViewFetch(hview, &hrec);
9482     todo_wine
9483     {
9484         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9485     }
9486
9487     size = MAX_PATH;
9488     r = MsiRecordGetString(hrec, 1, buffer, &size);
9489     todo_wine
9490     {
9491         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9492         ok(!lstrcmpA(buffer, "_Property"),
9493            "Expected \"_Property\", got \"%s\"\n", buffer);
9494     }
9495
9496     MsiCloseHandle(hrec);
9497
9498     r = MsiViewFetch(hview, &hrec);
9499     todo_wine
9500     {
9501         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9502     }
9503
9504     size = MAX_PATH;
9505     r = MsiRecordGetString(hrec, 1, buffer, &size);
9506     todo_wine
9507     {
9508         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9509         ok(!lstrcmpA(buffer, "#_FolderCache"),
9510            "Expected \"_Property\", got \"%s\"\n", buffer);
9511     }
9512
9513     MsiCloseHandle(hrec);
9514     MsiViewClose(hview);
9515     MsiCloseHandle(hview);
9516
9517     condition = MsiDatabaseIsTablePersistentA(hdb, "_Property");
9518     todo_wine
9519     {
9520         ok(condition == MSICONDITION_FALSE,
9521            "Expected MSICONDITION_FALSE, got %d\n", condition);
9522     }
9523
9524     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview);
9525     todo_wine
9526     {
9527         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9528     }
9529     r = MsiViewExecute(hview, 0);
9530     todo_wine
9531     {
9532         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9533     }
9534
9535     /* _Property table is not empty */
9536     r = MsiViewFetch(hview, &hrec);
9537     todo_wine
9538     {
9539         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9540     }
9541
9542     MsiCloseHandle(hrec);
9543     MsiViewClose(hview);
9544     MsiCloseHandle(hview);
9545
9546     condition = MsiDatabaseIsTablePersistentA(hdb, "#_FolderCache");
9547     todo_wine
9548     {
9549         ok(condition == MSICONDITION_FALSE,
9550            "Expected MSICONDITION_FALSE, got %d\n", condition);
9551     }
9552
9553     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `#_FolderCache`", &hview);
9554     todo_wine
9555     {
9556         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9557     }
9558     r = MsiViewExecute(hview, 0);
9559     todo_wine
9560     {
9561         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9562     }
9563
9564     /* #_FolderCache is not empty */
9565     r = MsiViewFetch(hview, &hrec);
9566     todo_wine
9567     {
9568         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9569     }
9570
9571     MsiCloseHandle(hrec);
9572     MsiViewClose(hview);
9573     MsiCloseHandle(hview);
9574
9575     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Streams`", &hview);
9576     todo_wine
9577     {
9578         ok(r == ERROR_BAD_QUERY_SYNTAX,
9579            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
9580     }
9581
9582     r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Storages`", &hview);
9583     todo_wine
9584     {
9585         ok(r == ERROR_BAD_QUERY_SYNTAX,
9586            "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
9587     }
9588
9589     r = MsiGetSummaryInformationA(hdb, NULL, 0, &hsuminfo);
9590     todo_wine
9591     {
9592         ok(r == ERROR_INSTALL_PACKAGE_INVALID,
9593            "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r);
9594     }
9595
9596     MsiCloseHandle(hsuminfo);
9597
9598     r = MsiDatabaseCommit(hdb);
9599     todo_wine
9600     {
9601         ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
9602     }
9603
9604     MsiCloseHandle(hdb);
9605     MsiCloseHandle(hpkg);
9606 }
9607
9608 START_TEST(package)
9609 {
9610     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
9611
9612     test_createpackage();
9613     test_doaction();
9614     test_gettargetpath_bad();
9615     test_settargetpath();
9616     test_props();
9617     test_property_table();
9618     test_condition();
9619     test_msipackage();
9620     test_formatrecord2();
9621     test_states();
9622     test_getproperty();
9623     test_removefiles();
9624     test_appsearch();
9625     test_appsearch_complocator();
9626     test_appsearch_reglocator();
9627     test_appsearch_inilocator();
9628     test_appsearch_drlocator();
9629     test_featureparents();
9630     test_installprops();
9631     test_launchconditions();
9632     test_ccpsearch();
9633     test_complocator();
9634     test_MsiGetSourcePath();
9635     test_shortlongsource();
9636     test_sourcedir();
9637     test_access();
9638     test_emptypackage();
9639 }