Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
38d67a45
Commit
38d67a45
authored
Aug 22, 2005
by
Mike McCormack
Committed by
Alexandre Julliard
Aug 22, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- build a standard Wine list of components instead of using an array
- use component pointers instead of array indexes
parent
94feee32
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
192 additions
and
226 deletions
+192
-226
action.c
dlls/msi/action.c
+124
-144
action.h
dlls/msi/action.h
+8
-6
classes.c
dlls/msi/classes.c
+18
-22
files.c
dlls/msi/files.c
+12
-20
format.c
dlls/msi/format.c
+4
-5
helpers.c
dlls/msi/helpers.c
+19
-20
install.c
dlls/msi/install.c
+5
-5
msipriv.h
dlls/msi/msipriv.h
+1
-2
package.c
dlls/msi/package.c
+1
-2
No files found.
dlls/msi/action.c
View file @
38d67a45
...
...
@@ -965,52 +965,44 @@ static UINT ACTION_CreateFolders(MSIPACKAGE *package)
return
rc
;
}
static
int
load_component
(
MSIPACKAGE
*
package
,
MSIRECORD
*
row
)
static
MSICOMPONENT
*
load_component
(
MSIRECORD
*
row
)
{
int
index
=
package
->
loaded_components
;
MSICOMPONENT
*
comp
;
DWORD
sz
;
/* fill in the data */
package
->
loaded_components
++
;
if
(
package
->
loaded_components
==
1
)
package
->
components
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
MSICOMPONENT
));
else
package
->
components
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
package
->
components
,
package
->
loaded_components
*
sizeof
(
MSICOMPONENT
));
memset
(
&
package
->
components
[
index
],
0
,
sizeof
(
MSICOMPONENT
));
comp
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
MSICOMPONENT
)
);
if
(
!
comp
)
return
comp
;
/* fill in the data */
sz
=
IDENTIFIER_SIZE
;
MSI_RecordGetStringW
(
row
,
1
,
package
->
components
[
index
].
Component
,
&
sz
);
MSI_RecordGetStringW
(
row
,
1
,
comp
->
Component
,
&
sz
);
TRACE
(
"Loading Component %s
\n
"
,
debugstr_w
(
package
->
components
[
index
].
Component
));
debugstr_w
(
comp
->
Component
));
sz
=
0x100
;
if
(
!
MSI_RecordIsNull
(
row
,
2
))
MSI_RecordGetStringW
(
row
,
2
,
package
->
components
[
index
].
ComponentId
,
&
sz
);
MSI_RecordGetStringW
(
row
,
2
,
comp
->
ComponentId
,
&
sz
);
sz
=
IDENTIFIER_SIZE
;
MSI_RecordGetStringW
(
row
,
3
,
package
->
components
[
index
].
Directory
,
&
sz
);
MSI_RecordGetStringW
(
row
,
3
,
comp
->
Directory
,
&
sz
);
package
->
components
[
index
].
Attributes
=
MSI_RecordGetInteger
(
row
,
4
);
comp
->
Attributes
=
MSI_RecordGetInteger
(
row
,
4
);
sz
=
0x100
;
MSI_RecordGetStringW
(
row
,
5
,
package
->
components
[
index
].
Condition
,
&
sz
);
MSI_RecordGetStringW
(
row
,
5
,
comp
->
Condition
,
&
sz
);
sz
=
IDENTIFIER_SIZE
;
MSI_RecordGetStringW
(
row
,
6
,
package
->
components
[
index
].
KeyPath
,
&
sz
);
MSI_RecordGetStringW
(
row
,
6
,
comp
->
KeyPath
,
&
sz
);
package
->
components
[
index
].
Installed
=
INSTALLSTATE_ABSENT
;
package
->
components
[
index
].
Action
=
INSTALLSTATE_UNKNOWN
;
package
->
components
[
index
].
ActionRequest
=
INSTALLSTATE_UNKNOWN
;
comp
->
Installed
=
INSTALLSTATE_ABSENT
;
comp
->
Action
=
INSTALLSTATE_UNKNOWN
;
comp
->
ActionRequest
=
INSTALLSTATE_UNKNOWN
;
package
->
components
[
index
].
Enabled
=
TRUE
;
comp
->
Enabled
=
TRUE
;
return
index
;
return
comp
;
}
typedef
struct
{
...
...
@@ -1018,28 +1010,33 @@ typedef struct {
INT
index
;
}
_ilfs
;
static
UINT
add_feature_component
(
MSIFEATURE
*
feature
,
int
index
)
static
UINT
add_feature_component
(
MSIFEATURE
*
feature
,
MSICOMPONENT
*
comp
)
{
ComponentList
*
cl
;
cl
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
cl
)
);
if
(
!
cl
)
return
ERROR_NOT_ENOUGH_MEMORY
;
cl
->
component
=
index
;
cl
->
component
=
comp
;
list_add_tail
(
feature
->
Components
,
&
cl
->
entry
);
return
ERROR_SUCCESS
;
}
static
UINT
iterate_component_check
(
MSIRECORD
*
row
,
LPVOID
param
)
static
UINT
iterate_component_check
(
MSIRECORD
*
row
,
LPVOID
param
)
{
_ilfs
*
ilfs
=
(
_ilfs
*
)
param
;
INT
c_indx
;
MSIPACKAGE
*
package
=
ilfs
->
package
;
MSICOMPONENT
*
comp
;
comp
=
load_component
(
row
);
if
(
!
comp
)
return
ERROR_FUNCTION_FAILED
;
c_indx
=
load_component
(
ilfs
->
package
,
row
);
add_feature_component
(
&
ilfs
->
package
->
features
[
ilfs
->
index
],
c_indx
);
list_add_tail
(
&
package
->
components
,
&
comp
->
entry
);
add_feature_component
(
&
package
->
features
[
ilfs
->
index
],
comp
);
TRACE
(
"Loaded new component
to index %i
\n
"
,
c_indx
);
TRACE
(
"Loaded new component
%p
\n
"
,
comp
);
return
ERROR_SUCCESS
;
}
...
...
@@ -1049,7 +1046,7 @@ static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param)
_ilfs
*
ilfs
=
(
_ilfs
*
)
param
;
LPCWSTR
component
;
DWORD
rc
;
INT
c_indx
;
MSICOMPONENT
*
comp
;
MSIQUERY
*
view
;
static
const
WCHAR
Query
[]
=
{
'S'
,
'E'
,
'L'
,
'E'
,
'C'
,
'T'
,
' '
,
'*'
,
' '
,
'F'
,
'R'
,
'O'
,
'M'
,
' '
,
...
...
@@ -1061,12 +1058,11 @@ static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param)
component
=
MSI_RecordGetString
(
row
,
1
);
/* check to see if the component is already loaded */
c
_indx
=
get_loaded_component
(
ilfs
->
package
,
component
);
if
(
c
_indx
!=
-
1
)
c
omp
=
get_loaded_component
(
ilfs
->
package
,
component
);
if
(
c
omp
)
{
TRACE
(
"Component %s already loaded at %i
\n
"
,
debugstr_w
(
component
),
c_indx
);
add_feature_component
(
&
ilfs
->
package
->
features
[
ilfs
->
index
],
c_indx
);
TRACE
(
"Component %s already loaded
\n
"
,
debugstr_w
(
component
)
);
add_feature_component
(
&
ilfs
->
package
->
features
[
ilfs
->
index
],
comp
);
return
ERROR_SUCCESS
;
}
...
...
@@ -1183,10 +1179,10 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
package
->
files
[
index
].
File
=
load_dynamic_stringW
(
row
,
1
);
component
=
MSI_RecordGetString
(
row
,
2
);
package
->
files
[
index
].
Component
Index
=
get_loaded_component
(
package
,
package
->
files
[
index
].
Component
=
get_loaded_component
(
package
,
component
);
if
(
package
->
files
[
index
].
ComponentIndex
==
-
1
)
if
(
!
package
->
files
[
index
].
Component
)
ERR
(
"Unfound Component %s
\n
"
,
debugstr_w
(
component
));
package
->
files
[
index
].
FileName
=
load_dynamic_stringW
(
row
,
3
);
...
...
@@ -1423,16 +1419,17 @@ static INT load_folder(MSIPACKAGE *package, const WCHAR* dir)
/* scan for and update current install states */
static
void
ACTION_UpdateInstallStates
(
MSIPACKAGE
*
package
)
{
MSICOMPONENT
*
comp
;
int
i
;
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
LIST_FOR_EACH_ENTRY
(
comp
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
INSTALLSTATE
res
;
res
=
MsiGetComponentPathW
(
package
->
ProductCode
,
package
->
components
[
i
].
ComponentId
,
NULL
,
NULL
);
res
=
MsiGetComponentPathW
(
package
->
ProductCode
,
comp
->
ComponentId
,
NULL
,
NULL
);
if
(
res
<
0
)
res
=
INSTALLSTATE_ABSENT
;
package
->
components
[
i
].
Installed
=
res
;
comp
->
Installed
=
res
;
}
for
(
i
=
0
;
i
<
package
->
loaded_features
;
i
++
)
...
...
@@ -1443,16 +1440,16 @@ static void ACTION_UpdateInstallStates(MSIPACKAGE *package)
LIST_FOR_EACH_ENTRY
(
cl
,
package
->
features
[
i
].
Components
,
ComponentList
,
entry
)
{
MSICOMPONENT
*
component
=
&
package
->
components
[
cl
->
component
]
;
comp
=
cl
->
component
;
if
(
res
==
-
10
)
res
=
comp
onent
->
Installed
;
res
=
comp
->
Installed
;
else
{
if
(
res
==
comp
onent
->
Installed
)
if
(
res
==
comp
->
Installed
)
continue
;
if
(
res
!=
comp
onent
->
Installed
)
if
(
res
!=
comp
->
Installed
)
res
=
INSTALLSTATE_INCOMPLETE
;
}
}
...
...
@@ -1522,6 +1519,7 @@ static UINT SetFeatureStates(MSIPACKAGE *package)
static
const
WCHAR
szRemove
[]
=
{
'R'
,
'E'
,
'M'
,
'O'
,
'V'
,
'E'
,
0
};
BOOL
override
=
FALSE
;
MSICOMPONENT
*
component
;
/* I do not know if this is where it should happen.. but */
...
...
@@ -1615,7 +1613,7 @@ static UINT SetFeatureStates(MSIPACKAGE *package)
LIST_FOR_EACH_ENTRY
(
cl
,
feature
->
Components
,
ComponentList
,
entry
)
{
MSICOMPONENT
*
component
=
&
package
->
components
[
cl
->
component
]
;
component
=
cl
->
component
;
if
(
!
component
->
Enabled
)
{
...
...
@@ -1662,10 +1660,8 @@ static UINT SetFeatureStates(MSIPACKAGE *package)
}
}
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
LIST_FOR_EACH_ENTRY
(
component
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
MSICOMPONENT
*
component
=
&
package
->
components
[
i
];
TRACE
(
"Result: Component %s (Installed %i, Action %i, Request %i)
\n
"
,
debugstr_w
(
component
->
Component
),
component
->
Installed
,
component
->
Action
,
component
->
ActionRequest
);
...
...
@@ -1740,6 +1736,7 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
static
const
WCHAR
szlevel
[]
=
{
'I'
,
'N'
,
'S'
,
'T'
,
'A'
,
'L'
,
'L'
,
'L'
,
'E'
,
'V'
,
'E'
,
'L'
,
0
};
static
const
WCHAR
szOne
[]
=
{
'1'
,
0
};
MSICOMPONENT
*
comp
;
UINT
rc
;
MSIQUERY
*
view
;
DWORD
i
;
...
...
@@ -1769,8 +1766,7 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
MSIFILE
*
file
=
NULL
;
file
=
&
package
->
files
[
i
];
if
(
file
->
ComponentIndex
>=
0
)
comp
=
&
package
->
components
[
file
->
ComponentIndex
];
comp
=
file
->
Component
;
if
(
file
->
Temporary
==
TRUE
)
continue
;
...
...
@@ -1856,16 +1852,15 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
}
TRACE
(
"Enabling or Disabling Components
\n
"
);
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
LIST_FOR_EACH_ENTRY
(
comp
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
if
(
package
->
components
[
i
].
Condition
[
0
])
if
(
comp
->
Condition
[
0
])
{
if
(
MSI_EvaluateConditionW
(
package
,
package
->
components
[
i
].
Condition
)
==
MSICONDITION_FALSE
)
comp
->
Condition
)
==
MSICONDITION_FALSE
)
{
TRACE
(
"Disabling component %s
\n
"
,
debugstr_w
(
package
->
components
[
i
].
Component
));
package
->
components
[
i
].
Enabled
=
FALSE
;
TRACE
(
"Disabling component %s
\n
"
,
debugstr_w
(
comp
->
Component
));
comp
->
Enabled
=
FALSE
;
}
}
}
...
...
@@ -2013,7 +2008,7 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
DWORD
type
,
size
;
LPWSTR
deformated
;
LPCWSTR
szRoot
,
component
,
name
,
key
,
value
;
INT
component_index
;
MSICOMPONENT
*
comp
;
MSIRECORD
*
uirow
;
LPWSTR
uikey
;
INT
root
;
...
...
@@ -2028,21 +2023,19 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
name
=
NULL
;
component
=
MSI_RecordGetString
(
row
,
6
);
comp
onent_index
=
get_loaded_component
(
package
,
component
);
comp
=
get_loaded_component
(
package
,
component
);
if
(
!
ACTION_VerifyComponentForAction
(
package
,
component_index
,
INSTALLSTATE_LOCAL
))
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping write due to disabled component %s
\n
"
,
debugstr_w
(
component
));
package
->
components
[
component_index
].
Action
=
package
->
components
[
component_index
].
Installed
;
comp
->
Action
=
comp
->
Installed
;
return
ERROR_SUCCESS
;
}
package
->
components
[
component_index
].
Action
=
INSTALLSTATE_LOCAL
;
comp
->
Action
=
INSTALLSTATE_LOCAL
;
name
=
MSI_RecordGetString
(
row
,
4
);
if
(
MSI_RecordIsNull
(
row
,
5
)
&&
name
)
...
...
@@ -2210,6 +2203,7 @@ static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
static
UINT
ACTION_InstallValidate
(
MSIPACKAGE
*
package
)
{
MSICOMPONENT
*
comp
;
DWORD
progress
=
0
;
DWORD
total
=
0
;
static
const
WCHAR
q1
[]
=
...
...
@@ -2249,7 +2243,10 @@ static UINT ACTION_InstallValidate(MSIPACKAGE *package)
msiobj_release
(
&
view
->
hdr
);
total
=
total
+
progress
*
REG_PROGRESS_VALUE
;
total
=
total
+
package
->
loaded_components
*
COMPONENT_PROGRESS_VALUE
;
LIST_FOR_EACH_ENTRY
(
comp
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
total
+=
COMPONENT_PROGRESS_VALUE
;
}
for
(
i
=
0
;
i
<
package
->
loaded_files
;
i
++
)
total
+=
package
->
files
[
i
].
FileSize
;
ui_progress
(
package
,
0
,
total
,
0
,
0
);
...
...
@@ -2308,10 +2305,8 @@ static UINT ACTION_LaunchConditions(MSIPACKAGE *package)
return
rc
;
}
static
LPWSTR
resolve_keypath
(
MSIPACKAGE
*
package
,
INT
component_index
)
static
LPWSTR
resolve_keypath
(
MSIPACKAGE
*
package
,
MSICOMPONENT
*
cmp
)
{
MSICOMPONENT
*
cmp
=
&
package
->
components
[
component_index
];
if
(
cmp
->
KeyPath
[
0
]
==
0
)
{
...
...
@@ -2426,27 +2421,23 @@ static UINT ACTION_WriteSharedDLLsCount(LPCWSTR path, UINT count)
/*
* Return TRUE if the count should be written out and FALSE if not
*/
static
void
ACTION_RefCountComponent
(
MSIPACKAGE
*
package
,
UINT
index
)
static
void
ACTION_RefCountComponent
(
MSIPACKAGE
*
package
,
MSICOMPONENT
*
comp
)
{
INT
count
=
0
;
BOOL
write
=
FALSE
;
INT
j
;
/* only refcount DLLs */
if
(
package
->
components
[
index
].
KeyPath
[
0
]
==
0
||
package
->
components
[
index
].
Attributes
&
msidbComponentAttributesRegistryKeyPath
||
package
->
components
[
index
].
Attributes
&
msidbComponentAttributesODBCDataSource
)
if
(
comp
->
KeyPath
[
0
]
==
0
||
comp
->
Attributes
&
msidbComponentAttributesRegistryKeyPath
||
comp
->
Attributes
&
msidbComponentAttributesODBCDataSource
)
write
=
FALSE
;
else
{
count
=
ACTION_GetSharedDLLsCount
(
package
->
components
[
index
].
FullKeypath
);
count
=
ACTION_GetSharedDLLsCount
(
comp
->
FullKeypath
);
write
=
(
count
>
0
);
if
(
package
->
components
[
index
].
Attributes
&
msidbComponentAttributesSharedDllRefCount
)
if
(
comp
->
Attributes
&
msidbComponentAttributesSharedDllRefCount
)
write
=
TRUE
;
}
...
...
@@ -2461,7 +2452,7 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, UINT index)
LIST_FOR_EACH_ENTRY
(
cl
,
package
->
features
[
j
].
Components
,
ComponentList
,
entry
)
{
if
(
cl
->
component
==
index
)
if
(
cl
->
component
==
comp
)
count
++
;
}
}
...
...
@@ -2476,7 +2467,7 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, UINT index)
LIST_FOR_EACH_ENTRY
(
cl
,
package
->
features
[
j
].
Components
,
ComponentList
,
entry
)
{
if
(
cl
->
component
==
index
)
if
(
cl
->
component
==
comp
)
count
--
;
}
}
...
...
@@ -2487,20 +2478,18 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, UINT index)
{
if
(
package
->
files
[
j
].
Temporary
)
continue
;
if
(
package
->
files
[
j
].
Component
Index
==
index
)
if
(
package
->
files
[
j
].
Component
==
comp
)
ACTION_WriteSharedDLLsCount
(
package
->
files
[
j
].
TargetPath
,
count
);
}
/* add a count for permenent */
if
(
package
->
components
[
index
].
Attributes
&
msidbComponentAttributesPermanent
)
if
(
comp
->
Attributes
&
msidbComponentAttributesPermanent
)
count
++
;
package
->
components
[
index
].
RefCount
=
count
;
comp
->
RefCount
=
count
;
if
(
write
)
ACTION_WriteSharedDLLsCount
(
package
->
components
[
index
].
FullKeypath
,
package
->
components
[
index
].
RefCount
);
ACTION_WriteSharedDLLsCount
(
comp
->
FullKeypath
,
comp
->
RefCount
);
}
/*
...
...
@@ -2515,7 +2504,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
WCHAR
squished_pc
[
GUID_SIZE
];
WCHAR
squished_cc
[
GUID_SIZE
];
UINT
rc
;
DWORD
i
;
MSICOMPONENT
*
comp
;
HKEY
hkey
=
0
,
hkey2
=
0
;
if
(
!
package
)
...
...
@@ -2529,32 +2518,33 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
squash_guid
(
package
->
ProductCode
,
squished_pc
);
ui_progress
(
package
,
1
,
COMPONENT_PROGRESS_VALUE
,
1
,
0
);
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
LIST_FOR_EACH_ENTRY
(
comp
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
ui_progress
(
package
,
2
,
0
,
0
,
0
);
if
(
package
->
components
[
i
].
ComponentId
[
0
]
!=
0
)
if
(
comp
->
ComponentId
[
0
]
!=
0
)
{
WCHAR
*
keypath
=
NULL
;
MSIRECORD
*
uirow
;
squash_guid
(
package
->
components
[
i
].
ComponentId
,
squished_cc
);
squash_guid
(
comp
->
ComponentId
,
squished_cc
);
keypath
=
resolve_keypath
(
package
,
i
);
package
->
components
[
i
].
FullKeypath
=
keypath
;
keypath
=
resolve_keypath
(
package
,
comp
);
comp
->
FullKeypath
=
keypath
;
/* do the refcounting */
ACTION_RefCountComponent
(
package
,
i
);
ACTION_RefCountComponent
(
package
,
comp
);
TRACE
(
"Component %s (%s), Keypath=%s, RefCount=%i
\n
"
,
debugstr_w
(
package
->
components
[
i
].
Component
),
debugstr_w
(
comp
->
Component
),
debugstr_w
(
squished_cc
),
debugstr_w
(
package
->
components
[
i
].
FullKeypath
),
package
->
components
[
i
].
RefCount
);
debugstr_w
(
comp
->
FullKeypath
),
comp
->
RefCount
);
/*
* Write the keypath out if the component is to be registered
* and delete the key if the component is to be deregistered
*/
if
(
ACTION_VerifyComponentForAction
(
package
,
i
,
if
(
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
rc
=
RegCreateKeyW
(
hkey
,
squished_cc
,
&
hkey2
);
...
...
@@ -2566,8 +2556,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
RegSetValueExW
(
hkey2
,
squished_pc
,
0
,
REG_SZ
,(
LPBYTE
)
keypath
,
(
strlenW
(
keypath
)
+
1
)
*
sizeof
(
WCHAR
));
if
(
package
->
components
[
i
].
Attributes
&
msidbComponentAttributesPermanent
)
if
(
comp
->
Attributes
&
msidbComponentAttributesPermanent
)
{
static
const
WCHAR
szPermKey
[]
=
{
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
...
...
@@ -2584,14 +2573,13 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
/* UI stuff */
uirow
=
MSI_CreateRecord
(
3
);
MSI_RecordSetStringW
(
uirow
,
1
,
package
->
ProductCode
);
MSI_RecordSetStringW
(
uirow
,
2
,
package
->
components
[
i
].
ComponentId
);
MSI_RecordSetStringW
(
uirow
,
2
,
comp
->
ComponentId
);
MSI_RecordSetStringW
(
uirow
,
3
,
keypath
);
ui_actiondata
(
package
,
szProcessComponents
,
uirow
);
msiobj_release
(
&
uirow
->
hdr
);
}
}
else
if
(
ACTION_VerifyComponentForAction
(
package
,
i
,
else
if
(
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_ABSENT
))
{
DWORD
res
;
...
...
@@ -2611,8 +2599,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
/* UI stuff */
uirow
=
MSI_CreateRecord
(
2
);
MSI_RecordSetStringW
(
uirow
,
1
,
package
->
ProductCode
);
MSI_RecordSetStringW
(
uirow
,
2
,
package
->
components
[
i
].
ComponentId
);
MSI_RecordSetStringW
(
uirow
,
2
,
comp
->
ComponentId
);
ui_actiondata
(
package
,
szProcessComponents
,
uirow
);
msiobj_release
(
&
uirow
->
hdr
);
}
...
...
@@ -2688,28 +2675,28 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
MSIPACKAGE
*
package
=
(
MSIPACKAGE
*
)
param
;
LPCWSTR
component
;
INT
index
;
MSICOMPONENT
*
comp
;
typelib_struct
tl_struct
;
HMODULE
module
;
static
const
WCHAR
szTYPELIB
[]
=
{
'T'
,
'Y'
,
'P'
,
'E'
,
'L'
,
'I'
,
'B'
,
0
};
component
=
MSI_RecordGetString
(
row
,
3
);
index
=
get_loaded_component
(
package
,
component
);
if
(
index
<
0
)
comp
=
get_loaded_component
(
package
,
component
);
if
(
!
comp
)
return
ERROR_SUCCESS
;
if
(
!
ACTION_VerifyComponentForAction
(
package
,
index
,
INSTALLSTATE_LOCAL
))
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping typelib reg due to disabled component
\n
"
);
package
->
components
[
index
].
Action
=
package
->
components
[
index
].
Installed
;
comp
->
Action
=
comp
->
Installed
;
return
ERROR_SUCCESS
;
}
package
->
components
[
index
].
Action
=
INSTALLSTATE_LOCAL
;
comp
->
Action
=
INSTALLSTATE_LOCAL
;
index
=
get_loaded_file
(
package
,
package
->
components
[
index
].
KeyPath
);
index
=
get_loaded_file
(
package
,
comp
->
KeyPath
);
if
(
index
<
0
)
return
ERROR_SUCCESS
;
...
...
@@ -2801,29 +2788,27 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
LPCWSTR
buffer
;
WCHAR
filename
[
0x100
];
DWORD
sz
;
DWORD
index
;
MSICOMPONENT
*
comp
;
static
const
WCHAR
szlnk
[]
=
{
'.'
,
'l'
,
'n'
,
'k'
,
0
};
IShellLinkW
*
sl
;
IPersistFile
*
pf
;
HRESULT
res
;
buffer
=
MSI_RecordGetString
(
row
,
4
);
index
=
get_loaded_component
(
package
,
buffer
);
if
(
index
<
0
)
comp
=
get_loaded_component
(
package
,
buffer
);
if
(
!
comp
)
return
ERROR_SUCCESS
;
if
(
!
ACTION_VerifyComponentForAction
(
package
,
index
,
INSTALLSTATE_LOCAL
))
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping shortcut creation due to disabled component
\n
"
);
package
->
components
[
index
].
Action
=
package
->
components
[
index
].
Installed
;
comp
->
Action
=
comp
->
Installed
;
return
ERROR_SUCCESS
;
}
package
->
components
[
index
].
Action
=
INSTALLSTATE_LOCAL
;
comp
->
Action
=
INSTALLSTATE_LOCAL
;
ui_actiondata
(
package
,
szCreateShortcuts
,
row
);
...
...
@@ -2869,7 +2854,7 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
{
LPWSTR
keypath
;
FIXME
(
"poorly handled shortcut format, advertised shortcut
\n
"
);
keypath
=
strdupW
(
package
->
components
[
index
].
FullKeypath
);
keypath
=
strdupW
(
comp
->
FullKeypath
);
IShellLinkW_SetPath
(
sl
,
keypath
);
HeapFree
(
GetProcessHeap
(),
0
,
keypath
);
}
...
...
@@ -3146,26 +3131,25 @@ static UINT ITERATE_WriteIniValues(MSIRECORD *row, LPVOID param)
LPWSTR
deformated_section
,
deformated_key
,
deformated_value
;
LPWSTR
folder
,
fullname
=
NULL
;
MSIRECORD
*
uirow
;
INT
component_index
,
action
;
INT
action
;
MSICOMPONENT
*
comp
;
static
const
WCHAR
szWindowsFolder
[]
=
{
'W'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
'F'
,
'o'
,
'l'
,
'd'
,
'e'
,
'r'
,
0
};
component
=
MSI_RecordGetString
(
row
,
8
);
comp
onent_index
=
get_loaded_component
(
package
,
component
);
comp
=
get_loaded_component
(
package
,
component
);
if
(
!
ACTION_VerifyComponentForAction
(
package
,
component_index
,
INSTALLSTATE_LOCAL
))
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping ini file due to disabled component %s
\n
"
,
debugstr_w
(
component
));
package
->
components
[
component_index
].
Action
=
package
->
components
[
component_index
].
Installed
;
comp
->
Action
=
comp
->
Installed
;
return
ERROR_SUCCESS
;
}
package
->
components
[
component_index
].
Action
=
INSTALLSTATE_LOCAL
;
comp
->
Action
=
INSTALLSTATE_LOCAL
;
identifier
=
MSI_RecordGetString
(
row
,
1
);
filename
=
MSI_RecordGetString
(
row
,
2
);
...
...
@@ -3371,7 +3355,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
LIST_FOR_EACH_ENTRY
(
cl
,
package
->
features
[
i
].
Components
,
ComponentList
,
entry
)
{
MSICOMPONENT
*
component
=
&
package
->
components
[
cl
->
component
]
;
MSICOMPONENT
*
component
=
cl
->
component
;
WCHAR
buf
[
21
];
memset
(
buf
,
0
,
sizeof
(
buf
));
...
...
@@ -4000,7 +3984,7 @@ static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param)
/* check to make sure that component is installed */
if
(
!
ACTION_VerifyComponentForAction
(
package
,
package
->
files
[
index
].
Component
Index
,
INSTALLSTATE_LOCAL
))
package
->
files
[
index
].
Component
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping: Component not scheduled for install
\n
"
);
return
ERROR_SUCCESS
;
...
...
@@ -4062,18 +4046,15 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param)
LPWSTR
output
=
NULL
;
HKEY
hkey
;
UINT
rc
=
ERROR_SUCCESS
;
UINT
index
;
MSICOMPONENT
*
comp
;
DWORD
sz
=
0
;
component
=
MSI_RecordGetString
(
rec
,
3
);
index
=
get_loaded_component
(
package
,
component
);
if
(
!
ACTION_VerifyComponentForAction
(
package
,
index
,
INSTALLSTATE_LOCAL
)
&&
!
ACTION_VerifyComponentForAction
(
package
,
index
,
INSTALLSTATE_SOURCE
)
&&
!
ACTION_VerifyComponentForAction
(
package
,
index
,
INSTALLSTATE_ADVERTISED
))
comp
=
get_loaded_component
(
package
,
component
);
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
)
&&
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_SOURCE
)
&&
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_ADVERTISED
))
{
TRACE
(
"Skipping: Component %s not scheduled for install
\n
"
,
debugstr_w
(
component
));
...
...
@@ -4091,8 +4072,7 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param)
qualifier
=
MSI_RecordGetString
(
rec
,
2
);
feature
=
MSI_RecordGetString
(
rec
,
5
);
advertise
=
create_component_advertise_string
(
package
,
&
package
->
components
[
index
],
feature
);
advertise
=
create_component_advertise_string
(
package
,
comp
,
feature
);
sz
=
strlenW
(
advertise
);
...
...
dlls/msi/action.h
View file @
38d67a45
...
...
@@ -44,6 +44,8 @@ typedef struct tagMSIFEATURE
typedef
struct
tagMSICOMPONENT
{
struct
list
entry
;
DWORD
magic
;
WCHAR
Component
[
IDENTIFIER_SIZE
];
WCHAR
ComponentId
[
IDENTIFIER_SIZE
];
WCHAR
Directory
[
IDENTIFIER_SIZE
];
...
...
@@ -66,7 +68,7 @@ typedef struct tagMSICOMPONENT
typedef
struct
tagComponentList
{
struct
list
entry
;
int
component
;
MSICOMPONENT
*
component
;
}
ComponentList
;
typedef
struct
tagMSIFOLDER
...
...
@@ -91,7 +93,7 @@ typedef struct tagMSIFOLDER
typedef
struct
tagMSIFILE
{
LPWSTR
File
;
INT
ComponentIndex
;
MSICOMPONENT
*
Component
;
LPWSTR
FileName
;
LPWSTR
ShortName
;
INT
FileSize
;
...
...
@@ -115,7 +117,7 @@ typedef struct tagMSICLASS
{
WCHAR
CLSID
[
IDENTIFIER_SIZE
];
/* Primary Key */
WCHAR
Context
[
IDENTIFIER_SIZE
];
/* Primary Key */
INT
ComponentIndex
;
/* Primary Key */
MSICOMPONENT
*
Component
;
INT
ProgIDIndex
;
LPWSTR
ProgIDText
;
LPWSTR
Description
;
...
...
@@ -134,7 +136,7 @@ typedef struct tagMSICLASS
typedef
struct
tagMSIEXTENSION
{
WCHAR
Extension
[
256
];
/* Primary Key */
INT
ComponentIndex
;
/* Primary Key */
MSICOMPONENT
*
Component
;
INT
ProgIDIndex
;
LPWSTR
ProgIDText
;
INT
MIMEIndex
;
...
...
@@ -233,7 +235,7 @@ WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index);
LPWSTR
load_dynamic_property
(
MSIPACKAGE
*
package
,
LPCWSTR
prop
,
UINT
*
rc
);
LPWSTR
resolve_folder
(
MSIPACKAGE
*
package
,
LPCWSTR
name
,
BOOL
source
,
BOOL
set_prop
,
MSIFOLDER
**
folder
);
int
get_loaded_component
(
MSIPACKAGE
*
package
,
LPCWSTR
Component
);
MSICOMPONENT
*
get_loaded_component
(
MSIPACKAGE
*
package
,
LPCWSTR
Component
);
int
get_loaded_feature
(
MSIPACKAGE
*
package
,
LPCWSTR
Feature
);
int
get_loaded_file
(
MSIPACKAGE
*
package
,
LPCWSTR
file
);
int
track_tempfile
(
MSIPACKAGE
*
package
,
LPCWSTR
name
,
LPCWSTR
path
);
...
...
@@ -242,7 +244,7 @@ UINT build_icon_path(MSIPACKAGE *, LPCWSTR, LPWSTR *);
DWORD
build_version_dword
(
LPCWSTR
);
LPWSTR
build_directory_name
(
DWORD
,
...);
BOOL
create_full_pathW
(
const
WCHAR
*
path
);
BOOL
ACTION_VerifyComponentForAction
(
MSIPACKAGE
*
,
INT
,
INSTALLSTATE
);
BOOL
ACTION_VerifyComponentForAction
(
MSIPACKAGE
*
,
MSICOMPONENT
*
,
INSTALLSTATE
);
BOOL
ACTION_VerifyFeatureForAction
(
MSIPACKAGE
*
,
INT
,
INSTALLSTATE
);
void
reduce_to_longfilename
(
WCHAR
*
);
void
reduce_to_shortfilename
(
WCHAR
*
);
...
...
dlls/msi/classes.c
View file @
38d67a45
...
...
@@ -253,8 +253,7 @@ static INT load_class(MSIPACKAGE* package, MSIRECORD *row)
sz
=
IDENTIFIER_SIZE
;
MSI_RecordGetStringW
(
row
,
2
,
package
->
classes
[
index
].
Context
,
&
sz
);
buffer
=
MSI_RecordGetString
(
row
,
3
);
package
->
classes
[
index
].
ComponentIndex
=
get_loaded_component
(
package
,
buffer
);
package
->
classes
[
index
].
Component
=
get_loaded_component
(
package
,
buffer
);
package
->
classes
[
index
].
ProgIDText
=
load_dynamic_stringW
(
row
,
4
);
package
->
classes
[
index
].
ProgIDIndex
=
...
...
@@ -466,8 +465,7 @@ static INT load_extension(MSIPACKAGE* package, MSIRECORD *row)
debugstr_w
(
package
->
extensions
[
index
].
Extension
));
buffer
=
MSI_RecordGetString
(
row
,
2
);
package
->
extensions
[
index
].
ComponentIndex
=
get_loaded_component
(
package
,
buffer
);
package
->
extensions
[
index
].
Component
=
get_loaded_component
(
package
,
buffer
);
package
->
extensions
[
index
].
ProgIDText
=
load_dynamic_stringW
(
row
,
3
);
package
->
extensions
[
index
].
ProgIDIndex
=
load_given_progid
(
package
,
...
...
@@ -574,10 +572,10 @@ static UINT iterate_load_verb(MSIRECORD *row, LPVOID param)
static
UINT
iterate_all_classes
(
MSIRECORD
*
rec
,
LPVOID
param
)
{
MSICOMPONENT
*
comp
;
LPCWSTR
clsid
;
LPCWSTR
context
;
LPCWSTR
buffer
;
INT
component_index
;
MSIPACKAGE
*
package
=
(
MSIPACKAGE
*
)
param
;
INT
i
;
BOOL
match
=
FALSE
;
...
...
@@ -585,7 +583,7 @@ static UINT iterate_all_classes(MSIRECORD *rec, LPVOID param)
clsid
=
MSI_RecordGetString
(
rec
,
1
);
context
=
MSI_RecordGetString
(
rec
,
2
);
buffer
=
MSI_RecordGetString
(
rec
,
3
);
comp
onent_index
=
get_loaded_component
(
package
,
buffer
);
comp
=
get_loaded_component
(
package
,
buffer
);
for
(
i
=
0
;
i
<
package
->
loaded_classes
;
i
++
)
{
...
...
@@ -593,7 +591,7 @@ static UINT iterate_all_classes(MSIRECORD *rec, LPVOID param)
continue
;
if
(
strcmpW
(
context
,
package
->
classes
[
i
].
Context
))
continue
;
if
(
comp
onent_index
==
package
->
classes
[
i
].
ComponentIndex
)
if
(
comp
==
package
->
classes
[
i
].
Component
)
{
match
=
TRUE
;
break
;
...
...
@@ -625,22 +623,22 @@ static VOID load_all_classes(MSIPACKAGE *package)
static
UINT
iterate_all_extensions
(
MSIRECORD
*
rec
,
LPVOID
param
)
{
MSICOMPONENT
*
comp
;
LPCWSTR
buffer
;
LPCWSTR
extension
;
INT
component_index
;
MSIPACKAGE
*
package
=
(
MSIPACKAGE
*
)
param
;
BOOL
match
=
FALSE
;
INT
i
;
extension
=
MSI_RecordGetString
(
rec
,
1
);
buffer
=
MSI_RecordGetString
(
rec
,
2
);
comp
onent_index
=
get_loaded_component
(
package
,
buffer
);
comp
=
get_loaded_component
(
package
,
buffer
);
for
(
i
=
0
;
i
<
package
->
loaded_extensions
;
i
++
)
{
if
(
strcmpiW
(
extension
,
package
->
extensions
[
i
].
Extension
))
continue
;
if
(
comp
onent_index
==
package
->
extensions
[
i
].
ComponentIndex
)
if
(
comp
==
package
->
extensions
[
i
].
Component
)
{
match
=
TRUE
;
break
;
...
...
@@ -920,16 +918,15 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
for
(
i
=
0
;
i
<
package
->
loaded_classes
;
i
++
)
{
INT
index
,
f_index
;
MSICOMPONENT
*
comp
;
INT
index
,
f_index
;
DWORD
size
,
sz
;
LPWSTR
argument
;
if
(
package
->
classes
[
i
].
ComponentIndex
<
0
)
{
comp
=
package
->
classes
[
i
].
Component
;
if
(
!
comp
)
continue
;
}
index
=
package
->
classes
[
i
].
ComponentIndex
;
f_index
=
package
->
classes
[
i
].
FeatureIndex
;
/*
...
...
@@ -963,7 +960,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
Description
)
+
1
)
*
sizeof
(
WCHAR
));
RegCreateKeyW
(
hkey2
,
package
->
classes
[
i
].
Context
,
&
hkey3
);
index
=
get_loaded_file
(
package
,
package
->
components
[
index
].
KeyPath
);
index
=
get_loaded_file
(
package
,
comp
->
KeyPath
);
/* the context server is a short path name
...
...
@@ -1425,14 +1422,13 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
for
(
i
=
0
;
i
<
package
->
loaded_extensions
;
i
++
)
{
WCHAR
extension
[
257
];
INT
index
,
f_index
;
INT
f_index
;
index
=
package
->
extensions
[
i
].
ComponentIndex
;
f_index
=
package
->
extensions
[
i
].
FeatureIndex
;
if
(
index
<
0
)
if
(
!
package
->
extensions
[
i
].
Component
)
continue
;
f_index
=
package
->
extensions
[
i
].
FeatureIndex
;
/*
* yes. MSDN says that these are based on _Feature_ not on
* Component. So verify the feature is to be installed
...
...
@@ -1512,7 +1508,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
/* do all the verbs */
for
(
v
=
0
;
v
<
package
->
extensions
[
i
].
VerbCount
;
v
++
)
register_verb
(
package
,
progid
,
&
package
->
components
[
index
]
,
package
->
extensions
[
i
].
Component
,
&
package
->
extensions
[
i
],
&
package
->
verbs
[
package
->
extensions
[
i
].
Verbs
[
v
]],
&
Sequence
);
...
...
dlls/msi/files.c
View file @
38d67a45
...
...
@@ -56,14 +56,13 @@ extern const WCHAR szRemoveFiles[];
static
const
WCHAR
cszTempFolder
[]
=
{
'T'
,
'e'
,
'm'
,
'p'
,
'F'
,
'o'
,
'l'
,
'd'
,
'e'
,
'r'
,
0
};
inline
static
UINT
create_component_directory
(
MSIPACKAGE
*
package
,
INT
component
)
static
UINT
create_component_directory
(
MSIPACKAGE
*
package
,
MSICOMPONENT
*
comp
)
{
UINT
rc
=
ERROR_SUCCESS
;
MSIFOLDER
*
folder
;
LPWSTR
install_path
;
install_path
=
resolve_folder
(
package
,
package
->
components
[
component
].
Directory
,
FALSE
,
FALSE
,
&
folder
);
install_path
=
resolve_folder
(
package
,
comp
->
Directory
,
FALSE
,
FALSE
,
&
folder
);
if
(
!
install_path
)
return
ERROR_FUNCTION_FAILED
;
...
...
@@ -683,7 +682,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
if
(
file
->
Temporary
)
continue
;
if
(
!
ACTION_VerifyComponentForAction
(
package
,
file
->
Component
Index
,
if
(
!
ACTION_VerifyComponentForAction
(
package
,
file
->
Component
,
INSTALLSTATE_LOCAL
))
{
ui_progress
(
package
,
2
,
file
->
FileSize
,
0
,
0
);
...
...
@@ -700,13 +699,12 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
TRACE
(
"Pass 1: %s
\n
"
,
debugstr_w
(
file
->
File
));
create_component_directory
(
package
,
file
->
Component
Index
);
create_component_directory
(
package
,
file
->
Component
);
/* recalculate file paths because things may have changed */
if
(
file
->
ComponentIndex
>=
0
)
comp
=
&
package
->
components
[
file
->
ComponentIndex
];
else
comp
=
file
->
Component
;
if
(
!
comp
)
{
ERR
(
"No Component for file
\n
"
);
continue
;
...
...
@@ -724,7 +722,6 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
for
(
index
=
0
;
index
<
package
->
loaded_files
;
index
++
)
{
MSIFILE
*
file
;
MSICOMPONENT
*
comp
=
NULL
;
file
=
&
package
->
files
[
index
];
...
...
@@ -735,10 +732,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
{
TRACE
(
"Pass 2: %s
\n
"
,
debugstr_w
(
file
->
File
));
if
(
file
->
ComponentIndex
>=
0
)
comp
=
&
package
->
components
[
file
->
ComponentIndex
];
rc
=
ready_media_for_file
(
package
,
index
,
comp
);
rc
=
ready_media_for_file
(
package
,
index
,
file
->
Component
);
if
(
rc
!=
ERROR_SUCCESS
)
{
ERR
(
"Unable to ready media
\n
"
);
...
...
@@ -808,27 +802,25 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param)
WCHAR
dest_name
[
0x100
];
LPWSTR
dest_path
,
dest
;
LPCWSTR
file_key
,
component
;
INT
component_index
;
DWORD
sz
;
DWORD
rc
;
MSICOMPONENT
*
comp
;
component
=
MSI_RecordGetString
(
row
,
2
);
comp
onent_index
=
get_loaded_component
(
package
,
component
);
comp
=
get_loaded_component
(
package
,
component
);
if
(
!
ACTION_VerifyComponentForAction
(
package
,
component_index
,
INSTALLSTATE_LOCAL
))
if
(
!
ACTION_VerifyComponentForAction
(
package
,
comp
,
INSTALLSTATE_LOCAL
))
{
TRACE
(
"Skipping copy due to disabled component %s
\n
"
,
debugstr_w
(
component
));
/* the action taken was the same as the current install state */
package
->
components
[
component_index
].
Action
=
package
->
components
[
component_index
].
Installed
;
comp
->
Action
=
comp
->
Installed
;
return
ERROR_SUCCESS
;
}
package
->
components
[
component_index
].
Action
=
INSTALLSTATE_LOCAL
;
comp
->
Action
=
INSTALLSTATE_LOCAL
;
file_key
=
MSI_RecordGetString
(
row
,
3
);
if
(
!
file_key
)
...
...
dlls/msi/format.c
View file @
38d67a45
...
...
@@ -79,18 +79,17 @@ static const WCHAR* scanW(LPCWSTR buf, WCHAR token, DWORD len)
static
LPWSTR
deformat_component
(
MSIPACKAGE
*
package
,
LPCWSTR
key
,
DWORD
*
sz
)
{
LPWSTR
value
=
NULL
;
INT
index
;
MSICOMPONENT
*
comp
;
*
sz
=
0
;
if
(
!
package
)
return
NULL
;
ERR
(
"POORLY HANDLED DEFORMAT.. [$componentkey]
\n
"
);
index
=
get_loaded_component
(
package
,
key
);
if
(
index
>=
0
)
comp
=
get_loaded_component
(
package
,
key
);
if
(
comp
)
{
value
=
resolve_folder
(
package
,
package
->
components
[
index
].
Directory
,
FALSE
,
FALSE
,
NULL
);
value
=
resolve_folder
(
package
,
comp
->
Directory
,
FALSE
,
FALSE
,
NULL
);
*
sz
=
(
strlenW
(
value
))
*
sizeof
(
WCHAR
);
}
...
...
dlls/msi/helpers.c
View file @
38d67a45
...
...
@@ -167,20 +167,16 @@ LPWSTR load_dynamic_property(MSIPACKAGE *package, LPCWSTR prop, UINT* rc)
return
str
;
}
int
get_loaded_component
(
MSIPACKAGE
*
package
,
LPCWSTR
Component
)
MSICOMPONENT
*
get_loaded_component
(
MSIPACKAGE
*
package
,
LPCWSTR
Component
)
{
int
rc
=
-
1
;
DWORD
i
;
MSICOMPONENT
*
comp
=
NULL
;
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
LIST_FOR_EACH_ENTRY
(
comp
,
&
package
->
components
,
MSICOMPONENT
,
entry
)
{
if
(
strcmpW
(
Component
,
package
->
components
[
i
].
Component
)
==
0
)
{
rc
=
i
;
break
;
}
if
(
lstrcmpW
(
Component
,
comp
->
Component
)
==
0
)
return
comp
;
}
return
rc
;
return
NULL
;
}
int
get_loaded_feature
(
MSIPACKAGE
*
package
,
LPCWSTR
Feature
)
...
...
@@ -487,11 +483,14 @@ void ACTION_free_package_structures( MSIPACKAGE* package)
if
(
package
->
folders
&&
package
->
loaded_folders
>
0
)
HeapFree
(
GetProcessHeap
(),
0
,
package
->
folders
);
for
(
i
=
0
;
i
<
package
->
loaded_components
;
i
++
)
HeapFree
(
GetProcessHeap
(),
0
,
package
->
components
[
i
].
FullKeypath
);
if
(
package
->
components
&&
package
->
loaded_components
>
0
)
HeapFree
(
GetProcessHeap
(),
0
,
package
->
components
);
LIST_FOR_EACH_SAFE
(
item
,
cursor
,
&
package
->
components
)
{
MSICOMPONENT
*
comp
=
LIST_ENTRY
(
item
,
MSICOMPONENT
,
entry
);
list_remove
(
&
comp
->
entry
);
HeapFree
(
GetProcessHeap
(),
0
,
comp
->
FullKeypath
);
HeapFree
(
GetProcessHeap
(),
0
,
comp
);
}
for
(
i
=
0
;
i
<
package
->
loaded_files
;
i
++
)
{
...
...
@@ -762,13 +761,13 @@ void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record)
msiobj_release
(
&
row
->
hdr
);
}
BOOL
ACTION_VerifyComponentForAction
(
MSIPACKAGE
*
package
,
INT
index
,
BOOL
ACTION_VerifyComponentForAction
(
MSIPACKAGE
*
package
,
MSICOMPONENT
*
comp
,
INSTALLSTATE
check
)
{
if
(
package
->
components
[
index
].
Installed
==
check
)
if
(
comp
->
Installed
==
check
)
return
FALSE
;
if
(
package
->
components
[
index
].
ActionRequest
==
check
)
if
(
comp
->
ActionRequest
==
check
)
return
TRUE
;
else
return
FALSE
;
...
...
@@ -867,8 +866,8 @@ void ACTION_UpdateComponentStates(MSIPACKAGE *package, LPCWSTR szFeature)
LIST_FOR_EACH_ENTRY
(
cl
,
feature
->
Components
,
ComponentList
,
entry
)
{
MSICOMPONENT
*
component
=
&
package
->
components
[
cl
->
component
]
;
MSICOMPONENT
*
component
=
cl
->
component
;
TRACE
(
"MODIFYING(%i): Component %s (Installed %i, Action %i, Request %i)
\n
"
,
newstate
,
debugstr_w
(
component
->
Component
),
component
->
Installed
,
component
->
Action
,
component
->
ActionRequest
);
...
...
dlls/msi/install.c
View file @
38d67a45
...
...
@@ -545,20 +545,20 @@ UINT WINAPI MsiGetComponentStateA(MSIHANDLE hInstall, LPSTR szComponent,
UINT
MSI_GetComponentStateW
(
MSIPACKAGE
*
package
,
LPWSTR
szComponent
,
INSTALLSTATE
*
piInstalled
,
INSTALLSTATE
*
piAction
)
{
INT
index
;
MSICOMPONENT
*
comp
;
TRACE
(
"%p %s %p %p
\n
"
,
package
,
debugstr_w
(
szComponent
),
piInstalled
,
piAction
);
index
=
get_loaded_component
(
package
,
szComponent
);
if
(
index
<
0
)
comp
=
get_loaded_component
(
package
,
szComponent
);
if
(
!
comp
)
return
ERROR_UNKNOWN_COMPONENT
;
if
(
piInstalled
)
*
piInstalled
=
package
->
components
[
index
].
Installed
;
*
piInstalled
=
comp
->
Installed
;
if
(
piAction
)
*
piAction
=
package
->
components
[
index
].
Action
;
*
piAction
=
comp
->
Action
;
TRACE
(
"states (%i, %i)
\n
"
,
(
piInstalled
)
?*
piInstalled
:-
1
,(
piAction
)
?*
piAction
:-
1
);
...
...
dlls/msi/msipriv.h
View file @
38d67a45
...
...
@@ -190,8 +190,7 @@ typedef struct tagMSIPACKAGE
UINT
loaded_features
;
struct
tagMSIFOLDER
*
folders
;
UINT
loaded_folders
;
struct
tagMSICOMPONENT
*
components
;
UINT
loaded_components
;
struct
list
components
;
struct
tagMSIFILE
*
files
;
UINT
loaded_files
;
LPWSTR
ActionFormat
;
...
...
dlls/msi/package.c
View file @
38d67a45
...
...
@@ -379,11 +379,10 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db )
package
->
db
=
db
;
package
->
features
=
NULL
;
package
->
folders
=
NULL
;
package
->
components
=
NULL
;
list_init
(
&
package
->
components
)
;
package
->
files
=
NULL
;
package
->
loaded_features
=
0
;
package
->
loaded_folders
=
0
;
package
->
loaded_components
=
0
;
package
->
loaded_files
=
0
;
package
->
ActionFormat
=
NULL
;
package
->
LastAction
=
NULL
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment