wined3d: Remove COM from the shader implementation.
[wine] / dlls / msi / msipriv.h
1 /*
2  * Implementation of the Microsoft Installer (msi.dll)
3  *
4  * Copyright 2002-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 #ifndef __WINE_MSI_PRIVATE__
23 #define __WINE_MSI_PRIVATE__
24
25 #include <stdarg.h>
26
27 #include "windef.h"
28 #include "winbase.h"
29 #include "fdi.h"
30 #include "msi.h"
31 #include "msiquery.h"
32 #include "msidefs.h"
33 #include "objbase.h"
34 #include "objidl.h"
35 #include "fusion.h"
36 #include "winnls.h"
37 #include "winver.h"
38 #include "wine/list.h"
39 #include "wine/debug.h"
40
41 static const BOOL is_64bit = sizeof(void *) > sizeof(int);
42
43 #define MSI_DATASIZEMASK 0x00ff
44 #define MSITYPE_VALID    0x0100
45 #define MSITYPE_LOCALIZABLE 0x200
46 #define MSITYPE_STRING   0x0800
47 #define MSITYPE_NULLABLE 0x1000
48 #define MSITYPE_KEY      0x2000
49 #define MSITYPE_TEMPORARY 0x4000
50
51 #define MAX_STREAM_NAME_LEN     62
52 #define LONG_STR_BYTES  3
53
54 /* Install UI level mask for AND operation to exclude flags */
55 #define INSTALLUILEVEL_MASK             0x0007
56
57 #define MSITYPE_IS_BINARY(type) (((type) & ~MSITYPE_NULLABLE) == (MSITYPE_STRING|MSITYPE_VALID))
58
59 struct tagMSITABLE;
60 typedef struct tagMSITABLE MSITABLE;
61
62 struct string_table;
63 typedef struct string_table string_table;
64
65 struct tagMSIOBJECTHDR;
66 typedef struct tagMSIOBJECTHDR MSIOBJECTHDR;
67
68 typedef VOID (*msihandledestructor)( MSIOBJECTHDR * );
69
70 struct tagMSIOBJECTHDR
71 {
72     UINT magic;
73     UINT type;
74     LONG refcount;
75     msihandledestructor destructor;
76 };
77
78 #define MSI_INITIAL_MEDIA_TRANSFORM_OFFSET 10000
79
80 typedef struct tagMSIDATABASE
81 {
82     MSIOBJECTHDR hdr;
83     IStorage *storage;
84     string_table *strings;
85     UINT bytes_per_strref;
86     LPWSTR path;
87     LPWSTR deletefile;
88     LPWSTR localfile;
89     LPCWSTR mode;
90     UINT media_transform_offset;
91     struct list tables;
92     struct list transforms;
93     struct list streams;
94 } MSIDATABASE;
95
96 typedef struct tagMSIVIEW MSIVIEW;
97
98 typedef struct tagMSIQUERY
99 {
100     MSIOBJECTHDR hdr;
101     MSIVIEW *view;
102     UINT row;
103     MSIDATABASE *db;
104     struct list mem;
105 } MSIQUERY;
106
107 /* maybe we can use a Variant instead of doing it ourselves? */
108 typedef struct tagMSIFIELD
109 {
110     UINT type;
111     union
112     {
113         INT iVal;
114         INT_PTR pVal;
115         LPWSTR szwVal;
116         IStream *stream;
117     } u;
118 } MSIFIELD;
119
120 typedef struct tagMSIRECORD
121 {
122     MSIOBJECTHDR hdr;
123     UINT count;       /* as passed to MsiCreateRecord */
124     MSIFIELD fields[1]; /* nb. array size is count+1 */
125 } MSIRECORD;
126
127 typedef struct tagMSISOURCELISTINFO
128 {
129     struct list entry;
130     DWORD context;
131     DWORD options;
132     LPCWSTR property;
133     LPWSTR value;
134 } MSISOURCELISTINFO;
135
136 typedef struct tagMSIMEDIADISK
137 {
138     struct list entry;
139     DWORD context;
140     DWORD options;
141     DWORD disk_id;
142     LPWSTR volume_label;
143     LPWSTR disk_prompt;
144 } MSIMEDIADISK;
145
146 typedef struct tagMSIMEDIAINFO
147 {
148     UINT disk_id;
149     UINT type;
150     UINT last_sequence;
151     LPWSTR disk_prompt;
152     LPWSTR cabinet;
153     LPWSTR first_volume;
154     LPWSTR volume_label;
155     BOOL is_continuous;
156     BOOL is_extracted;
157     WCHAR sourcedir[MAX_PATH];
158 } MSIMEDIAINFO;
159
160 typedef struct tagMSIPATCHINFO
161 {
162     struct list entry;
163     LPWSTR patchcode;
164     LPWSTR transforms;
165     LPWSTR localfile;
166     MSIPATCHSTATE state;
167 } MSIPATCHINFO;
168
169 typedef struct tagMSIBINARY
170 {
171     struct list entry;
172     WCHAR *source;
173     WCHAR *tmpfile;
174     HMODULE module;
175 } MSIBINARY;
176
177 typedef struct _column_info
178 {
179     LPCWSTR table;
180     LPCWSTR column;
181     INT   type;
182     BOOL   temporary;
183     struct expr *val;
184     struct _column_info *next;
185 } column_info;
186
187 typedef const struct tagMSICOLUMNHASHENTRY *MSIITERHANDLE;
188
189 typedef struct tagMSIVIEWOPS
190 {
191     /*
192      * fetch_int - reads one integer from {row,col} in the table
193      *
194      *  This function should be called after the execute method.
195      *  Data returned by the function should not change until
196      *   close or delete is called.
197      *  To get a string value, query the database's string table with
198      *   the integer value returned from this function.
199      */
200     UINT (*fetch_int)( struct tagMSIVIEW *view, UINT row, UINT col, UINT *val );
201
202     /*
203      * fetch_stream - gets a stream from {row,col} in the table
204      *
205      *  This function is similar to fetch_int, except fetches a
206      *    stream instead of an integer.
207      */
208     UINT (*fetch_stream)( struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm );
209
210     /*
211      * get_row - gets values from a row
212      *
213      */
214     UINT (*get_row)( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec );
215
216     /*
217      * set_row - sets values in a row as specified by mask
218      *
219      *  Similar semantics to fetch_int
220      */
221     UINT (*set_row)( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask );
222
223     /*
224      * Inserts a new row into the database from the records contents
225      */
226     UINT (*insert_row)( struct tagMSIVIEW *view, MSIRECORD *record, UINT row, BOOL temporary );
227
228     /*
229      * Deletes a row from the database
230      */
231     UINT (*delete_row)( struct tagMSIVIEW *view, UINT row );
232
233     /*
234      * execute - loads the underlying data into memory so it can be read
235      */
236     UINT (*execute)( struct tagMSIVIEW *view, MSIRECORD *record );
237
238     /*
239      * close - clears the data read by execute from memory
240      */
241     UINT (*close)( struct tagMSIVIEW *view );
242
243     /*
244      * get_dimensions - returns the number of rows or columns in a table.
245      *
246      *  The number of rows can only be queried after the execute method
247      *   is called. The number of columns can be queried at any time.
248      */
249     UINT (*get_dimensions)( struct tagMSIVIEW *view, UINT *rows, UINT *cols );
250
251     /*
252      * get_column_info - returns the name and type of a specific column
253      *
254      *  The name and tablename is HeapAlloc'ed by this function and should be
255      *  freed by the caller.
256      *  The column information can be queried at any time.
257      */
258     UINT (*get_column_info)( struct tagMSIVIEW *view, UINT n, LPWSTR *name, UINT *type, BOOL *temporary, LPWSTR *tableName);
259
260     /*
261      * modify - not yet implemented properly
262      */
263     UINT (*modify)( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *record, UINT row );
264
265     /*
266      * delete - destroys the structure completely
267      */
268     UINT (*delete)( struct tagMSIVIEW * );
269
270     /*
271      * find_matching_rows - iterates through rows that match a value
272      *
273      * If the column type is a string then a string ID should be passed in.
274      *  If the value to be looked up is an integer then no transformation of
275      *  the input value is required, except if the column is a string, in which
276      *  case a string ID should be passed in.
277      * The handle is an input/output parameter that keeps track of the current
278      *  position in the iteration. It must be initialised to zero before the
279      *  first call and continued to be passed in to subsequent calls.
280      */
281     UINT (*find_matching_rows)( struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle );
282
283     /*
284      * add_ref - increases the reference count of the table
285      */
286     UINT (*add_ref)( struct tagMSIVIEW *view );
287
288     /*
289      * release - decreases the reference count of the table
290      */
291     UINT (*release)( struct tagMSIVIEW *view );
292
293     /*
294      * add_column - adds a column to the table
295      */
296     UINT (*add_column)( struct tagMSIVIEW *view, LPCWSTR table, UINT number, LPCWSTR column, UINT type, BOOL hold );
297
298     /*
299      * remove_column - removes the column represented by table name and column number from the table
300      */
301     UINT (*remove_column)( struct tagMSIVIEW *view, LPCWSTR table, UINT number );
302
303     /*
304      * sort - orders the table by columns
305      */
306     UINT (*sort)( struct tagMSIVIEW *view, column_info *columns );
307
308     /*
309      * drop - drops the table from the database
310      */
311     UINT (*drop)( struct tagMSIVIEW *view );
312 } MSIVIEWOPS;
313
314 struct tagMSIVIEW
315 {
316     MSIOBJECTHDR hdr;
317     const MSIVIEWOPS *ops;
318 };
319
320 struct msi_dialog_tag;
321 typedef struct msi_dialog_tag msi_dialog;
322
323 enum platform
324 {
325     PLATFORM_INTEL,
326     PLATFORM_INTEL64,
327     PLATFORM_X64
328 };
329
330 enum clr_version
331 {
332     CLR_VERSION_V11,
333     CLR_VERSION_V20,
334     CLR_VERSION_MAX
335 };
336
337 typedef struct tagMSIPACKAGE
338 {
339     MSIOBJECTHDR hdr;
340     MSIDATABASE *db;
341     INT version;
342     enum platform platform;
343     UINT num_langids;
344     LANGID *langids;
345     struct list patches;
346     struct list components;
347     struct list features;
348     struct list files;
349     struct list filepatches;
350     struct list tempfiles;
351     struct list folders;
352     struct list binaries;
353     LPWSTR ActionFormat;
354     LPWSTR LastAction;
355     HANDLE log_file;
356     IAssemblyCache *cache_net[CLR_VERSION_MAX];
357     IAssemblyCache *cache_sxs;
358
359     struct list classes;
360     struct list extensions;
361     struct list progids;
362     struct list mimes;
363     struct list appids;
364
365     struct tagMSISCRIPT *script;
366
367     struct list RunningActions;
368
369     LPWSTR BaseURL;
370     LPWSTR PackagePath;
371     LPWSTR ProductCode;
372
373     UINT CurrentInstallState;
374     msi_dialog *dialog;
375     LPWSTR next_dialog;
376     float center_x;
377     float center_y;
378
379     UINT WordCount;
380     UINT Context;
381
382     struct list subscriptions;
383
384     struct list sourcelist_info;
385     struct list sourcelist_media;
386
387     unsigned char scheduled_action_running : 1;
388     unsigned char commit_action_running : 1;
389     unsigned char rollback_action_running : 1;
390     unsigned char need_reboot : 1;
391 } MSIPACKAGE;
392
393 typedef struct tagMSIPREVIEW
394 {
395     MSIOBJECTHDR hdr;
396     MSIPACKAGE *package;
397     msi_dialog *dialog;
398 } MSIPREVIEW;
399
400 #define MSI_MAX_PROPS 20
401
402 typedef struct tagMSISUMMARYINFO
403 {
404     MSIOBJECTHDR hdr;
405     IStorage *storage;
406     DWORD update_count;
407     PROPVARIANT property[MSI_MAX_PROPS];
408 } MSISUMMARYINFO;
409
410 typedef struct tagMSIFEATURE
411 {
412     struct list entry;
413     LPWSTR Feature;
414     LPWSTR Feature_Parent;
415     LPWSTR Title;
416     LPWSTR Description;
417     INT Display;
418     INT Level;
419     LPWSTR Directory;
420     INT Attributes;
421     INSTALLSTATE Installed;
422     INSTALLSTATE ActionRequest;
423     INSTALLSTATE Action;
424     struct list Children;
425     struct list Components;
426 } MSIFEATURE;
427
428 typedef struct tagMSIASSEMBLY
429 {
430     LPWSTR feature;
431     LPWSTR manifest;
432     LPWSTR application;
433     DWORD attributes;
434     LPWSTR display_name;
435     LPWSTR tempdir;
436     BOOL installed;
437     BOOL clr_version[CLR_VERSION_MAX];
438 } MSIASSEMBLY;
439
440 typedef struct tagMSICOMPONENT
441 {
442     struct list entry;
443     LPWSTR Component;
444     LPWSTR ComponentId;
445     LPWSTR Directory;
446     INT Attributes;
447     LPWSTR Condition;
448     LPWSTR KeyPath;
449     INSTALLSTATE Installed;
450     INSTALLSTATE ActionRequest;
451     INSTALLSTATE Action;
452     BOOL ForceLocalState;
453     BOOL Enabled;
454     INT  Cost;
455     INT  RefCount;
456     LPWSTR FullKeypath;
457     LPWSTR AdvertiseString;
458     MSIASSEMBLY *assembly;
459
460     unsigned int anyAbsent:1;
461     unsigned int hasAdvertiseFeature:1;
462     unsigned int hasLocalFeature:1;
463     unsigned int hasSourceFeature:1;
464 } MSICOMPONENT;
465
466 typedef struct tagComponentList
467 {
468     struct list entry;
469     MSICOMPONENT *component;
470 } ComponentList;
471
472 typedef struct tagFeatureList
473 {
474     struct list entry;
475     MSIFEATURE *feature;
476 } FeatureList;
477
478 typedef struct tagMSIFOLDER
479 {
480     struct list entry;
481     LPWSTR Directory;
482     LPWSTR Parent;
483     LPWSTR TargetDefault;
484     LPWSTR SourceLongPath;
485     LPWSTR SourceShortPath;
486
487     LPWSTR ResolvedTarget;
488     LPWSTR ResolvedSource;
489     LPWSTR Property;   /* initially set property */
490     INT   State;
491         /* 0 = uninitialized */
492         /* 1 = existing */
493         /* 2 = created remove if empty */
494         /* 3 = created persist if empty */
495     INT   Cost;
496     INT   Space;
497 } MSIFOLDER;
498
499 typedef enum _msi_file_state {
500     msifs_invalid,
501     msifs_missing,
502     msifs_overwrite,
503     msifs_present,
504     msifs_installed,
505     msifs_skipped,
506     msifs_hashmatch
507 } msi_file_state;
508
509 typedef struct tagMSIFILE
510 {
511     struct list entry;
512     LPWSTR File;
513     MSICOMPONENT *Component;
514     LPWSTR FileName;
515     LPWSTR ShortName;
516     LPWSTR LongName;
517     INT FileSize;
518     LPWSTR Version;
519     LPWSTR Language;
520     INT Attributes;
521     INT Sequence;
522     msi_file_state state;
523     LPWSTR  TargetPath;
524     BOOL IsCompressed;
525     MSIFILEHASHINFO hash;
526     UINT disk_id;
527 } MSIFILE;
528
529 typedef struct tagMSITEMPFILE
530 {
531     struct list entry;
532     LPWSTR Path;
533 } MSITEMPFILE;
534
535 typedef struct tagMSIFILEPATCH
536 {
537     struct list entry;
538     MSIFILE *File;
539     INT Sequence;
540     INT PatchSize;
541     INT Attributes;
542     BOOL IsApplied;
543 } MSIFILEPATCH;
544
545 typedef struct tagMSIAPPID
546 {
547     struct list entry;
548     LPWSTR AppID; /* Primary key */
549     LPWSTR RemoteServerName;
550     LPWSTR LocalServer;
551     LPWSTR ServiceParameters;
552     LPWSTR DllSurrogate;
553     BOOL ActivateAtStorage;
554     BOOL RunAsInteractiveUser;
555 } MSIAPPID;
556
557 typedef struct tagMSIPROGID MSIPROGID;
558
559 typedef struct tagMSICLASS
560 {
561     struct list entry;
562     LPWSTR clsid;     /* Primary Key */
563     LPWSTR Context;   /* Primary Key */
564     MSICOMPONENT *Component;
565     MSIPROGID *ProgID;
566     LPWSTR ProgIDText;
567     LPWSTR Description;
568     MSIAPPID *AppID;
569     LPWSTR FileTypeMask;
570     LPWSTR IconPath;
571     LPWSTR DefInprocHandler;
572     LPWSTR DefInprocHandler32;
573     LPWSTR Argument;
574     MSIFEATURE *Feature;
575     INT Attributes;
576     /* not in the table, set during installation */
577     BOOL Installed;
578 } MSICLASS;
579
580 typedef struct tagMSIMIME MSIMIME;
581
582 typedef struct tagMSIEXTENSION
583 {
584     struct list entry;
585     LPWSTR Extension;  /* Primary Key */
586     MSICOMPONENT *Component;
587     MSIPROGID *ProgID;
588     LPWSTR ProgIDText;
589     MSIMIME *Mime;
590     MSIFEATURE *Feature;
591     /* not in the table, set during installation */
592     BOOL Installed;
593     struct list verbs;
594 } MSIEXTENSION;
595
596 struct tagMSIPROGID
597 {
598     struct list entry;
599     LPWSTR ProgID;  /* Primary Key */
600     MSIPROGID *Parent;
601     MSICLASS *Class;
602     LPWSTR Description;
603     LPWSTR IconPath;
604     /* not in the table, set during installation */
605     BOOL InstallMe;
606     MSIPROGID *CurVer;
607     MSIPROGID *VersionInd;
608 };
609
610 typedef struct tagMSIVERB
611 {
612     struct list entry;
613     LPWSTR Verb;
614     INT Sequence;
615     LPWSTR Command;
616     LPWSTR Argument;
617 } MSIVERB;
618
619 struct tagMSIMIME
620 {
621     struct list entry;
622     LPWSTR ContentType;  /* Primary Key */
623     MSIEXTENSION *Extension;
624     LPWSTR suffix;
625     LPWSTR clsid;
626     MSICLASS *Class;
627     /* not in the table, set during installation */
628     BOOL InstallMe;
629 };
630
631 enum SCRIPTS {
632     INSTALL_SCRIPT = 0,
633     COMMIT_SCRIPT = 1,
634     ROLLBACK_SCRIPT = 2,
635     TOTAL_SCRIPTS = 3
636 };
637
638 #define SEQUENCE_UI       0x1
639 #define SEQUENCE_EXEC     0x2
640 #define SEQUENCE_INSTALL  0x10
641
642 typedef struct tagMSISCRIPT
643 {
644     LPWSTR  *Actions[TOTAL_SCRIPTS];
645     UINT    ActionCount[TOTAL_SCRIPTS];
646     BOOL    ExecuteSequenceRun;
647     BOOL    CurrentlyScripting;
648     UINT    InWhatSequence;
649     LPWSTR  *UniqueActions;
650     UINT    UniqueActionsCount;
651 } MSISCRIPT;
652
653 #define MSIHANDLETYPE_ANY 0
654 #define MSIHANDLETYPE_DATABASE 1
655 #define MSIHANDLETYPE_SUMMARYINFO 2
656 #define MSIHANDLETYPE_VIEW 3
657 #define MSIHANDLETYPE_RECORD 4
658 #define MSIHANDLETYPE_PACKAGE 5
659 #define MSIHANDLETYPE_PREVIEW 6
660
661 #define MSI_MAJORVERSION 4
662 #define MSI_MINORVERSION 5
663 #define MSI_BUILDNUMBER 6001
664
665 #define GUID_SIZE 39
666 #define SQUISH_GUID_SIZE 33
667
668 #define MSIHANDLE_MAGIC 0x4d434923
669
670 /* handle unicode/ascii output in the Msi* API functions */
671 typedef struct {
672     BOOL unicode;
673     union {
674        LPSTR a;
675        LPWSTR w;
676     } str;
677 } awstring;
678
679 typedef struct {
680     BOOL unicode;
681     union {
682        LPCSTR a;
683        LPCWSTR w;
684     } str;
685 } awcstring;
686
687 UINT msi_strcpy_to_awstring( LPCWSTR str, awstring *awbuf, DWORD *sz );
688
689 /* msi server interface */
690 extern ITypeLib *get_msi_typelib( LPWSTR *path );
691 extern HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj );
692 extern HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj );
693 extern HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj );
694 extern IUnknown *msi_get_remote(MSIHANDLE handle);
695
696 /* handle functions */
697 extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type);
698 extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * );
699 extern MSIHANDLE alloc_msi_remote_handle( IUnknown *unk );
700 extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy );
701 extern void msiobj_addref(MSIOBJECTHDR *);
702 extern int msiobj_release(MSIOBJECTHDR *);
703 extern void msiobj_lock(MSIOBJECTHDR *);
704 extern void msiobj_unlock(MSIOBJECTHDR *);
705 extern void msi_free_handle_table(void);
706
707 extern void free_cached_tables( MSIDATABASE *db );
708 extern UINT MSI_CommitTables( MSIDATABASE *db );
709
710
711 /* string table functions */
712 enum StringPersistence
713 {
714     StringPersistent = 0,
715     StringNonPersistent = 1
716 };
717
718 extern BOOL msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence );
719 extern UINT msi_string2idW( const string_table *st, LPCWSTR buffer, UINT *id );
720 extern VOID msi_destroy_stringtable( string_table *st );
721 extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id );
722 extern HRESULT msi_init_string_table( IStorage *stg );
723 extern string_table *msi_load_string_table( IStorage *stg, UINT *bytes_per_strref );
724 extern UINT msi_save_string_table( const string_table *st, IStorage *storage, UINT *bytes_per_strref );
725 extern UINT msi_get_string_table_codepage( const string_table *st );
726 extern UINT msi_set_string_table_codepage( string_table *st, UINT codepage );
727
728 extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name );
729 extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table );
730
731 extern UINT read_stream_data( IStorage *stg, LPCWSTR stname, BOOL table,
732                               BYTE **pdata, UINT *psz );
733 extern UINT write_stream_data( IStorage *stg, LPCWSTR stname,
734                                LPCVOID data, UINT sz, BOOL bTable );
735
736 /* transform functions */
737 extern UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg );
738 extern UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
739                  LPCWSTR szTransformFile, int iErrorCond );
740 extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg );
741
742 /* patch functions */
743 extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si );
744 extern UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch );
745 extern UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch );
746
747 /* action internals */
748 extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR );
749 extern UINT ACTION_DialogBox( MSIPACKAGE*, LPCWSTR);
750 extern UINT ACTION_ForceReboot(MSIPACKAGE *package);
751 extern UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR szTable, INT iSequenceMode );
752 extern UINT MSI_SetFeatureStates( MSIPACKAGE *package );
753 extern UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine,
754                                     BOOL preserve_case );
755
756 /* record internals */
757 extern void MSI_CloseRecord( MSIOBJECTHDR * );
758 extern UINT MSI_RecordSetIStream( MSIRECORD *, UINT, IStream *);
759 extern UINT MSI_RecordGetIStream( MSIRECORD *, UINT, IStream **);
760 extern const WCHAR *MSI_RecordGetString( const MSIRECORD *, UINT );
761 extern MSIRECORD *MSI_CreateRecord( UINT );
762 extern UINT MSI_RecordSetInteger( MSIRECORD *, UINT, int );
763 extern UINT MSI_RecordSetIntPtr( MSIRECORD *, UINT, INT_PTR );
764 extern UINT MSI_RecordSetStringW( MSIRECORD *, UINT, LPCWSTR );
765 extern BOOL MSI_RecordIsNull( MSIRECORD *, UINT );
766 extern UINT MSI_RecordGetStringW( MSIRECORD * , UINT, LPWSTR, LPDWORD);
767 extern UINT MSI_RecordGetStringA( MSIRECORD *, UINT, LPSTR, LPDWORD);
768 extern int MSI_RecordGetInteger( MSIRECORD *, UINT );
769 extern INT_PTR MSI_RecordGetIntPtr( MSIRECORD *, UINT );
770 extern UINT MSI_RecordReadStream( MSIRECORD *, UINT, char *, LPDWORD);
771 extern UINT MSI_RecordSetStream(MSIRECORD *, UINT, IStream *);
772 extern UINT MSI_RecordGetFieldCount( const MSIRECORD *rec );
773 extern UINT MSI_RecordStreamToFile( MSIRECORD *, UINT, LPCWSTR );
774 extern UINT MSI_RecordSetStreamFromFileW( MSIRECORD *, UINT, LPCWSTR );
775 extern UINT MSI_RecordCopyField( MSIRECORD *, UINT, MSIRECORD *, UINT );
776 extern MSIRECORD *MSI_CloneRecord( MSIRECORD * );
777 extern BOOL MSI_RecordsAreEqual( MSIRECORD *, MSIRECORD * );
778
779 /* stream internals */
780 extern void enum_stream_names( IStorage *stg );
781 extern LPWSTR encode_streamname(BOOL bTable, LPCWSTR in);
782 extern BOOL decode_streamname(LPCWSTR in, LPWSTR out);
783
784 /* database internals */
785 extern UINT db_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** );
786 void db_destroy_stream( MSIDATABASE *, LPCWSTR );
787 extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
788 extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
789 extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
790 typedef UINT (*record_func)( MSIRECORD *, LPVOID );
791 extern UINT MSI_IterateRecords( MSIQUERY *, LPDWORD, record_func, LPVOID );
792 extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... );
793 extern UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *, LPCWSTR, MSIRECORD ** );
794
795 /* view internals */
796 extern UINT MSI_ViewExecute( MSIQUERY*, MSIRECORD * );
797 extern UINT MSI_ViewFetch( MSIQUERY*, MSIRECORD ** );
798 extern UINT MSI_ViewClose( MSIQUERY* );
799 extern UINT MSI_ViewGetColumnInfo(MSIQUERY *, MSICOLINFO, MSIRECORD **);
800 extern UINT MSI_ViewModify( MSIQUERY *, MSIMODIFY, MSIRECORD * );
801 extern UINT VIEW_find_column( MSIVIEW *, LPCWSTR, LPCWSTR, UINT * );
802 extern UINT msi_view_get_row(MSIDATABASE *, MSIVIEW *, UINT, MSIRECORD **);
803
804 /* install internals */
805 extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel );
806
807 /* package internals */
808 extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR );
809 extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage );
810 extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
811 extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * );
812 extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR );
813 extern UINT MSI_GetComponentStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
814 extern UINT MSI_GetFeatureStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
815 extern UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE*, LPCWSTR, INSTALLSTATE );
816 extern UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename );
817 extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR);
818 extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR);
819 extern UINT msi_clone_properties(MSIPACKAGE *);
820 extern UINT msi_set_context(MSIPACKAGE *);
821 extern void msi_adjust_privilege_properties(MSIPACKAGE *);
822 extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT);
823
824 /* for deformating */
825 extern UINT MSI_FormatRecordW( MSIPACKAGE *, MSIRECORD *, LPWSTR, LPDWORD );
826
827 /* registry data encoding/decoding functions */
828 extern BOOL unsquash_guid(LPCWSTR in, LPWSTR out);
829 extern BOOL squash_guid(LPCWSTR in, LPWSTR out);
830 extern BOOL encode_base85_guid(GUID *,LPWSTR);
831 extern BOOL decode_base85_guid(LPCWSTR,GUID*);
832 extern UINT MSIREG_OpenUninstallKey(const WCHAR *, enum platform, HKEY *, BOOL);
833 extern UINT MSIREG_DeleteUninstallKey(const WCHAR *, enum platform);
834 extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
835                                   MSIINSTALLCONTEXT context, HKEY* key, BOOL create);
836 extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
837                                    HKEY *key, BOOL create);
838 extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
839 UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
840                                     HKEY *key, BOOL create);
841 extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
842 extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid,
843                                             HKEY *key, BOOL create);
844 extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
845 extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
846                                           LPCWSTR szUserSid, HKEY *key, BOOL create);
847 extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
848                                         HKEY *key, BOOL create);
849 extern UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context,
850                                                  HKEY *key, BOOL create);
851 extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
852                                     LPCWSTR szUserSid, HKEY *key, BOOL create);
853 extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
854 extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
855 extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct);
856 extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct);
857 extern UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context);
858 extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct);
859 extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
860 extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid);
861 extern UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode);
862 extern UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode);
863 extern UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create);
864 extern UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode);
865 extern UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode);
866
867 extern LPWSTR msi_reg_get_val_str( HKEY hkey, LPCWSTR name );
868 extern BOOL msi_reg_get_val_dword( HKEY hkey, LPCWSTR name, DWORD *val);
869
870 extern DWORD msi_version_str_to_dword(LPCWSTR p);
871 extern void msi_parse_version_string(LPCWSTR, PDWORD, PDWORD);
872 extern VS_FIXEDFILEINFO *msi_get_disk_file_version(LPCWSTR);
873 extern int msi_compare_file_versions(VS_FIXEDFILEINFO *, const WCHAR *);
874 extern int msi_compare_font_versions(const WCHAR *, const WCHAR *);
875 extern DWORD msi_get_disk_file_size(LPCWSTR);
876 extern BOOL msi_file_hash_matches(MSIFILE *);
877
878 extern LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value );
879 extern LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value );
880 extern LONG msi_reg_set_val_dword( HKEY hkey, LPCWSTR name, DWORD val );
881 extern LONG msi_reg_set_subkey_val( HKEY hkey, LPCWSTR path, LPCWSTR name, LPCWSTR val );
882
883 /* msi dialog interface */
884 typedef UINT (*msi_dialog_event_handler)( MSIPACKAGE*, LPCWSTR, LPCWSTR, msi_dialog* );
885 extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog*, msi_dialog_event_handler );
886 extern UINT msi_dialog_run_message_loop( msi_dialog* );
887 extern void msi_dialog_end_dialog( msi_dialog* );
888 extern void msi_dialog_check_messages( HANDLE );
889 extern void msi_dialog_do_preview( msi_dialog* );
890 extern void msi_dialog_destroy( msi_dialog* );
891 extern void msi_dialog_unregister_class( void );
892 extern void msi_dialog_handle_event( msi_dialog*, LPCWSTR, LPCWSTR, MSIRECORD * );
893 extern UINT msi_dialog_reset( msi_dialog *dialog );
894 extern UINT msi_dialog_directorylist_up( msi_dialog *dialog );
895 extern msi_dialog *msi_dialog_get_parent( msi_dialog *dialog );
896 extern LPWSTR msi_dialog_get_name( msi_dialog *dialog );
897 extern UINT msi_spawn_error_dialog( MSIPACKAGE*, LPWSTR, LPWSTR );
898
899 /* summary information */
900 extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount );
901 extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty );
902 extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty );
903 extern LPWSTR msi_get_suminfo_product( IStorage *stg );
904 extern UINT msi_add_suminfo( MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns );
905
906 /* undocumented functions */
907 UINT WINAPI MsiCreateAndVerifyInstallerDirectory( DWORD );
908 UINT WINAPI MsiDecomposeDescriptorW( LPCWSTR, LPWSTR, LPWSTR, LPWSTR, LPDWORD );
909 UINT WINAPI MsiDecomposeDescriptorA( LPCSTR, LPSTR, LPSTR, LPSTR, LPDWORD );
910 LANGID WINAPI MsiLoadStringW( MSIHANDLE, UINT, LPWSTR, int, LANGID );
911 LANGID WINAPI MsiLoadStringA( MSIHANDLE, UINT, LPSTR, int, LANGID );
912
913 /* UI globals */
914 extern INSTALLUILEVEL gUILevel;
915 extern HWND gUIhwnd;
916 extern INSTALLUI_HANDLERA gUIHandlerA;
917 extern INSTALLUI_HANDLERW gUIHandlerW;
918 extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord;
919 extern DWORD gUIFilter;
920 extern LPVOID gUIContext;
921 extern WCHAR *gszLogFile;
922 extern HINSTANCE msi_hInstance;
923
924 /* action related functions */
925 extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script);
926 extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action, UINT script);
927 extern void ACTION_FinishCustomActions( const MSIPACKAGE* package);
928 extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, UINT script, BOOL execute);
929
930 /* actions in other modules */
931 extern UINT ACTION_AppSearch(MSIPACKAGE *package);
932 extern UINT ACTION_CCPSearch(MSIPACKAGE *package);
933 extern UINT ACTION_FindRelatedProducts(MSIPACKAGE *package);
934 extern UINT ACTION_InstallFiles(MSIPACKAGE *package);
935 extern UINT ACTION_PatchFiles( MSIPACKAGE *package );
936 extern UINT ACTION_RemoveFiles(MSIPACKAGE *package);
937 extern UINT ACTION_MoveFiles(MSIPACKAGE *package);
938 extern UINT ACTION_DuplicateFiles(MSIPACKAGE *package);
939 extern UINT ACTION_RemoveDuplicateFiles(MSIPACKAGE *package);
940 extern UINT ACTION_RegisterClassInfo(MSIPACKAGE *package);
941 extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
942 extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package);
943 extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package);
944 extern UINT ACTION_RegisterFonts(MSIPACKAGE *package);
945 extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package);
946 extern UINT ACTION_UnregisterExtensionInfo(MSIPACKAGE *package);
947 extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package);
948 extern UINT ACTION_UnregisterMIMEInfo(MSIPACKAGE *package);
949 extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package);
950 extern UINT ACTION_MsiPublishAssemblies(MSIPACKAGE *package);
951 extern UINT ACTION_MsiUnpublishAssemblies(MSIPACKAGE *package);
952
953 /* Helpers */
954 extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data );
955 extern LPWSTR msi_dup_record_field(MSIRECORD *row, INT index);
956 extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop );
957 extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR );
958 extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD );
959 extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def );
960 extern LPWSTR resolve_source_folder(MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder);
961 extern LPWSTR resolve_target_folder(MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, MSIFOLDER **folder);
962 extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file);
963 extern void msi_reset_folders( MSIPACKAGE *package, BOOL source );
964 extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component );
965 extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature );
966 extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file );
967 extern MSIFILEPATCH *get_loaded_filepatch( MSIPACKAGE* package, LPCWSTR key );
968 extern MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir );
969 extern int track_tempfile(MSIPACKAGE *package, LPCWSTR path);
970 extern UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action);
971 extern void msi_free_action_script(MSIPACKAGE *package, UINT script);
972 extern LPWSTR build_icon_path(MSIPACKAGE *, LPCWSTR);
973 extern LPWSTR build_directory_name(DWORD , ...);
974 extern BOOL create_full_pathW(const WCHAR *path);
975 extern void reduce_to_longfilename(WCHAR*);
976 extern LPWSTR create_component_advertise_string(MSIPACKAGE*, MSICOMPONENT*, LPCWSTR);
977 extern void ACTION_UpdateComponentStates(MSIPACKAGE *package, MSIFEATURE *feature);
978 extern UINT register_unique_action(MSIPACKAGE *, LPCWSTR);
979 extern BOOL check_unique_action(const MSIPACKAGE *, LPCWSTR);
980 extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... );
981 extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
982                         MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value);
983 extern UINT msi_get_local_package_name(LPWSTR path, LPCWSTR suffix);
984 extern UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace);
985 extern MSIASSEMBLY *load_assembly(MSIPACKAGE *, MSICOMPONENT *);
986 extern UINT install_assembly(MSIPACKAGE *, MSICOMPONENT *);
987 extern WCHAR *font_version_from_file(const WCHAR *);
988 extern WCHAR **msi_split_string(const WCHAR *, WCHAR);
989
990 /* media */
991
992 typedef BOOL (*PMSICABEXTRACTCB)(MSIPACKAGE *, LPCWSTR, DWORD, LPWSTR *, DWORD *, PVOID);
993
994 #define MSICABEXTRACT_BEGINEXTRACT  0x01
995 #define MSICABEXTRACT_FILEEXTRACTED 0x02
996
997 typedef struct
998 {
999     MSIPACKAGE* package;
1000     MSIMEDIAINFO *mi;
1001     PMSICABEXTRACTCB cb;
1002     LPWSTR curfile;
1003     PVOID user;
1004 } MSICABDATA;
1005
1006 extern UINT ready_media(MSIPACKAGE *package, UINT Sequence, BOOL IsCompressed, MSIMEDIAINFO *mi);
1007 extern UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi);
1008 extern void msi_free_media_info(MSIMEDIAINFO *mi);
1009 extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data);
1010
1011 /* control event stuff */
1012 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,
1013                                       MSIRECORD *data);
1014 extern VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog);
1015 extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package);
1016 extern VOID ControlEvent_SubscribeToEvent(MSIPACKAGE *package, msi_dialog *dialog,
1017                                       LPCWSTR event, LPCWSTR control, LPCWSTR attribute);
1018
1019 /* OLE automation */
1020 extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj);
1021 extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch);
1022 extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid);
1023
1024 /* Scripting */
1025 extern DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action);
1026
1027 /* User Interface messages from the actions */
1028 extern void ui_progress(MSIPACKAGE *, int, int, int, int);
1029 extern void ui_actiondata(MSIPACKAGE *, LPCWSTR, MSIRECORD *);
1030
1031 /* common strings */
1032 static const WCHAR cszSourceDir[] = {'S','o','u','r','c','e','D','i','r',0};
1033 static const WCHAR cszSOURCEDIR[] = {'S','O','U','R','C','E','D','I','R',0};
1034 static const WCHAR cszRootDrive[] = {'R','O','O','T','D','R','I','V','E',0};
1035 static const WCHAR szLocalSid[] = {'S','-','1','-','5','-','1','8',0};
1036 static const WCHAR szEmpty[] = {0};
1037 static const WCHAR szAll[] = {'A','L','L',0};
1038 static const WCHAR szOne[] = {'1',0};
1039 static const WCHAR szZero[] = {'0',0};
1040 static const WCHAR szSpace[] = {' ',0};
1041 static const WCHAR szBackSlash[] = {'\\',0};
1042 static const WCHAR szForwardSlash[] = {'/',0};
1043 static const WCHAR szDot[] = {'.',0};
1044 static const WCHAR szDotDot[] = {'.','.',0};
1045 static const WCHAR szSemiColon[] = {';',0};
1046 static const WCHAR szPreselected[] = {'P','r','e','s','e','l','e','c','t','e','d',0};
1047 static const WCHAR szPatches[] = {'P','a','t','c','h','e','s',0};
1048 static const WCHAR szState[] = {'S','t','a','t','e',0};
1049 static const WCHAR szMsi[] = {'m','s','i',0};
1050 static const WCHAR szPatch[] = {'P','A','T','C','H',0};
1051 static const WCHAR szSourceList[] = {'S','o','u','r','c','e','L','i','s','t',0};
1052 static const WCHAR szInstalled[] = {'I','n','s','t','a','l','l','e','d',0};
1053 static const WCHAR szReinstall[] = {'R','E','I','N','S','T','A','L','L',0};
1054 static const WCHAR szReinstallMode[] = {'R','E','I','N','S','T','A','L','L','M','O','D','E',0};
1055 static const WCHAR szRemove[] = {'R','E','M','O','V','E',0};
1056 static const WCHAR szUserSID[] = {'U','s','e','r','S','I','D',0};
1057 static const WCHAR szProductCode[] = {'P','r','o','d','u','c','t','C','o','d','e',0};
1058 static const WCHAR szRegisterClassInfo[] = {'R','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
1059 static const WCHAR szRegisterProgIdInfo[] = {'R','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
1060 static const WCHAR szRegisterExtensionInfo[] = {'R','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
1061 static const WCHAR szRegisterMIMEInfo[] = {'R','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
1062 static const WCHAR szDuplicateFiles[] = {'D','u','p','l','i','c','a','t','e','F','i','l','e','s',0};
1063 static const WCHAR szRemoveDuplicateFiles[] = {'R','e','m','o','v','e','D','u','p','l','i','c','a','t','e','F','i','l','e','s',0};
1064 static const WCHAR szInstallFiles[] = {'I','n','s','t','a','l','l','F','i','l','e','s',0};
1065 static const WCHAR szPatchFiles[] = {'P','a','t','c','h','F','i','l','e','s',0};
1066 static const WCHAR szRemoveFiles[] = {'R','e','m','o','v','e','F','i','l','e','s',0};
1067 static const WCHAR szFindRelatedProducts[] = {'F','i','n','d','R','e','l','a','t','e','d','P','r','o','d','u','c','t','s',0};
1068 static const WCHAR szAllUsers[] = {'A','L','L','U','S','E','R','S',0};
1069 static const WCHAR szCustomActionData[] = {'C','u','s','t','o','m','A','c','t','i','o','n','D','a','t','a',0};
1070 static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0};
1071 static const WCHAR szProductID[] = {'P','r','o','d','u','c','t','I','D',0};
1072 static const WCHAR szPIDTemplate[] = {'P','I','D','T','e','m','p','l','a','t','e',0};
1073 static const WCHAR szPIDKEY[] = {'P','I','D','K','E','Y',0};
1074 static const WCHAR szTYPELIB[] = {'T','Y','P','E','L','I','B',0};
1075 static const WCHAR szSumInfo[] = {5 ,'S','u','m','m','a','r','y','I','n','f','o','r','m','a','t','i','o','n',0};
1076 static const WCHAR szHCR[] = {'H','K','E','Y','_','C','L','A','S','S','E','S','_','R','O','O','T','\\',0};
1077 static const WCHAR szHCU[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R','\\',0};
1078 static const WCHAR szHLM[] = {'H','K','E','Y','_','L','O','C','A','L','_','M','A','C','H','I','N','E','\\',0};
1079 static const WCHAR szHU[] = {'H','K','E','Y','_','U','S','E','R','S','\\',0};
1080 static const WCHAR szWindowsFolder[] = {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
1081 static const WCHAR szAppSearch[] = {'A','p','p','S','e','a','r','c','h',0};
1082 static const WCHAR szMoveFiles[] = {'M','o','v','e','F','i','l','e','s',0};
1083 static const WCHAR szCCPSearch[] = {'C','C','P','S','e','a','r','c','h',0};
1084 static const WCHAR szUnregisterClassInfo[] = {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
1085 static const WCHAR szUnregisterExtensionInfo[] = {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
1086 static const WCHAR szUnregisterMIMEInfo[] = {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
1087 static const WCHAR szUnregisterProgIdInfo[] = {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
1088 static const WCHAR szRegisterFonts[] = {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
1089 static const WCHAR szUnregisterFonts[] = {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
1090 static const WCHAR szCLSID[] = {'C','L','S','I','D',0};
1091 static const WCHAR szProgID[] = {'P','r','o','g','I','D',0};
1092 static const WCHAR szVIProgID[] = {'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0};
1093 static const WCHAR szAppID[] = {'A','p','p','I','D',0};
1094 static const WCHAR szDefaultIcon[] = {'D','e','f','a','u','l','t','I','c','o','n',0};
1095 static const WCHAR szInprocHandler[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
1096 static const WCHAR szInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
1097 static const WCHAR szMIMEDatabase[] = {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\','C','o','n','t','e','n','t',' ','T','y','p','e','\\',0};
1098 static const WCHAR szLocalPackage[] = {'L','o','c','a','l','P','a','c','k','a','g','e',0};
1099 static const WCHAR szOriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
1100 static const WCHAR szUpgradeCode[] = {'U','p','g','r','a','d','e','C','o','d','e',0};
1101 static const WCHAR szAdminUser[] = {'A','d','m','i','n','U','s','e','r',0};
1102 static const WCHAR szIntel[] = {'I','n','t','e','l',0};
1103 static const WCHAR szIntel64[] = {'I','n','t','e','l','6','4',0};
1104 static const WCHAR szX64[] = {'x','6','4',0};
1105 static const WCHAR szAMD64[] = {'A','M','D','6','4',0};
1106 static const WCHAR szWow6432NodeCLSID[] = {'W','o','w','6','4','3','2','N','o','d','e','\\','C','L','S','I','D',0};
1107 static const WCHAR szWow6432Node[] = {'W','o','w','6','4','3','2','N','o','d','e',0};
1108 static const WCHAR szStreams[] = {'_','S','t','r','e','a','m','s',0};
1109 static const WCHAR szStorages[] = {'_','S','t','o','r','a','g','e','s',0};
1110 static const WCHAR szMsiPublishAssemblies[] = {'M','s','i','P','u','b','l','i','s','h','A','s','s','e','m','b','l','i','e','s',0};
1111
1112 /* memory allocation macro functions */
1113 static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
1114 static inline void *msi_alloc( size_t len )
1115 {
1116     return HeapAlloc( GetProcessHeap(), 0, len );
1117 }
1118
1119 static void *msi_alloc_zero( size_t len ) __WINE_ALLOC_SIZE(1);
1120 static inline void *msi_alloc_zero( size_t len )
1121 {
1122     return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
1123 }
1124
1125 static void *msi_realloc( void *mem, size_t len ) __WINE_ALLOC_SIZE(2);
1126 static inline void *msi_realloc( void *mem, size_t len )
1127 {
1128     return HeapReAlloc( GetProcessHeap(), 0, mem, len );
1129 }
1130
1131 static void *msi_realloc_zero( void *mem, size_t len ) __WINE_ALLOC_SIZE(2);
1132 static inline void *msi_realloc_zero( void *mem, size_t len )
1133 {
1134     return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len );
1135 }
1136
1137 static inline BOOL msi_free( void *mem )
1138 {
1139     return HeapFree( GetProcessHeap(), 0, mem );
1140 }
1141
1142 static inline char *strdupWtoA( LPCWSTR str )
1143 {
1144     LPSTR ret = NULL;
1145     DWORD len;
1146
1147     if (!str) return ret;
1148     len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
1149     ret = msi_alloc( len );
1150     if (ret)
1151         WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
1152     return ret;
1153 }
1154
1155 static inline LPWSTR strdupAtoW( LPCSTR str )
1156 {
1157     LPWSTR ret = NULL;
1158     DWORD len;
1159
1160     if (!str) return ret;
1161     len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
1162     ret = msi_alloc( len * sizeof(WCHAR) );
1163     if (ret)
1164         MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
1165     return ret;
1166 }
1167
1168 static inline LPWSTR strdupW( LPCWSTR src )
1169 {
1170     LPWSTR dest;
1171     if (!src) return NULL;
1172     dest = msi_alloc( (lstrlenW(src)+1)*sizeof(WCHAR) );
1173     if (dest)
1174         lstrcpyW(dest, src);
1175     return dest;
1176 }
1177
1178 #endif /* __WINE_MSI_PRIVATE__ */