* Properly sync to Wine 1.3.37. This partially reverts r55046.

svn path=/trunk/; revision=55469
This commit is contained in:
Amine Khaldi 2012-02-06 20:43:28 +00:00
parent 56152bb4a9
commit 5d71814fc4
10 changed files with 551 additions and 3069 deletions

View file

@ -2214,15 +2214,11 @@ static UINT calculate_file_cost( MSIPACKAGE *package )
return ERROR_SUCCESS;
}
WCHAR *msi_normalize_path( const WCHAR *in )
void msi_clean_path( WCHAR *p )
{
const WCHAR *p = in;
WCHAR *q, *ret;
int n, len = strlenW( in ) + 2;
WCHAR *q = p;
int n, len = 0;
if (!(q = ret = msi_alloc( len * sizeof(WCHAR) ))) return NULL;
len = 0;
while (1)
{
/* copy until the end of the string or a space */
@ -2249,20 +2245,32 @@ WCHAR *msi_normalize_path( const WCHAR *in )
else /* copy n spaces */
while (n && (*q++ = *p++)) n--;
}
while (q - ret > 0 && q[-1] == ' ') q--;
if (q - ret > 0 && q[-1] != '\\')
}
static WCHAR *get_target_dir_property( MSIDATABASE *db )
{
int len;
WCHAR *path, *target_dir = msi_dup_property( db, szTargetDir );
if (!target_dir) return NULL;
len = strlenW( target_dir );
if (target_dir[len - 1] == '\\') return target_dir;
if ((path = msi_alloc( (len + 2) * sizeof(WCHAR) )))
{
q[0] = '\\';
q[1] = 0;
strcpyW( path, target_dir );
path[len] = '\\';
path[len + 1] = 0;
}
return ret;
msi_free( target_dir );
return path;
}
void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL load_prop )
{
FolderList *fl;
MSIFOLDER *folder, *parent, *child;
WCHAR *path, *normalized_path;
WCHAR *path;
TRACE("resolving %s\n", debugstr_w(name));
@ -2270,7 +2278,7 @@ void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL loa
if (!strcmpW( folder->Directory, szTargetDir )) /* special resolving for target root dir */
{
if (!load_prop || !(path = msi_dup_property( package->db, szTargetDir )))
if (!load_prop || !(path = get_target_dir_property( package->db )))
{
path = msi_dup_property( package->db, szRootDrive );
}
@ -2285,17 +2293,16 @@ void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL loa
else
path = msi_build_directory_name( 2, folder->TargetDefault, NULL );
}
normalized_path = msi_normalize_path( path );
msi_free( path );
if (folder->ResolvedTarget && !strcmpiW( normalized_path, folder->ResolvedTarget ))
msi_clean_path( path );
if (folder->ResolvedTarget && !strcmpiW( path, folder->ResolvedTarget ))
{
TRACE("%s already resolved to %s\n", debugstr_w(name), debugstr_w(folder->ResolvedTarget));
msi_free( normalized_path );
msi_free( path );
return;
}
msi_set_property( package->db, folder->Directory, normalized_path );
msi_set_property( package->db, folder->Directory, path );
msi_free( folder->ResolvedTarget );
folder->ResolvedTarget = normalized_path;
folder->ResolvedTarget = path;
LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry )
{
@ -3601,9 +3608,25 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
target = MSI_RecordGetString(row, 5);
if (strchrW(target, '['))
{
deformat_string( package, target, &path );
int len;
WCHAR *format_string, *p;
if (!(p = strchrW( target, ']' ))) goto err;
len = p - target + 1;
format_string = msi_alloc( (len + 1) * sizeof(WCHAR) );
memcpy( format_string, target, len * sizeof(WCHAR) );
format_string[len] = 0;
deformat_string( package, format_string, &deformated );
msi_free( format_string );
path = msi_alloc( (strlenW( deformated ) + strlenW( p + 1 ) + 2) * sizeof(WCHAR) );
strcpyW( path, deformated );
PathAddBackslashW( path );
strcatW( path, p + 1 );
TRACE("target path is %s\n", debugstr_w(path));
IShellLinkW_SetPath( sl, path );
msi_free( deformated );
msi_free( path );
}
else
@ -4456,7 +4479,7 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)
MSIFILE *file;
MSIRECORD *uirow;
filename = MSI_RecordGetString( row, 1 );
filename = MSI_RecordGetString(row,1);
file = msi_get_loaded_file( package, filename );
if (!file)
{
@ -4474,7 +4497,7 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)
register_dll( file->TargetPath, FALSE );
uirow = MSI_CreateRecord( 2 );
MSI_RecordSetStringW( uirow, 1, file->File );
MSI_RecordSetStringW( uirow, 1, filename );
MSI_RecordSetStringW( uirow, 2, file->Component->Directory );
msi_ui_actiondata( package, szSelfRegModules, uirow );
msiobj_release( &uirow->hdr );
@ -4524,7 +4547,7 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param )
register_dll( file->TargetPath, TRUE );
uirow = MSI_CreateRecord( 2 );
MSI_RecordSetStringW( uirow, 1, file->File );
MSI_RecordSetStringW( uirow, 1, filename );
MSI_RecordSetStringW( uirow, 2, file->Component->Directory );
msi_ui_actiondata( package, szSelfUnregModules, uirow );
msiobj_release( &uirow->hdr );

File diff suppressed because it is too large Load diff

View file

@ -1,108 +0,0 @@
/* A Bison parser, made by GNU Bison 2.4.1. */
/* Skeleton interface for Bison's Yacc-like parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
COND_SPACE = 258,
COND_EOF = 259,
COND_OR = 260,
COND_AND = 261,
COND_NOT = 262,
COND_XOR = 263,
COND_IMP = 264,
COND_EQV = 265,
COND_LT = 266,
COND_GT = 267,
COND_EQ = 268,
COND_NE = 269,
COND_GE = 270,
COND_LE = 271,
COND_ILT = 272,
COND_IGT = 273,
COND_IEQ = 274,
COND_INE = 275,
COND_IGE = 276,
COND_ILE = 277,
COND_LPAR = 278,
COND_RPAR = 279,
COND_TILDA = 280,
COND_SS = 281,
COND_ISS = 282,
COND_ILHS = 283,
COND_IRHS = 284,
COND_LHS = 285,
COND_RHS = 286,
COND_PERCENT = 287,
COND_DOLLARS = 288,
COND_QUESTION = 289,
COND_AMPER = 290,
COND_EXCLAM = 291,
COND_IDENT = 292,
COND_NUMBER = 293,
COND_LITER = 294,
COND_ERROR = 295
};
#endif
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
#line 116 "cond.y"
struct cond_str str;
LPWSTR string;
INT value;
/* Line 1676 of yacc.c */
#line 100 "cond.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif

View file

@ -488,7 +488,7 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b )
return !strncmpiW( a + (l - r), b, r );
}
default:
ERR("invalid substring operator\n");
ERR("invalid substring operator\n");
return 0;
}
return 0;
@ -498,7 +498,7 @@ static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
{
if (operator >= COND_SS && operator <= COND_RHS)
return compare_substring( a, operator, b );
/* null and empty string are equivalent */
if (!a) a = szEmpty;
if (!b) b = szEmpty;
@ -665,8 +665,7 @@ static int COND_GetOne( struct cond_str *str, COND_input *cond )
if (ch == '"' )
{
LPCWSTR p = strchrW( str->data + 1, '"' );
if (!p)
return COND_ERROR;
if (!p) return COND_ERROR;
len = p - str->data + 1;
rc = COND_LITER;
}
@ -813,8 +812,7 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition )
TRACE("%s\n", debugstr_w( szCondition ) );
if ( szCondition == NULL )
return MSICONDITION_NONE;
if (szCondition == NULL) return MSICONDITION_NONE;
cond.package = package;
cond.str = szCondition;

View file

@ -347,10 +347,16 @@ UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder,
return MSI_GetTargetPath( hInstall, szFolder, &path, pcchPathBuf );
}
static WCHAR *get_source_root( MSIPACKAGE *package )
static WCHAR *get_source_root( MSIDATABASE *db )
{
msi_set_sourcedir_props( package, FALSE );
return msi_dup_property( package->db, szSourceDir );
WCHAR *path, *p;
if ((path = msi_dup_property( db, szSourceDir ))) return path;
if ((path = msi_dup_property( db, szDatabase )))
{
if ((p = strrchrW( path, '\\' ))) p[1] = 0;
}
return path;
}
WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder )
@ -366,7 +372,7 @@ WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOL
/* special resolving for root dir */
if (!strcmpW( name, szTargetDir ) && !f->ResolvedSource)
{
f->ResolvedSource = get_source_root( package );
f->ResolvedSource = get_source_root( package->db );
}
if (folder) *folder = f;
if (f->ResolvedSource)
@ -382,7 +388,7 @@ WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOL
p = msi_resolve_source_folder( package, parent, NULL );
if (package->WordCount & msidbSumInfoSourceTypeCompressed)
path = get_source_root( package );
path = get_source_root( package->db );
else if (package->WordCount & msidbSumInfoSourceTypeSFN)
path = msi_build_directory_name( 3, p, f->SourceShortPath, NULL );
else
@ -553,7 +559,8 @@ static void set_target_path( MSIPACKAGE *package, MSIFOLDER *folder, const WCHAR
MSIFOLDER *child;
WCHAR *target_path;
if (!(target_path = msi_normalize_path( path ))) return;
if (!(target_path = strdupW( path ))) return;
msi_clean_path( target_path );
if (strcmpW( target_path, folder->ResolvedTarget ))
{
msi_free( folder->ResolvedTarget );
@ -571,7 +578,7 @@ static void set_target_path( MSIPACKAGE *package, MSIFOLDER *folder, const WCHAR
UINT MSI_SetTargetPathW( MSIPACKAGE *package, LPCWSTR szFolder, LPCWSTR szFolderPath )
{
DWORD attrib;
DWORD attrib, len;
MSIFOLDER *folder;
MSIFILE *file;
@ -586,7 +593,17 @@ UINT MSI_SetTargetPathW( MSIPACKAGE *package, LPCWSTR szFolder, LPCWSTR szFolder
}
if (!(folder = msi_get_loaded_folder( package, szFolder ))) return ERROR_DIRECTORY;
set_target_path( package, folder, szFolderPath );
len = strlenW( szFolderPath );
if (len && szFolderPath[len - 1] != '\\')
{
WCHAR *path = msi_alloc( (len + 2) * sizeof(WCHAR) );
memcpy( path, szFolderPath, len * sizeof(WCHAR) );
path[len] = '\\';
path[len + 1] = 0;
set_target_path( package, folder, path );
msi_free( path );
}
else set_target_path( package, folder, szFolderPath );
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
{

View file

@ -42,9 +42,6 @@
#include "wintrust.h"
#include "softpub.h"
#include "initguid.h"
#include "msxml2.h"
#include "wine/debug.h"
#include "wine/unicode.h"
@ -307,6 +304,7 @@ done:
return r;
}
static UINT get_patch_product_codes( LPCWSTR szPatchPackage, WCHAR ***product_codes )
{
MSIHANDLE patch, info = 0;
@ -582,63 +580,17 @@ static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
return r;
}
/* IXMLDOMDocument should be set to XPath mode already */
static UINT MSI_ApplicablePatchXML( MSIPACKAGE *package, IXMLDOMDocument *desc )
{
static const WCHAR queryW[] = {'M','s','i','P','a','t','c','h','/',
'T','a','r','g','e','t','P','r','o','d','u','c','t','/',
'T','a','r','g','e','t','P','r','o','d','u','c','t','C','o','d','e',0};
UINT r = ERROR_FUNCTION_FAILED;
IXMLDOMNodeList *list;
LPWSTR product_code;
IXMLDOMNode *node;
HRESULT hr;
BSTR s;
product_code = msi_dup_property( package->db, szProductCode );
if (!product_code)
{
/* FIXME: the property ProductCode should be written into the DB somewhere */
ERR("no product code to check\n");
return ERROR_SUCCESS;
}
s = SysAllocString(queryW);
hr = IXMLDOMDocument_selectNodes( desc, s, &list );
SysFreeString(s);
if (hr != S_OK)
return ERROR_INVALID_PATCH_XML;
while (IXMLDOMNodeList_nextNode( list, &node ) == S_OK && r != ERROR_SUCCESS)
{
hr = IXMLDOMNode_get_text( node, &s );
IXMLDOMNode_Release( node );
if (!strcmpW( s, product_code )) r = ERROR_SUCCESS;
SysFreeString(s);
}
IXMLDOMNodeList_Release( list );
if (r != ERROR_SUCCESS)
TRACE("patch not applicable\n");
msi_free( product_code );
return r;
}
static UINT determine_patch_sequence( MSIPACKAGE *package, DWORD count, MSIPATCHSEQUENCEINFOW *info )
{
IXMLDOMDocument *desc = NULL;
DWORD i;
if (count > 1)
FIXME("patch ordering not supported\n");
for (i = 0; i < count; i++)
{
switch (info[i].ePatchDataType)
{
case MSIPATCH_DATATYPE_PATCHFILE:
{
FIXME("patch ordering not supported\n");
if (MSI_ApplicablePatchW( package, info[i].szPatchData ) != ERROR_SUCCESS)
{
info[i].dwOrder = ~0u;
@ -651,72 +603,19 @@ static UINT determine_patch_sequence( MSIPACKAGE *package, DWORD count, MSIPATCH
}
break;
}
case MSIPATCH_DATATYPE_XMLPATH:
case MSIPATCH_DATATYPE_XMLBLOB:
{
VARIANT_BOOL b;
HRESULT hr;
BSTR s;
if (!desc)
{
hr = CoCreateInstance( &CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDOMDocument, (void**)&desc );
if (hr != S_OK)
{
ERR("failed to create DOMDocument30 instance, 0x%08x\n", hr);
return ERROR_FUNCTION_FAILED;
}
}
s = SysAllocString( info[i].szPatchData );
if (info[i].ePatchDataType == MSIPATCH_DATATYPE_XMLPATH)
{
VARIANT src;
V_VT(&src) = VT_BSTR;
V_BSTR(&src) = s;
hr = IXMLDOMDocument_load( desc, src, &b );
}
else
hr = IXMLDOMDocument_loadXML( desc, s, &b );
SysFreeString( s );
if ( hr != S_OK )
{
ERR("failed to parse patch description\n");
IXMLDOMDocument_Release( desc );
break;
}
if (MSI_ApplicablePatchXML( package, desc ) != ERROR_SUCCESS)
{
info[i].dwOrder = ~0u;
info[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND;
}
else
{
info[i].dwOrder = i;
info[i].uStatus = ERROR_SUCCESS;
}
break;
}
default:
{
FIXME("unknown patch data type %u\n", info[i].ePatchDataType);
FIXME("patch data type %u not supported\n", info[i].ePatchDataType);
info[i].dwOrder = i;
info[i].uStatus = ERROR_SUCCESS;
break;
}
}
TRACE("szPatchData: %s\n", debugstr_w(info[i].szPatchData));
TRACE("ePatchDataType: %u\n", info[i].ePatchDataType);
TRACE("dwOrder: %u\n", info[i].dwOrder);
TRACE("uStatus: %u\n", info[i].uStatus);
}
if (desc) IXMLDOMDocument_Release( desc );
return ERROR_SUCCESS;
}

View file

@ -80,4 +80,105 @@ HKCR
{
CLSID = s '{000C101D-0000-0000-C000-000000000046}'
}
NoRemove Typelib
{
NoRemove '{000C1092-0000-0000-C000-000000000046}'
{
'1.0' = s 'WindowsInstaller'
{
'0' { win32 = s '%MODULE%' }
FLAGS = s '0'
}
}
}
NoRemove Interface
{
'{000C1090-0000-0000-C000-000000000046}' = s 'Installer'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C1093-0000-0000-C000-000000000046}' = s 'Record'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C1095-0000-0000-C000-000000000046}' = s 'StringList'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C1096-0000-0000-C000-000000000046}' = s 'RecordList'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109A-0000-0000-C000-000000000046}' = s 'UIPreview'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109B-0000-0000-C000-000000000046}' = s 'SummaryInfo'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109C-0000-0000-C000-000000000046}' = s 'View'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109D-0000-0000-C000-000000000046}' = s 'Database'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109E-0000-0000-C000-000000000046}' = s 'Session'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C109F-0000-0000-C000-000000000046}' = s 'FeatureInfo'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C10A0-0000-0000-C000-000000000046}' = s 'Product'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
'{000C10A1-0000-0000-C000-000000000046}' = s 'Patch'
{
ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}'
ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' }
}
}
NoRemove CLSID
{
'{000C1090-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
ProgId = s 'WindowsInstaller.Installer'
TypeLib = s '{000C1092-0000-0000-C000-000000000046}'
Version = s '1.0'
}
}
'WindowsInstaller.Installer' = s 'Microsoft Windows Installer'
{
CLSID = s '{000C1090-0000-0000-C000-000000000046}'
}
}

View file

@ -998,7 +998,7 @@ extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD ) DECLSPEC
extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def ) DECLSPEC_HIDDEN;
extern WCHAR *msi_resolve_source_folder(MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder) DECLSPEC_HIDDEN;
extern void msi_resolve_target_folder(MSIPACKAGE *package, const WCHAR *name, BOOL load_prop) DECLSPEC_HIDDEN;
extern WCHAR *msi_normalize_path(const WCHAR *) DECLSPEC_HIDDEN;
extern void msi_clean_path( WCHAR *p ) DECLSPEC_HIDDEN;
extern WCHAR *msi_resolve_file_source(MSIPACKAGE *package, MSIFILE *file) DECLSPEC_HIDDEN;
extern const WCHAR *msi_get_target_folder(MSIPACKAGE *package, const WCHAR *name) DECLSPEC_HIDDEN;
extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDEN;

File diff suppressed because it is too large Load diff

View file

@ -102,7 +102,7 @@ reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37
reactos/dll/win32/msgsm32.acm # Synced to Wine-1.3.37
reactos/dll/win32/mshtml # Autosync
reactos/dll/win32/mshtml.tlb # Autosync
reactos/dll/win32/msi # Autosync
reactos/dll/win32/msi # Synced to Wine-1.3.37
reactos/dll/win32/msimg32 # Synced to Wine-1.3.37
reactos/dll/win32/msimtf # Synced to Wine-1.3.37
reactos/dll/win32/msisip # Synced to Wine-1.3.37