mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 05:26:58 +00:00
[MSI]
* Properly sync to Wine 1.3.37. This partially reverts r55046. svn path=/trunk/; revision=55469
This commit is contained in:
parent
56152bb4a9
commit
5d71814fc4
|
@ -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
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}'
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue