Wine-Devel
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 4 participants
- 84544 discussions
Oct. 27, 2020
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msi/action.c | 1340 ++++++++++++++-------------------------------
1 file changed, 407 insertions(+), 933 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index d02860e4d71..ed1d0c8ffcc 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -46,126 +46,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(msi);
-static const WCHAR szCreateFolders[] =
- {'C','r','e','a','t','e','F','o','l','d','e','r','s',0};
-static const WCHAR szCostFinalize[] =
- {'C','o','s','t','F','i','n','a','l','i','z','e',0};
-static const WCHAR szWriteRegistryValues[] =
- {'W','r','i','t','e','R','e','g','i','s','t','r','y','V','a','l','u','e','s',0};
-static const WCHAR szFileCost[] =
- {'F','i','l','e','C','o','s','t',0};
-static const WCHAR szInstallInitialize[] =
- {'I','n','s','t','a','l','l','I','n','i','t','i','a','l','i','z','e',0};
-static const WCHAR szInstallValidate[] =
- {'I','n','s','t','a','l','l','V','a','l','i','d','a','t','e',0};
-static const WCHAR szLaunchConditions[] =
- {'L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','s',0};
-static const WCHAR szProcessComponents[] =
- {'P','r','o','c','e','s','s','C','o','m','p','o','n','e','n','t','s',0};
-static const WCHAR szRegisterTypeLibraries[] =
- {'R','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r','i','e','s',0};
-static const WCHAR szCreateShortcuts[] =
- {'C','r','e','a','t','e','S','h','o','r','t','c','u','t','s',0};
-static const WCHAR szPublishProduct[] =
- {'P','u','b','l','i','s','h','P','r','o','d','u','c','t',0};
-static const WCHAR szWriteIniValues[] =
- {'W','r','i','t','e','I','n','i','V','a','l','u','e','s',0};
-static const WCHAR szSelfRegModules[] =
- {'S','e','l','f','R','e','g','M','o','d','u','l','e','s',0};
-static const WCHAR szPublishFeatures[] =
- {'P','u','b','l','i','s','h','F','e','a','t','u','r','e','s',0};
-static const WCHAR szRegisterProduct[] =
- {'R','e','g','i','s','t','e','r','P','r','o','d','u','c','t',0};
-static const WCHAR szInstallExecute[] =
- {'I','n','s','t','a','l','l','E','x','e','c','u','t','e',0};
-static const WCHAR szInstallExecuteAgain[] =
- {'I','n','s','t','a','l','l','E','x','e','c','u','t','e','A','g','a','i','n',0};
-static const WCHAR szInstallFinalize[] =
- {'I','n','s','t','a','l','l','F','i','n','a','l','i','z','e',0};
-static const WCHAR szForceReboot[] =
- {'F','o','r','c','e','R','e','b','o','o','t',0};
-static const WCHAR szResolveSource[] =
- {'R','e','s','o','l','v','e','S','o','u','r','c','e',0};
-static const WCHAR szAllocateRegistrySpace[] =
- {'A','l','l','o','c','a','t','e','R','e','g','i','s','t','r','y','S','p','a','c','e',0};
-static const WCHAR szBindImage[] =
- {'B','i','n','d','I','m','a','g','e',0};
-static const WCHAR szDeleteServices[] =
- {'D','e','l','e','t','e','S','e','r','v','i','c','e','s',0};
-static const WCHAR szDisableRollback[] =
- {'D','i','s','a','b','l','e','R','o','l','l','b','a','c','k',0};
-static const WCHAR szExecuteAction[] =
- {'E','x','e','c','u','t','e','A','c','t','i','o','n',0};
-static const WCHAR szInstallAdminPackage[] =
- {'I','n','s','t','a','l','l','A','d','m','i','n','P','a','c','k','a','g','e',0};
-static const WCHAR szInstallSFPCatalogFile[] =
- {'I','n','s','t','a','l','l','S','F','P','C','a','t','a','l','o','g','F','i','l','e',0};
-static const WCHAR szIsolateComponents[] =
- {'I','s','o','l','a','t','e','C','o','m','p','o','n','e','n','t','s',0};
-static const WCHAR szMigrateFeatureStates[] =
- {'M','i','g','r','a','t','e','F','e','a','t','u','r','e','S','t','a','t','e','s',0};
-static const WCHAR szInstallODBC[] =
- {'I','n','s','t','a','l','l','O','D','B','C',0};
-static const WCHAR szInstallServices[] =
- {'I','n','s','t','a','l','l','S','e','r','v','i','c','e','s',0};
-static const WCHAR szPublishComponents[] =
- {'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','s',0};
-static const WCHAR szRegisterComPlus[] =
- {'R','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szRegisterUser[] =
- {'R','e','g','i','s','t','e','r','U','s','e','r',0};
-static const WCHAR szRemoveEnvironmentStrings[] =
- {'R','e','m','o','v','e','E','n','v','i','r','o','n','m','e','n','t','S','t','r','i','n','g','s',0};
-static const WCHAR szRemoveExistingProducts[] =
- {'R','e','m','o','v','e','E','x','i','s','t','i','n','g','P','r','o','d','u','c','t','s',0};
-static const WCHAR szRemoveFolders[] =
- {'R','e','m','o','v','e','F','o','l','d','e','r','s',0};
-static const WCHAR szRemoveIniValues[] =
- {'R','e','m','o','v','e','I','n','i','V','a','l','u','e','s',0};
-static const WCHAR szRemoveODBC[] =
- {'R','e','m','o','v','e','O','D','B','C',0};
-static const WCHAR szRemoveRegistryValues[] =
- {'R','e','m','o','v','e','R','e','g','i','s','t','r','y','V','a','l','u','e','s',0};
-static const WCHAR szRemoveShortcuts[] =
- {'R','e','m','o','v','e','S','h','o','r','t','c','u','t','s',0};
-static const WCHAR szRMCCPSearch[] =
- {'R','M','C','C','P','S','e','a','r','c','h',0};
-static const WCHAR szScheduleReboot[] =
- {'S','c','h','e','d','u','l','e','R','e','b','o','o','t',0};
-static const WCHAR szSelfUnregModules[] =
- {'S','e','l','f','U','n','r','e','g','M','o','d','u','l','e','s',0};
-static const WCHAR szSetODBCFolders[] =
- {'S','e','t','O','D','B','C','F','o','l','d','e','r','s',0};
-static const WCHAR szStartServices[] =
- {'S','t','a','r','t','S','e','r','v','i','c','e','s',0};
-static const WCHAR szStopServices[] =
- {'S','t','o','p','S','e','r','v','i','c','e','s',0};
-static const WCHAR szUnpublishComponents[] =
- {'U','n','p','u','b','l','i','s','h', 'C','o','m','p','o','n','e','n','t','s',0};
-static const WCHAR szUnpublishFeatures[] =
- {'U','n','p','u','b','l','i','s','h','F','e','a','t','u','r','e','s',0};
-static const WCHAR szUnpublishProduct[] =
- {'U','n','p','u','b','l','i','s','h','P','r','o','d','u','c','t',0};
-static const WCHAR szUnregisterComPlus[] =
- {'U','n','r','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szUnregisterTypeLibraries[] =
- {'U','n','r','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r','i','e','s',0};
-static const WCHAR szValidateProductID[] =
- {'V','a','l','i','d','a','t','e','P','r','o','d','u','c','t','I','D',0};
-static const WCHAR szWriteEnvironmentStrings[] =
- {'W','r','i','t','e','E','n','v','i','r','o','n','m','e','n','t','S','t','r','i','n','g','s',0};
-static const WCHAR szINSTALL[] =
- {'I','N','S','T','A','L','L',0};
-
static INT ui_actionstart(MSIPACKAGE *package, LPCWSTR action, LPCWSTR description, LPCWSTR template)
{
- static const WCHAR query[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','A','c','t','i','o','n','T','e','x','t','`',' ','W','H','E','R','E',' ',
- '`','A','c','t','i','o','n','`',' ','=',' ','\'','%','s','\'',0};
MSIRECORD *row, *textrow;
INT rc;
- textrow = MSI_QueryGetRecord(package->db, query, action);
+ textrow = MSI_QueryGetRecord(package->db, L"SELECT * FROM `ActionText` WHERE `Action` = '%s'", action);
if (textrow)
{
description = MSI_RecordGetString(textrow, 2);
@@ -366,7 +252,7 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine,
TRACE("Found commandline property %s = %s\n", debugstr_w(prop), debugstr_w(val));
r = msi_set_property( package->db, prop, val, -1 );
- if (r == ERROR_SUCCESS && !wcscmp( prop, szSourceDir ))
+ if (r == ERROR_SUCCESS && !wcscmp( prop, L"SourceDir" ))
msi_reset_source_folders( package );
msi_free( val );
@@ -447,14 +333,10 @@ WCHAR **msi_split_string( const WCHAR *str, WCHAR sep )
static BOOL ui_sequence_exists( MSIPACKAGE *package )
{
- static const WCHAR query [] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e','`',' ',
- 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ','>',' ','0',0};
MSIQUERY *view;
DWORD count = 0;
- if (!(MSI_DatabaseOpenViewW( package->db, query, &view )))
+ if (!(MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `InstallUISequence` WHERE `Sequence` > 0", &view )))
{
MSI_IterateRecords( view, &count, NULL, package );
msiobj_release( &view->hdr );
@@ -467,7 +349,7 @@ UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
WCHAR *source, *check, *p, *db;
DWORD len;
- if (!(db = msi_dup_property( package->db, szOriginalDatabase )))
+ if (!(db = msi_dup_property( package->db, L"OriginalDatabase" )))
return ERROR_OUTOFMEMORY;
if (!(p = wcsrchr( db, '\\' )) && !(p = wcsrchr( db, '/' )))
@@ -480,18 +362,18 @@ UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
lstrcpynW( source, db, len );
msi_free( db );
- check = msi_dup_property( package->db, szSourceDir );
+ check = msi_dup_property( package->db, L"SourceDir" );
if (!check || replace)
{
- UINT r = msi_set_property( package->db, szSourceDir, source, -1 );
+ UINT r = msi_set_property( package->db, L"SourceDir", source, -1 );
if (r == ERROR_SUCCESS)
msi_reset_source_folders( package );
}
msi_free( check );
- check = msi_dup_property( package->db, szSOURCEDIR );
+ check = msi_dup_property( package->db, L"SOURCEDIR" );
if (!check || replace)
- msi_set_property( package->db, szSOURCEDIR, source, -1 );
+ msi_set_property( package->db, L"SOURCEDIR", source, -1 );
msi_free( check );
msi_free( source );
@@ -509,7 +391,7 @@ UINT msi_set_context(MSIPACKAGE *package)
UINT r = msi_locate_product( package->ProductCode, &package->Context );
if (r != ERROR_SUCCESS)
{
- int num = msi_get_property_int( package->db, szAllUsers, 0 );
+ int num = msi_get_property_int( package->db, L"ALLUSERS", 0 );
if (num == 1 || num == 2)
package->Context = MSIINSTALLCONTEXT_MACHINE;
else
@@ -562,17 +444,12 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param)
UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR table )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','%','s','`',
- ' ','W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ',
- '>',' ','0',' ','O','R','D','E','R',' ','B','Y',' ',
- '`','S','e','q','u','e','n','c','e','`',0};
MSIQUERY *view;
UINT r;
TRACE("%p %s\n", package, debugstr_w(table));
- r = MSI_OpenQuery( package->db, &view, query, table );
+ r = MSI_OpenQuery( package->db, &view, L"SELECT * FROM `%s` WHERE `Sequence` > 0 ORDER BY `Sequence`", table );
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords( view, NULL, ITERATE_Actions, package );
@@ -583,12 +460,6 @@ UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR table )
static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
- '`','I','n','s','t','a','l','l','E','x','e','c','u','t','e',
- 'S','e','q','u','e','n','c','e','`',' ', 'W','H','E','R','E',' ',
- '`','S','e','q','u','e','n','c','e','`',' ', '>',' ','0',' ',
- 'O','R','D','E','R',' ', 'B','Y',' ','`','S','e','q','u','e','n','c','e','`',0};
MSIQUERY *view;
UINT rc;
@@ -600,12 +471,13 @@ static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package)
package->ExecuteSequenceRun = TRUE;
- rc = MSI_OpenQuery(package->db, &view, query);
+ rc = MSI_OpenQuery(package->db, &view,
+ L"SELECT * FROM `InstallExecuteSequence` WHERE `Sequence` > 0 ORDER BY `Sequence`");
if (rc == ERROR_SUCCESS)
{
TRACE("Running the actions\n");
- msi_set_property( package->db, szSourceDir, NULL, -1 );
+ msi_set_property( package->db, L"SourceDir", NULL, -1 );
rc = MSI_IterateRecords(view, NULL, ITERATE_Actions, package);
msiobj_release(&view->hdr);
}
@@ -614,18 +486,15 @@ static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package)
static UINT ACTION_ProcessUISequence(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e','`',' ',
- 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ','>',' ','0',' ',
- 'O','R','D','E','R',' ','B','Y',' ','`','S','e','q','u','e','n','c','e','`',0};
MSIQUERY *view;
UINT rc;
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db,
+ L"SELECT * FROM `InstallUISequence` WHERE `Sequence` > 0 ORDER BY `Sequence`",
+ &view);
if (rc == ERROR_SUCCESS)
{
- TRACE("Running the actions\n");
+ TRACE("Running the actions\n");
rc = MSI_IterateRecords(view, NULL, ITERATE_Actions, package);
msiobj_release(&view->hdr);
}
@@ -806,16 +675,13 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
static UINT ACTION_CreateFolders(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szCreateFolders);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"CreateFolders");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `CreateFolder`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -888,16 +754,13 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
static UINT ACTION_RemoveFolders( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveFolders);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveFolders");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `CreateFolder`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -938,16 +801,13 @@ static UINT load_component( MSIRECORD *row, LPVOID param )
UINT msi_load_all_components( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','o','m','p','o','n','e','n','t','`',0};
MSIQUERY *view;
UINT r;
if (!list_empty(&package->components))
return ERROR_SUCCESS;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Component`", &view );
if (r != ERROR_SUCCESS)
return r;
@@ -1008,13 +868,8 @@ static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
-static UINT load_feature(MSIRECORD * row, LPVOID param)
+static UINT load_feature(MSIRECORD *row, LPVOID param)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','`','C','o','m','p','o','n','e','n','t','_','`',
- ' ','F','R','O','M',' ','`','F','e','a','t','u','r','e',
- 'C','o','m','p','o','n','e','n','t','s','`',' ','W','H','E','R','E',' ',
- '`','F','e', 'a','t','u','r','e','_','`',' ','=','\'','%','s','\'',0};
MSIPACKAGE *package = param;
MSIFEATURE *feature;
MSIQUERY *view;
@@ -1029,7 +884,7 @@ static UINT load_feature(MSIRECORD * row, LPVOID param)
list_init( &feature->Children );
list_init( &feature->Components );
-
+
feature->Feature = msi_dup_record_field( row, 1 );
TRACE("Loading feature %s\n",debugstr_w(feature->Feature));
@@ -1040,7 +895,7 @@ static UINT load_feature(MSIRECORD * row, LPVOID param)
if (!MSI_RecordIsNull(row,5))
feature->Display = MSI_RecordGetInteger(row,5);
-
+
feature->Level= MSI_RecordGetInteger(row,6);
feature->Directory = msi_dup_record_field( row, 7 );
feature->Attributes = MSI_RecordGetInteger(row,8);
@@ -1053,7 +908,8 @@ static UINT load_feature(MSIRECORD * row, LPVOID param)
/* load feature components */
- rc = MSI_OpenQuery( package->db, &view, query, feature->Feature );
+ rc = MSI_OpenQuery( package->db, &view, L"SELECT `Component_` FROM `FeatureComponents` WHERE `Feature_` = '%s'",
+ feature->Feature );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1087,17 +943,13 @@ static UINT find_feature_children(MSIRECORD * row, LPVOID param)
UINT msi_load_all_features( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','F','e','a','t','u','r','e','`',' ','O','R','D','E','R',' ','B','Y',' ',
- '`','D','i','s','p','l','a','y','`',0};
MSIQUERY *view;
UINT r;
if (!list_empty(&package->features))
return ERROR_SUCCESS;
-
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Feature` ORDER BY `Display`", &view );
if (r != ERROR_SUCCESS)
return r;
@@ -1125,17 +977,13 @@ static LPWSTR folder_split_path(LPWSTR p, WCHAR ch)
static UINT load_file_hash(MSIPACKAGE *package, MSIFILE *file)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
- '`','M','s','i','F','i','l','e','H','a','s','h','`',' ',
- 'W','H','E','R','E',' ','`','F','i','l','e','_','`',' ','=',' ','\'','%','s','\'',0};
MSIQUERY *view = NULL;
MSIRECORD *row = NULL;
UINT r;
TRACE("%s\n", debugstr_w(file->File));
- r = MSI_OpenQuery(package->db, &view, query, file->File);
+ r = MSI_OpenQuery(package->db, &view, L"SELECT * FROM `MsiFileHash` WHERE `File_` = '%s'", file->File);
if (r != ERROR_SUCCESS)
goto done;
@@ -1161,13 +1009,8 @@ done:
static UINT load_file_disk_id( MSIPACKAGE *package, MSIFILE *file )
{
- MSIRECORD *row;
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','`','D','i','s','k','I','d','`',' ', 'F','R','O','M',' ',
- '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
- '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',' ','%','i',0};
-
- row = MSI_QueryGetRecord( package->db, query, file->Sequence );
+ MSIRECORD *row = MSI_QueryGetRecord( package->db, L"SELECT `DiskId` FROM `Media` WHERE `LastSequence` >= %d",
+ file->Sequence );
if (!row)
{
WARN("query failed\n");
@@ -1190,7 +1033,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
file = msi_alloc_zero( sizeof (MSIFILE) );
if (!file)
return ERROR_NOT_ENOUGH_MEMORY;
-
+
file->File = msi_dup_record_field( row, 1 );
component = MSI_RecordGetString( row, 2 );
@@ -1209,7 +1052,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
file->ShortName = msi_dup_record_field( row, 3 );
file->LongName = strdupW( folder_split_path(file->ShortName, '|'));
-
+
file->FileSize = MSI_RecordGetInteger( row, 4 );
file->Version = msi_dup_record_field( row, 5 );
file->Language = msi_dup_record_field( row, 6 );
@@ -1241,23 +1084,18 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
TRACE("File loaded (file %s sequence %u)\n", debugstr_w(file->File), file->Sequence);
list_add_tail( &package->files, &file->entry );
-
return ERROR_SUCCESS;
}
static UINT load_all_files(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
- '`','F','i','l','e','`',' ', 'O','R','D','E','R',' ','B','Y',' ',
- '`','S','e','q','u','e','n','c','e','`', 0};
MSIQUERY *view;
UINT rc;
if (!list_empty(&package->files))
return ERROR_SUCCESS;
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `File` ORDER BY `Sequence`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1281,14 +1119,10 @@ static UINT load_media( MSIRECORD *row, LPVOID param )
static UINT load_all_media( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`',
- 'M','e','d','i','a','`',' ','O','R','D','E','R',' ','B','Y',' ',
- '`','D','i','s','k','I','d','`',0};
MSIQUERY *view;
UINT r;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Media` ORDER BY `DiskId`", &view );
if (r != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1299,13 +1133,9 @@ static UINT load_all_media( MSIPACKAGE *package )
static UINT load_patch_disk_id( MSIPACKAGE *package, MSIFILEPATCH *patch )
{
- static const WCHAR query[] =
- {'S','E','L','E','C','T',' ','`','D','i','s','k','I','d','`',' ', 'F','R','O','M',' ',
- '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
- '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',' ','%','u',0};
- MSIRECORD *rec;
-
- if (!(rec = MSI_QueryGetRecord( package->db, query, patch->Sequence )))
+ MSIRECORD *rec = MSI_QueryGetRecord( package->db, L"SELECT `DiskId` FROM `Media` WHERE `LastSequence` >= %u",
+ patch->Sequence );
+ if (!rec)
{
WARN("query failed\n");
return ERROR_FUNCTION_FAILED;
@@ -1355,17 +1185,13 @@ static UINT load_patch(MSIRECORD *row, LPVOID param)
static UINT load_all_patches(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','P','a','t','c','h','`',' ','O','R','D','E','R',' ','B','Y',' ',
- '`','S','e','q','u','e','n','c','e','`',0};
MSIQUERY *view;
UINT rc;
if (!list_empty(&package->filepatches))
return ERROR_SUCCESS;
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `Patch` ORDER BY `Sequence`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1419,14 +1245,11 @@ static void mark_patched_components( MSIPACKAGE *package )
static UINT load_folder_persistence( MSIPACKAGE *package, MSIFOLDER *folder )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','r','e','a','t','e','F','o','l','d','e','r','`',' ','W','H','E','R','E',' ',
- '`','D','i','r','e','c','t','o','r','y','_','`',' ','=','\'','%','s','\'',0};
MSIQUERY *view;
folder->persistent = FALSE;
- if (!MSI_OpenQuery( package->db, &view, query, folder->Directory ))
+ if (!MSI_OpenQuery( package->db, &view, L"SELECT * FROM `CreateFolder` WHERE `Directory_` = '%s'",
+ folder->Directory ))
{
if (!MSI_ViewExecute( view, NULL ))
{
@@ -1446,7 +1269,7 @@ static UINT load_folder_persistence( MSIPACKAGE *package, MSIFOLDER *folder )
static UINT load_folder( MSIRECORD *row, LPVOID param )
{
MSIPACKAGE *package = param;
- static WCHAR szEmpty[] = { 0 };
+ static WCHAR szEmpty[] = {0};
LPWSTR p, tgt_short, tgt_long, src_short, src_long;
MSIFOLDER *folder;
@@ -1467,9 +1290,9 @@ static UINT load_folder( MSIRECORD *row, LPVOID param )
src_long = folder_split_path( src_short, '|' );
/* check for no-op dirs */
- if (tgt_short && !wcscmp( szDot, tgt_short ))
+ if (tgt_short && !wcscmp( L".", tgt_short ))
tgt_short = szEmpty;
- if (src_short && !wcscmp( szDot, src_short ))
+ if (src_short && !wcscmp( L".", src_short ))
src_short = szEmpty;
if (!tgt_long)
@@ -1527,16 +1350,13 @@ static UINT find_folder_children( MSIRECORD *row, LPVOID param )
static UINT load_all_folders( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','D','i','r','e','c','t','o','r','y','`',0};
MSIQUERY *view;
UINT r;
if (!list_empty(&package->folders))
return ERROR_SUCCESS;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Directory`", &view );
if (r != ERROR_SUCCESS)
return r;
@@ -1553,8 +1373,8 @@ static UINT load_all_folders( MSIPACKAGE *package )
static UINT ACTION_CostInitialize(MSIPACKAGE *package)
{
- msi_set_property( package->db, szCostingComplete, szZero, -1 );
- msi_set_property( package->db, szRootDrive, szCRoot, -1 );
+ msi_set_property( package->db, L"CostingComplete", L"0", -1 );
+ msi_set_property( package->db, L"ROOTDRIVE", L"C:\\", -1 );
load_all_folders( package );
msi_load_all_components( package );
@@ -1622,7 +1442,7 @@ static void get_client_counts( MSIPACKAGE *package )
{
if (!comp->ComponentId) continue;
- if (MSIREG_OpenUserDataComponentKey( comp->ComponentId, szLocalSid, &hkey, FALSE ) &&
+ if (MSIREG_OpenUserDataComponentKey( comp->ComponentId, L"S-1-5-18", &hkey, FALSE ) &&
MSIREG_OpenUserDataComponentKey( comp->ComponentId, NULL, &hkey, FALSE ))
{
comp->num_clients = 0;
@@ -1687,8 +1507,8 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
{
LPWSTR override;
MSIFEATURE *feature;
- BOOL remove = !wcscmp(property, szRemove);
- BOOL reinstall = !wcscmp(property, szReinstall);
+ BOOL remove = !wcscmp(property, L"REMOVE");
+ BOOL reinstall = !wcscmp(property, L"REINSTALL");
override = msi_dup_property( package->db, property );
if (!override)
@@ -1704,7 +1524,7 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
else if (remove)
state = (feature->Installed == INSTALLSTATE_ABSENT ? INSTALLSTATE_UNKNOWN : INSTALLSTATE_ABSENT);
- if (!wcsicmp( override, szAll ))
+ if (!wcsicmp( override, L"ALL" ))
{
feature->Action = state;
feature->ActionRequest = state;
@@ -1741,12 +1561,6 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
static BOOL process_overrides( MSIPACKAGE *package, int level )
{
- static const WCHAR szAddLocal[] =
- {'A','D','D','L','O','C','A','L',0};
- static const WCHAR szAddSource[] =
- {'A','D','D','S','O','U','R','C','E',0};
- static const WCHAR szAdvertise[] =
- {'A','D','V','E','R','T','I','S','E',0};
BOOL ret = FALSE;
/* all these activation/deactivation things happen in order and things
@@ -1765,14 +1579,14 @@ static BOOL process_overrides( MSIPACKAGE *package, int level )
* 10 FILEADDSOURCE
* 11 FILEADDDEFAULT
*/
- ret |= process_state_property( package, level, szAddLocal, INSTALLSTATE_LOCAL );
- ret |= process_state_property( package, level, szRemove, INSTALLSTATE_ABSENT );
- ret |= process_state_property( package, level, szAddSource, INSTALLSTATE_SOURCE );
- ret |= process_state_property( package, level, szReinstall, INSTALLSTATE_UNKNOWN );
- ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED );
+ ret |= process_state_property( package, level, L"ADDLOCAL", INSTALLSTATE_LOCAL );
+ ret |= process_state_property( package, level, L"REMOVE", INSTALLSTATE_ABSENT );
+ ret |= process_state_property( package, level, L"ADDSOURCE", INSTALLSTATE_SOURCE );
+ ret |= process_state_property( package, level, L"REINSTALL", INSTALLSTATE_UNKNOWN );
+ ret |= process_state_property( package, level, L"ADVERTISE", INSTALLSTATE_ADVERTISED );
if (ret)
- msi_set_property( package->db, szPreselected, szOne, -1 );
+ msi_set_property( package->db, L"Preselected", L"1", -1 );
return ret;
}
@@ -1824,9 +1638,9 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
TRACE("Checking Install Level\n");
- level = msi_get_property_int(package->db, szInstallLevel, 1);
+ level = msi_get_property_int(package->db, L"INSTALLLEVEL", 1);
- if (msi_get_property_int( package->db, szPreselected, 0 ))
+ if (msi_get_property_int( package->db, L"Preselected", 0 ))
{
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
@@ -1847,7 +1661,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
}
}
}
- else if (!msi_get_property_int( package->db, szInstalled, 0 ))
+ else if (!msi_get_property_int( package->db, L"Installed", 0 ))
{
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
@@ -2141,7 +1955,7 @@ static WCHAR *create_temp_dir( MSIDATABASE *db )
WCHAR tmp[MAX_PATH];
UINT len = ARRAY_SIZE( tmp );
- if (msi_get_property( db, szTempFolder, tmp, &len ) ||
+ if (msi_get_property( db, L"TempFolder", tmp, &len ) ||
GetFileAttributesW( tmp ) != FILE_ATTRIBUTE_DIRECTORY)
{
GetTempPathW( MAX_PATH, tmp );
@@ -2153,7 +1967,7 @@ static WCHAR *create_temp_dir( MSIDATABASE *db )
{
for (;;)
{
- if (!GetTempFileNameW( db->tempfolder, szMsi, ++id, ret ))
+ if (!GetTempFileNameW( db->tempfolder, L"msi", ++id, ret ))
{
msi_free( ret );
return NULL;
@@ -2207,7 +2021,7 @@ WCHAR *msi_build_directory_name( DWORD count, ... )
const WCHAR *str = va_arg( va, const WCHAR * );
if (!str) continue;
lstrcatW( dir, str );
- if ( i + 1 != count && dir[0] && dir[lstrlenW( dir ) - 1] != '\\') lstrcatW( dir, szBackSlash );
+ if ( i + 1 != count && dir[0] && dir[lstrlenW( dir ) - 1] != '\\') lstrcatW( dir, L"\\" );
}
va_end( va );
return dir;
@@ -2345,7 +2159,7 @@ static WCHAR *get_install_location( MSIPACKAGE *package )
if (!package->ProductCode) return NULL;
if (MSIREG_OpenInstallProps( package->ProductCode, package->Context, NULL, &hkey, FALSE )) return NULL;
- if ((path = msi_reg_get_val_str( hkey, szInstallLocation )) && !path[0])
+ if ((path = msi_reg_get_val_str( hkey, L"InstallLocation" )) && !path[0])
{
msi_free( path );
path = NULL;
@@ -2364,12 +2178,12 @@ void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL loa
if (!(folder = msi_get_loaded_folder( package, name ))) return;
- if (!wcscmp( folder->Directory, szTargetDir )) /* special resolving for target root dir */
+ if (!wcscmp( folder->Directory, L"TARGETDIR" )) /* special resolving for target root dir */
{
if (!(path = get_install_location( package )) &&
- (!load_prop || !(path = msi_dup_property( package->db, szTargetDir ))))
+ (!load_prop || !(path = msi_dup_property( package->db, L"TARGETDIR" ))))
{
- path = msi_dup_property( package->db, szRootDrive );
+ path = msi_dup_property( package->db, L"ROOTDRIVE" );
}
}
else if (!load_prop || !(path = msi_dup_property( package->db, folder->Directory )))
@@ -2412,33 +2226,13 @@ static ULONGLONG get_volume_space_required( MSIPACKAGE *package )
static UINT ACTION_CostFinalize(MSIPACKAGE *package)
{
- static const WCHAR query[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','o','n','d','i','t','i','o','n','`',0};
- static const WCHAR szOutOfDiskSpace[] =
- {'O','u','t','O','f','D','i','s','k','S','p','a','c','e',0};
- static const WCHAR szPrimaryFolder[] =
- {'P','R','I','M','A','R','Y','F','O','L','D','E','R',0};
- static const WCHAR szPrimaryVolumePath[] =
- {'P','r','i','m','a','r','y','V','o','l','u','m','e','P','a','t','h',0};
- static const WCHAR szPrimaryVolumeSpaceAvailable[] =
- {'P','r','i','m','a','r','y','V','o','l','u','m','e','S','p','a','c','e',
- 'A','v','a','i','l','a','b','l','e',0};
- static const WCHAR szPrimaryVolumeSpaceRequired[] =
- {'P','r','i','m','a','r','y','V','o','l','u','m','e','S','p','a','c','e',
- 'R','e','q','u','i','r','e','d',0};
- static const WCHAR szPrimaryVolumeSpaceRemaining[] =
- {'P','r','i','m','a','r','y','V','o','l','u','m','e','S','p','a','c','e',
- 'R','e','m','a','i','n','i','n','g',0};
- static const WCHAR szOutOfNoRbDiskSpace[] =
- {'O','u','t','O','f','N','o','R','b','D','i','s','k','S','p','a','c','e',0};
MSICOMPONENT *comp;
MSIQUERY *view;
WCHAR *level, *primary_key, *primary_folder;
UINT rc;
TRACE("Building directory properties\n");
- msi_resolve_target_folder( package, szTargetDir, TRUE );
+ msi_resolve_target_folder( package, L"TARGETDIR", TRUE );
TRACE("Evaluating component conditions\n");
LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
@@ -2457,11 +2251,11 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
ACTION_GetComponentInstallStates(package);
ACTION_GetFeatureInstallStates(package);
- if (!process_overrides( package, msi_get_property_int( package->db, szInstallLevel, 1 ) ))
+ if (!process_overrides( package, msi_get_property_int( package->db, L"INSTALLLEVEL", 1 ) ))
{
TRACE("Evaluating feature conditions\n");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Condition`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_CostFinalizeConditions, package );
@@ -2474,22 +2268,21 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
TRACE("Calculating file cost\n");
calculate_file_cost( package );
- msi_set_property( package->db, szCostingComplete, szOne, -1 );
+ msi_set_property( package->db, L"CostingComplete", L"1", -1 );
/* set default run level if not set */
- level = msi_dup_property( package->db, szInstallLevel );
- if (!level) msi_set_property( package->db, szInstallLevel, szOne, -1 );
+ level = msi_dup_property( package->db, L"INSTALLLEVEL" );
+ if (!level) msi_set_property( package->db, L"INSTALLLEVEL", L"1", -1 );
msi_free(level);
if ((rc = MSI_SetFeatureStates( package ))) return rc;
- if ((primary_key = msi_dup_property( package->db, szPrimaryFolder )))
+ if ((primary_key = msi_dup_property( package->db, L"PRIMARYFOLDER" )))
{
if ((primary_folder = msi_dup_property( package->db, primary_key )))
{
if (((primary_folder[0] >= 'A' && primary_folder[0] <= 'Z') ||
(primary_folder[0] >= 'a' && primary_folder[0] <= 'z')) && primary_folder[1] == ':')
{
- static const WCHAR fmtW[] = {'%','l','u',0};
ULARGE_INTEGER free;
ULONGLONG required;
WCHAR buf[21];
@@ -2497,16 +2290,16 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
primary_folder[2] = 0;
if (GetDiskFreeSpaceExW( primary_folder, &free, NULL, NULL ))
{
- swprintf( buf, ARRAY_SIZE(buf), fmtW, free.QuadPart / 512 );
- msi_set_property( package->db, szPrimaryVolumeSpaceAvailable, buf, -1 );
+ swprintf( buf, ARRAY_SIZE(buf), L"%lu", free.QuadPart / 512 );
+ msi_set_property( package->db, L"PrimaryVolumeSpaceAvailable", buf, -1 );
}
required = get_volume_space_required( package );
- swprintf( buf, ARRAY_SIZE(buf), fmtW, required / 512 );
- msi_set_property( package->db, szPrimaryVolumeSpaceRequired, buf, -1 );
+ swprintf( buf, ARRAY_SIZE(buf), L"%lu", required / 512 );
+ msi_set_property( package->db, L"PrimaryVolumeSpaceRequired", buf, -1 );
- swprintf( buf, ARRAY_SIZE(buf), fmtW, (free.QuadPart - required) / 512 );
- msi_set_property( package->db, szPrimaryVolumeSpaceRemaining, buf, -1 );
- msi_set_property( package->db, szPrimaryVolumePath, primary_folder, 2 );
+ swprintf( buf, ARRAY_SIZE(buf), L"%lu", (free.QuadPart - required) / 512 );
+ msi_set_property( package->db, L"PrimaryVolumeSpaceRemaining", buf, -1 );
+ msi_set_property( package->db, L"PrimaryVolumePath", primary_folder, 2 );
}
msi_free( primary_folder );
}
@@ -2514,8 +2307,8 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
}
/* FIXME: check volume disk space */
- msi_set_property( package->db, szOutOfDiskSpace, szZero, -1 );
- msi_set_property( package->db, szOutOfNoRbDiskSpace, szZero, -1 );
+ msi_set_property( package->db, L"OutOfDiskSpace", L"0", -1 );
+ msi_set_property( package->db, L"OutOfNoRbDiskSpace", L"0", -1 );
return ERROR_SUCCESS;
}
@@ -2636,32 +2429,32 @@ static const WCHAR *get_root_key( MSIPACKAGE *package, INT root, HKEY *root_key
switch (root)
{
case -1:
- if (msi_get_property_int( package->db, szAllUsers, 0 ))
+ if (msi_get_property_int( package->db, L"ALLUSERS", 0 ))
{
*root_key = HKEY_LOCAL_MACHINE;
- ret = szHLM;
+ ret = L"HKEY_LOCAL_MACHINE\\";
}
else
{
*root_key = HKEY_CURRENT_USER;
- ret = szHCU;
+ ret = L"HKEY_CURRENT_USER\\";
}
break;
case 0:
*root_key = HKEY_CLASSES_ROOT;
- ret = szHCR;
+ ret = L"HKEY_CLASSES_ROOT\\";
break;
case 1:
*root_key = HKEY_CURRENT_USER;
- ret = szHCU;
+ ret = L"HKEY_CURRENT_USER\\";
break;
case 2:
*root_key = HKEY_LOCAL_MACHINE;
- ret = szHLM;
+ ret = L"HKEY_LOCAL_MACHINE\\";
break;
case 3:
*root_key = HKEY_USERS;
- ret = szHU;
+ ret = L"HKEY_USERS\\";
break;
default:
ERR("Unknown root %i\n", root);
@@ -2993,16 +2786,13 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','R','e','g','i','s','t','r','y','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szWriteRegistryValues);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"WriteRegistryValues");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `Registry`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -3225,19 +3015,13 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param
static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package )
{
- static const WCHAR registry_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','R','e','g','i','s','t','r','y','`',0};
- static const WCHAR remove_registry_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','R','e','m','o','v','e','R','e','g','i','s','t','r','y','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveRegistryValues);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveRegistryValues");
- rc = MSI_DatabaseOpenViewW( package->db, registry_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Registry`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveRegistryValuesOnUninstall, package );
@@ -3245,7 +3029,7 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW( package->db, remove_registry_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `RemoveRegistry`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveRegistryValuesOnInstall, package );
@@ -3264,9 +3048,6 @@ static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
static UINT ACTION_InstallValidate(MSIPACKAGE *package)
{
- static const WCHAR query[]= {
- 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
- '`','R','e','g','i','s','t','r','y','`',0};
MSICOMPONENT *comp;
DWORD total = 0, count = 0;
MSIQUERY *view;
@@ -3276,7 +3057,7 @@ static UINT ACTION_InstallValidate(MSIPACKAGE *package)
TRACE("InstallValidate\n");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Registry`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, &count, NULL, package );
@@ -3305,24 +3086,19 @@ static UINT ACTION_InstallValidate(MSIPACKAGE *package)
static UINT ITERATE_LaunchConditions(MSIRECORD *row, LPVOID param)
{
MSIPACKAGE* package = param;
- LPCWSTR cond = NULL;
- LPCWSTR message = NULL;
+ const WCHAR *cond, *message;
UINT r;
- static const WCHAR title[]=
- {'I','n','s','t','a','l','l',' ','F','a', 'i','l','e','d',0};
-
- cond = MSI_RecordGetString(row,1);
-
- r = MSI_EvaluateConditionW(package,cond);
+ cond = MSI_RecordGetString(row, 1);
+ r = MSI_EvaluateConditionW(package, cond);
if (r == MSICONDITION_FALSE)
{
if ((package->ui_level & INSTALLUILEVEL_MASK) != INSTALLUILEVEL_NONE)
{
- LPWSTR deformated;
- message = MSI_RecordGetString(row,2);
- deformat_string(package,message,&deformated);
- MessageBoxW(NULL,deformated,title,MB_OK);
+ WCHAR *deformated;
+ message = MSI_RecordGetString(row, 2);
+ deformat_string(package, message, &deformated);
+ MessageBoxW(NULL, deformated, L"Install Failed", MB_OK);
msi_free(deformated);
}
@@ -3334,15 +3110,12 @@ static UINT ITERATE_LaunchConditions(MSIRECORD *row, LPVOID param)
static UINT ACTION_LaunchConditions(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','`',0};
MSIQUERY *view;
UINT rc;
TRACE("Checking launch conditions\n");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `LaunchCondition`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -3359,18 +3132,12 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp )
if (cmp->Attributes & msidbComponentAttributesRegistryKeyPath)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','R','e','g','i','s','t','r','y','`',' ','W','H','E','R','E',' ',
- '`','R','e','g','i','s','t','r','y','`',' ','=',' ' ,'\'','%','s','\'',0};
- static const WCHAR fmt[] = {'%','0','2','i',':','\\','%','s','\\',0};
- static const WCHAR fmt2[]= {'%','0','2','i',':','\\','%','s','\\','%','s',0};
MSIRECORD *row;
UINT root, len;
LPWSTR deformated, buffer, deformated_name;
LPCWSTR key, name;
- row = MSI_QueryGetRecord(package->db, query, cmp->KeyPath);
+ row = MSI_QueryGetRecord(package->db, L"SELECT * FROM `Registry` WHERE `Registry` = '%s'", cmp->KeyPath);
if (!row)
return NULL;
@@ -3387,9 +3154,9 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp )
buffer = msi_alloc( len *sizeof(WCHAR));
if (deformated_name)
- swprintf(buffer,len,fmt2,root,deformated,deformated_name);
+ swprintf(buffer, len, L"%02d:\\%s\\%s", root, deformated, deformated_name);
else
- swprintf(buffer,len,fmt,root,deformated);
+ swprintf(buffer, len, L"%02d:\\%s\\", root, deformated);
msi_free(deformated);
msi_free(deformated_name);
@@ -3414,11 +3181,8 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp )
static HKEY open_shared_dlls_key( MSICOMPONENT *comp, BOOL create, REGSAM access )
{
- static const WCHAR path[] =
- {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'S','h','a','r','e','d','D','L','L','s',0};
- return open_key( comp, HKEY_LOCAL_MACHINE, path, create, access );
+ return open_key( comp, HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs",
+ create, access );
}
static UINT get_shared_dlls_count( MSICOMPONENT *comp )
@@ -3514,13 +3278,12 @@ static WCHAR *build_full_keypath( MSIPACKAGE *package, MSICOMPONENT *comp )
{
if (comp->assembly)
{
- static const WCHAR prefixW[] = {'<','\\',0};
- DWORD len = lstrlenW( prefixW ) + lstrlenW( comp->assembly->display_name );
+ DWORD len = lstrlenW( L"<\\" ) + lstrlenW( comp->assembly->display_name );
WCHAR *keypath = msi_alloc( (len + 1) * sizeof(WCHAR) );
if (keypath)
{
- lstrcpyW( keypath, prefixW );
+ lstrcpyW( keypath, L"<\\" );
lstrcatW( keypath, comp->assembly->display_name );
}
return keypath;
@@ -3540,7 +3303,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
msi_set_sourcedir_props(package, FALSE);
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szProcessComponents);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"ProcessComponents");
squash_guid( package->ProductCode, squashed_pc );
@@ -3569,7 +3332,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
if (action == INSTALLSTATE_LOCAL || action == INSTALLSTATE_SOURCE)
{
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
- rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, szLocalSid, &hkey, TRUE);
+ rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, L"S-1-5-18", &hkey, TRUE);
else
rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, NULL, &hkey, TRUE);
@@ -3578,12 +3341,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
if (comp->Attributes & msidbComponentAttributesPermanent)
{
- static const WCHAR szPermKey[] =
- { '0','0','0','0','0','0','0','0','0','0','0','0',
- '0','0','0','0','0','0','0','0','0','0','0','0',
- '0','0','0','0','0','0','0','0',0 };
-
- msi_reg_set_val_str(hkey, szPermKey, comp->FullKeypath);
+ msi_reg_set_val_str(hkey, L"00000000000000000000000000000000", comp->FullKeypath);
}
if (action == INSTALLSTATE_LOCAL)
msi_reg_set_val_str( hkey, squashed_pc, comp->FullKeypath );
@@ -3596,21 +3354,14 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
WCHAR base[MAX_PATH];
LPWSTR sourcepath;
- static const WCHAR fmt[] = {'%','0','2','d','\\',0};
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
- '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
- '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ',
- '>','=',' ','%','i',' ','O','R','D','E','R',' ','B','Y',' ',
- '`','D','i','s','k','I','d','`',0};
-
if (!comp->KeyPath || !(file = msi_get_loaded_file(package, comp->KeyPath)))
continue;
- if (!(row = MSI_QueryGetRecord(package->db, query, file->Sequence)))
+ if (!(row = MSI_QueryGetRecord(package->db, L"SELECT * FROM `Media` WHERE `LastSequence` >= %d "
+ "ORDER BY `DiskId`", file->Sequence)))
return ERROR_FUNCTION_FAILED;
- swprintf(source, ARRAY_SIZE(source), fmt, MSI_RecordGetInteger(row, 1));
+ swprintf(source, ARRAY_SIZE(source), L"%02d\\", MSI_RecordGetInteger(row, 1));
ptr2 = wcsrchr(source, '\\') + 1;
msiobj_release(&row->hdr);
@@ -3632,7 +3383,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
if (comp->num_clients <= 0)
{
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
- rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, szLocalSid );
+ rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, L"S-1-5-18" );
else
rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, NULL );
@@ -3643,7 +3394,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
LONG res;
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
- rc = MSIREG_OpenUserDataComponentKey( comp->ComponentId, szLocalSid, &hkey, FALSE );
+ rc = MSIREG_OpenUserDataComponentKey( comp->ComponentId, L"S-1-5-18", &hkey, FALSE );
else
rc = MSIREG_OpenUserDataComponentKey( comp->ComponentId, NULL, &hkey, FALSE );
@@ -3682,8 +3433,7 @@ static BOOL CALLBACK Typelib_EnumResNameProc( HMODULE hModule, LPCWSTR lpszType,
{
TLIBATTR *attr;
typelib_struct *tl_struct = (typelib_struct*) lParam;
- static const WCHAR fmt[] = {'%','s','\\','%','i',0};
- int sz;
+ int sz;
HRESULT res;
if (!IS_INTRESOURCE(lpszName))
@@ -3699,7 +3449,7 @@ static BOOL CALLBACK Typelib_EnumResNameProc( HMODULE hModule, LPCWSTR lpszType,
else
{
tl_struct->path = msi_alloc(sz * sizeof(WCHAR));
- swprintf(tl_struct->path,sz,fmt,tl_struct->source, lpszName);
+ swprintf(tl_struct->path, sz, L"%s\\%d", tl_struct->source, lpszName);
}
TRACE("trying %s\n", debugstr_w(tl_struct->path));
@@ -3785,7 +3535,7 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
tl_struct.source = strdupW( file->TargetPath );
tl_struct.path = NULL;
- EnumResourceNamesW(module, szTYPELIB, Typelib_EnumResNameProc,
+ EnumResourceNamesW(module, L"TYPELIB", Typelib_EnumResNameProc,
(LONG_PTR)&tl_struct);
if (tl_struct.path)
@@ -3828,16 +3578,13 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','T','y','p','e','L','i','b','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRegisterTypeLibraries);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RegisterTypeLibraries");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `TypeLib`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -3892,16 +3639,13 @@ static UINT ITERATE_UnregisterTypeLibraries( MSIRECORD *row, LPVOID param )
static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','T','y','p','e','L','i','b','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szUnregisterTypeLibraries);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"UnregisterTypeLibraries");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `TypeLib`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -3912,7 +3656,6 @@ static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package )
static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
{
- static const WCHAR szlnk[] = {'.','l','n','k',0};
LPCWSTR directory, extension, link_folder;
LPWSTR link_file, filename;
@@ -3930,11 +3673,11 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
msi_reduce_to_long_filename( filename );
extension = wcsrchr( filename, '.' );
- if (!extension || wcsicmp( extension, szlnk ))
+ if (!extension || wcsicmp( extension, L".lnk" ))
{
int len = lstrlenW( filename );
- filename = msi_realloc( filename, len * sizeof(WCHAR) + sizeof(szlnk) );
- memcpy( filename + len, szlnk, sizeof(szlnk) );
+ filename = msi_realloc( filename, len * sizeof(WCHAR) + sizeof(L".lnk") );
+ memcpy( filename + len, L".lnk", sizeof(L".lnk") );
}
link_file = msi_build_directory_name( 2, link_folder, filename );
msi_free( filename );
@@ -3944,19 +3687,17 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
WCHAR *msi_build_icon_path( MSIPACKAGE *package, const WCHAR *icon_name )
{
- static const WCHAR szMicrosoft[] = {'M','i','c','r','o','s','o','f','t','\\',0};
- static const WCHAR szInstaller[] = {'I','n','s','t','a','l','l','e','r','\\',0};
WCHAR *folder, *dest, *path;
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
- folder = msi_dup_property( package->db, szWindowsFolder );
+ folder = msi_dup_property( package->db, L"WindowsFolder" );
else
{
- WCHAR *appdata = msi_dup_property( package->db, szAppDataFolder );
- folder = msi_build_directory_name( 2, appdata, szMicrosoft );
+ WCHAR *appdata = msi_dup_property( package->db, L"AppDataFolder" );
+ folder = msi_build_directory_name( 2, appdata, L"Microsoft\\" );
msi_free( appdata );
}
- dest = msi_build_directory_name( 3, folder, szInstaller, package->ProductCode );
+ dest = msi_build_directory_name( 3, folder, L"Installer\\", package->ProductCode );
msi_create_full_path( package, dest );
path = msi_build_directory_name( 2, dest, icon_name );
msi_free( folder );
@@ -4082,17 +3823,14 @@ err:
static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','S','h','o','r','t','c','u','t','`',0};
MSIQUERY *view;
HRESULT res;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szCreateShortcuts);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"CreateShortcuts");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `Shortcut`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -4135,16 +3873,13 @@ static UINT ITERATE_RemoveShortcuts( MSIRECORD *row, LPVOID param )
static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','S','h','o','r','t','c','u','t','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveShortcuts);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveShortcuts");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Shortcut`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -4204,13 +3939,10 @@ static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param)
static UINT msi_publish_icons(MSIPACKAGE *package)
{
- static const WCHAR query[]= {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','c','o','n','`',0};
MSIQUERY *view;
UINT r;
- r = MSI_DatabaseOpenViewW(package->db, query, &view);
+ r = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `Icon`", &view);
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords(view, NULL, ITERATE_PublishIcon, package);
@@ -4229,7 +3961,7 @@ static UINT msi_publish_sourcelist(MSIPACKAGE *package, HKEY hkey)
MSIMEDIADISK *disk;
MSISOURCELISTINFO *info;
- r = RegCreateKeyW(hkey, szSourceList, &source);
+ r = RegCreateKeyW(hkey, L"SourceList", &source);
if (r != ERROR_SUCCESS)
return r;
@@ -4244,13 +3976,13 @@ static UINT msi_publish_sourcelist(MSIPACKAGE *package, HKEY hkey)
r = MsiSourceListSetInfoW(package->ProductCode, NULL,
package->Context, MSICODE_PRODUCT,
- INSTALLPROPERTY_MEDIAPACKAGEPATHW, szEmpty);
+ INSTALLPROPERTY_MEDIAPACKAGEPATHW, L"");
if (r != ERROR_SUCCESS)
return r;
r = MsiSourceListSetInfoW(package->ProductCode, NULL,
package->Context, MSICODE_PRODUCT,
- INSTALLPROPERTY_DISKPROMPTW, szEmpty);
+ INSTALLPROPERTY_DISKPROMPTW, L"");
if (r != ERROR_SUCCESS)
return r;
@@ -4277,15 +4009,6 @@ static UINT msi_publish_sourcelist(MSIPACKAGE *package, HKEY hkey)
static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
{
- static const WCHAR szARPProductIcon[] =
- {'A','R','P','P','R','O','D','U','C','T','I','C','O','N',0};
- static const WCHAR szAssignment[] =
- {'A','s','s','i','g','n','m','e','n','t',0};
- static const WCHAR szAdvertiseFlags[] =
- {'A','d','v','e','r','t','i','s','e','F','l','a','g','s',0};
- static const WCHAR szClients[] =
- {'C','l','i','e','n','t','s',0};
- static const WCHAR szColon[] = {':',0};
WCHAR *buffer, *ptr, *guids, packcode[SQUASHED_GUID_SIZE];
DWORD langid;
@@ -4293,13 +4016,13 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTNAMEW, buffer);
msi_free(buffer);
- langid = msi_get_property_int(package->db, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, L"ProductLanguage", 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
/* FIXME */
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_AUTHORIZED_LUA_APPW, 0);
- buffer = msi_dup_property(package->db, szARPProductIcon);
+ buffer = msi_dup_property(package->db, L"ARPPRODUCTICON");
if (buffer)
{
LPWSTR path = msi_build_icon_path(package, buffer);
@@ -4308,7 +4031,7 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
msi_free(buffer);
}
- buffer = msi_dup_property(package->db, szProductVersion);
+ buffer = msi_dup_property(package->db, L"ProductVersion");
if (buffer)
{
DWORD verdword = msi_version_str_to_dword(buffer);
@@ -4316,10 +4039,10 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
msi_free(buffer);
}
- msi_reg_set_val_dword(hkey, szAssignment, 0);
- msi_reg_set_val_dword(hkey, szAdvertiseFlags, 0x184);
+ msi_reg_set_val_dword(hkey, L"Assignment", 0);
+ msi_reg_set_val_dword(hkey, L"AdvertiseFlags", 0x184);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_INSTANCETYPEW, 0);
- msi_reg_set_val_str(hkey, szClients, szColon);
+ msi_reg_set_val_str(hkey, L"Clients", L":");
if (!(guids = msi_get_package_code(package->db))) return ERROR_OUTOFMEMORY;
if ((ptr = wcschr(guids, ';'))) *ptr = 0;
@@ -4336,7 +4059,7 @@ static UINT msi_publish_upgrade_code(MSIPACKAGE *package)
HKEY hkey;
WCHAR *upgrade, squashed_pc[SQUASHED_GUID_SIZE];
- upgrade = msi_dup_property(package->db, szUpgradeCode);
+ upgrade = msi_dup_property(package->db, L"UpgradeCode");
if (!upgrade)
return ERROR_SUCCESS;
@@ -4388,7 +4111,6 @@ static BOOL msi_check_unpublish(MSIPACKAGE *package)
static UINT msi_publish_patches( MSIPACKAGE *package )
{
- static const WCHAR szAllPatches[] = {'A','l','l','P','a','t','c','h','e','s',0};
WCHAR patch_squashed[GUID_SIZE];
HKEY patches_key = NULL, product_patches_key = NULL, product_key;
LONG res;
@@ -4401,7 +4123,7 @@ static UINT msi_publish_patches( MSIPACKAGE *package )
if (r != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
- res = RegCreateKeyExW( product_key, szPatches, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patches_key, NULL );
+ res = RegCreateKeyExW( product_key, L"Patches", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patches_key, NULL );
if (res != ERROR_SUCCESS)
{
r = ERROR_FUNCTION_FAILED;
@@ -4439,7 +4161,7 @@ static UINT msi_publish_patches( MSIPACKAGE *package )
if (r != ERROR_SUCCESS)
goto done;
- res = RegSetValueExW( patch_key, szLocalPackage, 0, REG_SZ, (const BYTE *)patch->localfile,
+ res = RegSetValueExW( patch_key, L"LocalPackage", 0, REG_SZ, (const BYTE *)patch->localfile,
(lstrlenW( patch->localfile ) + 1) * sizeof(WCHAR) );
RegCloseKey( patch_key );
if (res != ERROR_SUCCESS)
@@ -4455,7 +4177,7 @@ static UINT msi_publish_patches( MSIPACKAGE *package )
if (res != ERROR_SUCCESS)
goto done;
- res = RegSetValueExW( patch_key, szState, 0, REG_DWORD, (const BYTE *)&patch->state,
+ res = RegSetValueExW( patch_key, L"State", 0, REG_DWORD, (const BYTE *)&patch->state,
sizeof(patch->state) );
if (res != ERROR_SUCCESS)
{
@@ -4463,7 +4185,7 @@ static UINT msi_publish_patches( MSIPACKAGE *package )
goto done;
}
- res = RegSetValueExW( patch_key, szUninstallable, 0, REG_DWORD, (const BYTE *)&patch->uninstallable,
+ res = RegSetValueExW( patch_key, L"Uninstallable", 0, REG_DWORD, (const BYTE *)&patch->uninstallable,
sizeof(patch->uninstallable) );
RegCloseKey( patch_key );
if (res != ERROR_SUCCESS)
@@ -4471,12 +4193,12 @@ static UINT msi_publish_patches( MSIPACKAGE *package )
}
all_patches[len] = 0;
- res = RegSetValueExW( patches_key, szPatches, 0, REG_MULTI_SZ,
+ res = RegSetValueExW( patches_key, L"Patches", 0, REG_MULTI_SZ,
(const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
if (res != ERROR_SUCCESS)
goto done;
- res = RegSetValueExW( product_patches_key, szAllPatches, 0, REG_MULTI_SZ,
+ res = RegSetValueExW( product_patches_key, L"AllPatches", 0, REG_MULTI_SZ,
(const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
if (res != ERROR_SUCCESS)
r = ERROR_FUNCTION_FAILED;
@@ -4497,7 +4219,7 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
BOOL republish = FALSE;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szPublishProduct);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"PublishProduct");
if (!list_empty(&package->patches))
{
@@ -4598,7 +4320,7 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row )
if (!folder) folder = msi_dup_property( package->db, dirprop );
}
else
- folder = msi_dup_property( package->db, szWindowsFolder );
+ folder = msi_dup_property( package->db, L"WindowsFolder" );
if (!folder)
{
@@ -4690,16 +4412,13 @@ static UINT ITERATE_WriteIniValues(MSIRECORD *row, LPVOID param)
static UINT ACTION_WriteIniValues(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','i','F','i','l','e','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szWriteIniValues);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"WriteIniValues");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `IniFile`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -4833,19 +4552,13 @@ static UINT ITERATE_RemoveIniValuesOnInstall( MSIRECORD *row, LPVOID param )
static UINT ACTION_RemoveIniValues( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','i','F','i','l','e','`',0};
- static const WCHAR remove_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','R','e','m','o','v','e','I','n','i','F','i','l','e','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveIniValues);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveIniValues");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `IniFile`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveIniValuesOnUninstall, package );
@@ -4853,7 +4566,7 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW( package->db, remove_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `RemoveIniFile`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveIniValuesOnInstall, package );
@@ -4866,10 +4579,8 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package )
static void register_dll( const WCHAR *dll, BOOL unregister )
{
- static const WCHAR regW[] =
- {'r','e','g','s','v','r','3','2','.','e','x','e',' ','\"','%','s','\"',0};
- static const WCHAR unregW[] =
- {'r','e','g','s','v','r','3','2','.','e','x','e',' ','/','u',' ','\"','%','s','\"',0};
+ static const WCHAR regW[] = L"regsvr32.exe \"%s\"";
+ static const WCHAR unregW[] = L"regsvr32.exe /u \"%s\"";
PROCESS_INFORMATION pi;
STARTUPINFOW si;
WCHAR *cmd;
@@ -4924,16 +4635,13 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)
static UINT ACTION_SelfRegModules(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','S','e','l','f','R','e','g','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szSelfRegModules);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"SelfRegModules");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `SelfReg`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -4977,16 +4685,13 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param )
static UINT ACTION_SelfUnregModules( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','S','e','l','f','R','e','g','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szSelfUnregModules);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"SelfUnregModules");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `SelfReg`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -5002,7 +4707,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
HKEY hkey = NULL, userdata = NULL;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szPublishFeatures);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"PublishFeatures");
if (!msi_check_publish(package))
return ERROR_SUCCESS;
@@ -5064,9 +4769,8 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
if (feature->Feature_Parent)
{
- static const WCHAR sep[] = {'\2',0};
- lstrcatW(data,sep);
- lstrcatW(data,feature->Feature_Parent);
+ lstrcatW(data, L"\2");
+ lstrcatW(data, feature->Feature_Parent);
}
msi_reg_set_val_str( userdata, feature->Feature, data );
@@ -5078,8 +4782,8 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
if (!absent)
{
size += sizeof(WCHAR);
- RegSetValueExW(hkey,feature->Feature,0,REG_SZ,
- (const BYTE*)(feature->Feature_Parent ? feature->Feature_Parent : szEmpty),size);
+ RegSetValueExW(hkey, feature->Feature, 0 ,REG_SZ,
+ (const BYTE*)(feature->Feature_Parent ? feature->Feature_Parent : L""), size);
}
else
{
@@ -5145,7 +4849,7 @@ static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
MSIFEATURE *feature;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szUnpublishFeatures);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"UnpublishFeatures");
if (!msi_check_unpublish(package))
return ERROR_SUCCESS;
@@ -5160,91 +4864,21 @@ static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{
- static const WCHAR date_fmt[] =
- {'%','i','%','0','2','i','%','0','2','i',0};
- static const WCHAR szEstimatedSize[] =
- {'E','s','t','i','m','a','t','e','d','S','i','z','e',0};
- static const WCHAR szDisplayVersion[] =
- {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
- static const WCHAR szInstallSource[] =
- {'I','n','s','t','a','l','l','S','o','u','r','c','e',0};
- static const WCHAR szARPAUTHORIZEDCDFPREFIX[] =
- {'A','R','P','A','U','T','H','O','R','I','Z','E','D','C','D','F','P','R','E','F','I','X',0};
- static const WCHAR szAuthorizedCDFPrefix[] =
- {'A','u','t','h','o','r','i','z','e','d','C','D','F','P','r','e','f','i','x',0};
- static const WCHAR szARPCONTACT[] =
- {'A','R','P','C','O','N','T','A','C','T',0};
- static const WCHAR szContact[] =
- {'C','o','n','t','a','c','t',0};
- static const WCHAR szARPCOMMENTS[] =
- {'A','R','P','C','O','M','M','E','N','T','S',0};
- static const WCHAR szComments[] =
- {'C','o','m','m','e','n','t','s',0};
- static const WCHAR szProductName[] =
- {'P','r','o','d','u','c','t','N','a','m','e',0};
- static const WCHAR szDisplayName[] =
- {'D','i','s','p','l','a','y','N','a','m','e',0};
- static const WCHAR szARPHELPLINK[] =
- {'A','R','P','H','E','L','P','L','I','N','K',0};
- static const WCHAR szHelpLink[] =
- {'H','e','l','p','L','i','n','k',0};
- static const WCHAR szARPHELPTELEPHONE[] =
- {'A','R','P','H','E','L','P','T','E','L','E','P','H','O','N','E',0};
- static const WCHAR szHelpTelephone[] =
- {'H','e','l','p','T','e','l','e','p','h','o','n','e',0};
- static const WCHAR szARPINSTALLLOCATION[] =
- {'A','R','P','I','N','S','T','A','L','L','L','O','C','A','T','I','O','N',0};
- static const WCHAR szManufacturer[] =
- {'M','a','n','u','f','a','c','t','u','r','e','r',0};
- static const WCHAR szPublisher[] =
- {'P','u','b','l','i','s','h','e','r',0};
- static const WCHAR szARPREADME[] =
- {'A','R','P','R','E','A','D','M','E',0};
- static const WCHAR szReadme[] =
- {'R','e','a','d','M','e',0};
- static const WCHAR szARPSIZE[] =
- {'A','R','P','S','I','Z','E',0};
- static const WCHAR szSize[] =
- {'S','i','z','e',0};
- static const WCHAR szARPURLINFOABOUT[] =
- {'A','R','P','U','R','L','I','N','F','O','A','B','O','U','T',0};
- static const WCHAR szURLInfoAbout[] =
- {'U','R','L','I','n','f','o','A','b','o','u','t',0};
- static const WCHAR szARPURLUPDATEINFO[] =
- {'A','R','P','U','R','L','U','P','D','A','T','E','I','N','F','O',0};
- static const WCHAR szURLUpdateInfo[] =
- {'U','R','L','U','p','d','a','t','e','I','n','f','o',0};
- static const WCHAR szARPSYSTEMCOMPONENT[] =
- {'A','R','P','S','Y','S','T','E','M','C','O','M','P','O','N','E','N','T',0};
- static const WCHAR szSystemComponent[] =
- {'S','y','s','t','e','m','C','o','m','p','o','n','e','n','t',0};
- static const WCHAR szARPNOMODIFY[] =
- {'A','R','P','N','O','M','O','D','I','F','Y',0};
- static const WCHAR szNoModify[] =
- {'N','o','M','o','d','i','f','y',0};
- static const WCHAR szARPNOREMOVE[] =
- {'A','R','P','N','O','R','E','M','O','V','E',0};
- static const WCHAR szNoRemove[] =
- {'N','o','R','e','m','o','v','e',0};
- static const WCHAR szARPNOREPAIR[] =
- {'A','R','P','N','O','R','E','P','A','I','R',0};
- static const WCHAR szNoRepair[] =
- {'N','o','R','e','p','a','i','r',0};
-
- static const WCHAR *propval[] = {
- szARPAUTHORIZEDCDFPREFIX, szAuthorizedCDFPrefix,
- szARPCONTACT, szContact,
- szARPCOMMENTS, szComments,
- szProductName, szDisplayName,
- szARPHELPLINK, szHelpLink,
- szARPHELPTELEPHONE, szHelpTelephone,
- szARPINSTALLLOCATION, szInstallLocation,
- szSourceDir, szInstallSource,
- szManufacturer, szPublisher,
- szARPREADME, szReadme,
- szARPSIZE, szSize,
- szARPURLINFOABOUT, szURLInfoAbout,
- szARPURLUPDATEINFO, szURLUpdateInfo,
+ static const WCHAR *propval[] =
+ {
+ L"ARPAUTHORIZEDCDFPREFIX", L"AuthorizedCDFPrefix",
+ L"ARPCONTACT", L"Contact",
+ L"ARPCOMMENTS", L"Comments",
+ L"ProductName", L"DisplayName",
+ L"ARPHELPLINK", L"HelpLink",
+ L"ARPHELPTELEPHONE", L"HelpTelephone",
+ L"ARPINSTALLLOCATION", L"InstallLocation",
+ L"SourceDir", L"InstallSource",
+ L"Manufacturer", L"Publisher",
+ L"ARPREADME", L"ReadMe",
+ L"ARPSIZE", L"Size",
+ L"ARPURLINFOABOUT", L"URLInfoAbout",
+ L"ARPURLUPDATEINFO", L"URLUpdateInfo",
NULL
};
const WCHAR **p = propval;
@@ -5262,55 +4896,47 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
msi_free(val);
}
- msi_reg_set_val_dword(hkey, szWindowsInstaller, 1);
- if (msi_get_property_int( package->db, szARPSYSTEMCOMPONENT, 0 ))
+ msi_reg_set_val_dword(hkey, L"WindowsInstaller", 1);
+ if (msi_get_property_int( package->db, L"ARPSYSTEMCOMPONENT", 0 ))
{
- msi_reg_set_val_dword( hkey, szSystemComponent, 1 );
+ msi_reg_set_val_dword( hkey, L"SystemComponent", 1 );
}
- if (msi_get_property_int( package->db, szARPNOREMOVE, 0 ))
- msi_reg_set_val_dword( hkey, szNoRemove, 1 );
+ if (msi_get_property_int( package->db, L"ARPNOREMOVE", 0 ))
+ msi_reg_set_val_dword( hkey, L"NoRemove", 1 );
else
{
- static const WCHAR fmt_install[] =
- {'M','s','i','E','x','e','c','.','e','x','e',' ',
- '/','I','[','P','r','o','d','u','c','t','C','o','d','e',']',0};
- static const WCHAR fmt_uninstall[] =
- {'M','s','i','E','x','e','c','.','e','x','e',' ',
- '/','X','[','P','r','o','d','u','c','t','C','o','d','e',']',0};
- static const WCHAR szModifyPath[] =
- {'M','o','d','i','f','y','P','a','t','h',0};
- static const WCHAR szUninstallString[] =
- {'U','n','i','n','s','t','a','l','l','S','t','r','i','n','g',0};
+ static const WCHAR fmt_install[] = L"MsiExec.exe /I[ProductCode]";
+ static const WCHAR fmt_uninstall[] = L"MsiExec.exe /X[ProductCode]";
const WCHAR *fmt = fmt_install;
- if (msi_get_property_int( package->db, szARPNOREPAIR, 0 ))
- msi_reg_set_val_dword( hkey, szNoRepair, 1 );
+ if (msi_get_property_int( package->db, L"ARPNOREPAIR", 0 ))
+ msi_reg_set_val_dword( hkey, L"NoRepair", 1 );
- if (msi_get_property_int( package->db, szARPNOMODIFY, 0 ))
+ if (msi_get_property_int( package->db, L"ARPNOMODIFY", 0 ))
{
- msi_reg_set_val_dword( hkey, szNoModify, 1 );
+ msi_reg_set_val_dword( hkey, L"NoModify", 1 );
fmt = fmt_uninstall;
}
size = deformat_string(package, fmt, &buffer) * sizeof(WCHAR);
- RegSetValueExW(hkey, szModifyPath, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
- RegSetValueExW(hkey, szUninstallString, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
+ RegSetValueExW(hkey, L"ModifyPath", 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
+ RegSetValueExW(hkey, L"UninstallString", 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
msi_free(buffer);
}
/* FIXME: Write real Estimated Size when we have it */
- msi_reg_set_val_dword(hkey, szEstimatedSize, 0);
+ msi_reg_set_val_dword(hkey, L"EstimatedSize", 0);
GetLocalTime(&systime);
- swprintf(date, ARRAY_SIZE(date), date_fmt, systime.wYear, systime.wMonth, systime.wDay);
+ swprintf(date, ARRAY_SIZE(date), L"%d%02d%02d", systime.wYear, systime.wMonth, systime.wDay);
msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLDATEW, date);
- langid = msi_get_property_int(package->db, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, L"ProductLanguage", 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
- buffer = msi_dup_property(package->db, szProductVersion);
- msi_reg_set_val_str(hkey, szDisplayVersion, buffer);
+ buffer = msi_dup_property(package->db, L"ProductVersion");
+ msi_reg_set_val_str(hkey, L"DisplayVersion", buffer);
if (buffer)
{
DWORD verdword = msi_version_str_to_dword(buffer);
@@ -5332,10 +4958,10 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRegisterProduct);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RegisterProduct");
/* FIXME: also need to publish if the product is in advertise mode */
- if (!msi_get_property_int( package->db, szProductToBeRegistered, 0 )
+ if (!msi_get_property_int( package->db, L"ProductToBeRegistered", 0 )
&& !msi_check_publish(package))
return ERROR_SUCCESS;
@@ -5355,7 +4981,7 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
goto done;
- upgrade_code = msi_dup_property(package->db, szUpgradeCode);
+ upgrade_code = msi_dup_property(package->db, L"UpgradeCode");
if (upgrade_code)
{
rc = MSIREG_OpenUpgradeCodesKey( upgrade_code, &upgrade_key, TRUE );
@@ -5408,12 +5034,10 @@ static UINT ITERATE_UnpublishIcon( MSIRECORD *row, LPVOID param )
static UINT msi_unpublish_icons( MSIPACKAGE *package )
{
- static const WCHAR query[]= {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','I','c','o','n','`',0};
MSIQUERY *view;
UINT r;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Icon`", &view );
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords( view, NULL, ITERATE_UnpublishIcon, package );
@@ -5432,7 +5056,7 @@ static void remove_product_upgrade_code( MSIPACKAGE *package )
DWORD count;
squash_guid( package->ProductCode, product );
- if (!(code = msi_dup_property( package->db, szUpgradeCode )))
+ if (!(code = msi_dup_property( package->db, L"UpgradeCode" )))
{
WARN( "upgrade code not found\n" );
return;
@@ -5530,44 +5154,24 @@ static UINT ACTION_InstallFinalize(MSIPACKAGE *package)
UINT ACTION_ForceReboot(MSIPACKAGE *package)
{
- static const WCHAR RunOnce[] = {
- 'S','o','f','t','w','a','r','e','\\',
- 'M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s','\\',
- 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'R','u','n','O','n','c','e',0};
- static const WCHAR InstallRunOnce[] = {
- 'S','o','f','t','w','a','r','e','\\',
- 'M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s','\\',
- 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'I','n','s','t','a','l','l','e','r','\\',
- 'R','u','n','O','n','c','e','E','n','t','r','i','e','s',0};
-
- static const WCHAR msiexec_fmt[] = {
- '%','s',
- '\\','M','s','i','E','x','e','c','.','e','x','e',' ','/','@',' ',
- '\"','%','s','\"',0};
- static const WCHAR install_fmt[] = {
- '/','I',' ','\"','%','s','\"',' ',
- 'A','F','T','E','R','R','E','B','O','O','T','=','1',' ',
- 'R','U','N','O','N','C','E','E','N','T','R','Y','=','\"','%','s','\"',0};
WCHAR buffer[256], sysdir[MAX_PATH], squashed_pc[SQUASHED_GUID_SIZE];
HKEY hkey;
squash_guid( package->ProductCode, squashed_pc );
GetSystemDirectoryW(sysdir, ARRAY_SIZE(sysdir));
- RegCreateKeyW(HKEY_LOCAL_MACHINE,RunOnce,&hkey);
- swprintf(buffer, ARRAY_SIZE(buffer), msiexec_fmt, sysdir, squashed_pc);
+ RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", &hkey);
+ swprintf(buffer, ARRAY_SIZE(buffer), L"%s\\MsiExec.exe /@ \"%s\"", sysdir, squashed_pc);
msi_reg_set_val_str( hkey, squashed_pc, buffer );
RegCloseKey(hkey);
TRACE("Reboot command %s\n",debugstr_w(buffer));
- RegCreateKeyW(HKEY_LOCAL_MACHINE,InstallRunOnce,&hkey);
- swprintf( buffer, ARRAY_SIZE(buffer), install_fmt, package->ProductCode, squashed_pc );
+ RegCreateKeyW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\RunOnceEntries",
+ &hkey);
+ swprintf( buffer, ARRAY_SIZE(buffer), L"/I \"%s\" AFTERREBOOT=1 RUNONCEENTRY=\"%s\"", package->ProductCode,
+ squashed_pc );
msi_reg_set_val_str( hkey, squashed_pc, buffer );
RegCloseKey(hkey);
@@ -5631,29 +5235,27 @@ static UINT ACTION_ResolveSource(MSIPACKAGE* package)
static UINT ACTION_RegisterUser(MSIPACKAGE *package)
{
- HKEY hkey = 0;
- LPWSTR buffer, productid = NULL;
- UINT i, rc = ERROR_SUCCESS;
- MSIRECORD *uirow;
-
- static const WCHAR szPropKeys[][80] =
+ static const WCHAR szPropKeys[][80] =
{
- {'P','r','o','d','u','c','t','I','D',0},
- {'U','S','E','R','N','A','M','E',0},
- {'C','O','M','P','A','N','Y','N','A','M','E',0},
+ L"ProductID",
+ L"USERNAME",
+ L"COMPANYNAME",
{0},
};
-
- static const WCHAR szRegKeys[][80] =
+ static const WCHAR szRegKeys[][80] =
{
- {'P','r','o','d','u','c','t','I','D',0},
- {'R','e','g','O','w','n','e','r',0},
- {'R','e','g','C','o','m','p','a','n','y',0},
+ L"ProductID",
+ L"RegOwner",
+ L"RegCompany",
{0},
};
+ HKEY hkey = 0;
+ LPWSTR buffer, productid = NULL;
+ UINT i, rc = ERROR_SUCCESS;
+ MSIRECORD *uirow;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRegisterUser);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RegisterUser");
if (msi_check_unpublish(package))
{
@@ -5690,13 +5292,11 @@ end:
static UINT iterate_properties(MSIRECORD *record, void *param)
{
- static const WCHAR prop_template[] =
- {'P','r','o','p','e','r','t','y','(','S',')',':',' ','[','1',']',' ','=',' ','[','2',']',0};
MSIRECORD *uirow;
uirow = MSI_CloneRecord(record);
if (!uirow) return ERROR_OUTOFMEMORY;
- MSI_RecordSetStringW(uirow, 0, prop_template);
+ MSI_RecordSetStringW(uirow, 0, L"Property(S): [1] = [2]");
MSI_ProcessMessage(param, INSTALLMESSAGE_INFO|MB_ICONHAND, uirow);
msiobj_release(&uirow->hdr);
@@ -5706,8 +5306,6 @@ static UINT iterate_properties(MSIRECORD *record, void *param)
static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
{
- static const WCHAR prop_query[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','_','P','r','o','p','e','r','t','y','`',0};
WCHAR *productname;
WCHAR *action;
WCHAR *info_template;
@@ -5753,15 +5351,15 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
package->LastActionResult = MSI_NULL_INTEGER;
- action = msi_dup_property(package->db, szEXECUTEACTION);
- if (!action) action = msi_strdupW(szINSTALL, lstrlenW(szINSTALL));
+ action = msi_dup_property(package->db, L"EXECUTEACTION");
+ if (!action) action = msi_strdupW(L"INSTALL", ARRAY_SIZE(L"INSTALL") - 1);
/* Perform the action. Top-level actions trigger a sequence. */
- if (!wcscmp(action, szINSTALL))
+ if (!wcscmp(action, L"INSTALL"))
{
/* Send ACTIONSTART/INFO and INSTALLSTART. */
- ui_actionstart(package, szINSTALL, NULL, NULL);
- ui_actioninfo(package, szINSTALL, TRUE, 0);
+ ui_actionstart(package, L"INSTALL", NULL, NULL);
+ ui_actioninfo(package, L"INSTALL", TRUE, 0);
uirow = MSI_CreateRecord(2);
if (!uirow)
{
@@ -5779,7 +5377,7 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
rc = ACTION_ProcessExecSequence(package);
/* Send return value and INSTALLEND. */
- ui_actioninfo(package, szINSTALL, FALSE, !rc);
+ ui_actioninfo(package, L"INSTALL", FALSE, !rc);
uirow = MSI_CreateRecord(3);
if (!uirow)
{
@@ -5797,7 +5395,7 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package)
rc = ACTION_PerformAction(package, action);
/* Send all set properties. */
- if (!MSI_OpenQuery(package->db, &view, prop_query))
+ if (!MSI_OpenQuery(package->db, &view, L"SELECT * FROM `_Property`"))
{
MSI_IterateRecords(view, NULL, iterate_properties, package);
msiobj_release(&view->hdr);
@@ -5826,7 +5424,7 @@ end:
static UINT ACTION_INSTALL(MSIPACKAGE *package)
{
- msi_set_property(package->db, szEXECUTEACTION, szINSTALL, -1);
+ msi_set_property(package->db, L"EXECUTEACTION", L"INSTALL", -1);
if (needs_ui_sequence(package) && ui_sequence_exists(package))
{
package->InWhatSequence |= SEQUENCE_UI;
@@ -5838,7 +5436,6 @@ static UINT ACTION_INSTALL(MSIPACKAGE *package)
WCHAR *msi_create_component_advertise_string( MSIPACKAGE *package, MSICOMPONENT *component, const WCHAR *feature )
{
- static const WCHAR fmt[] = {'%','s','%','s','%','c','%','s',0};
WCHAR productid_85[21], component_85[21], *ret;
GUID clsid;
DWORD sz;
@@ -5861,7 +5458,7 @@ WCHAR *msi_create_component_advertise_string( MSIPACKAGE *package, MSICOMPONENT
sz = 20 + lstrlenW( feature ) + 20 + 3;
ret = msi_alloc_zero( sz * sizeof(WCHAR) );
- if (ret) swprintf( ret, sz, fmt, productid_85, feature, component ? '>' : '<', component_85 );
+ if (ret) swprintf( ret, sz, L"%s%s%c%s", productid_85, feature, component ? '>' : '<', component_85 );
return ret;
}
@@ -5971,16 +5568,13 @@ end:
*/
static UINT ACTION_PublishComponents(MSIPACKAGE *package)
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','`',0};
MSIQUERY *view;
UINT rc;
-
+
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szPublishComponents);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"PublishComponents");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `PublishComponent`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -5991,12 +5585,6 @@ static UINT ACTION_PublishComponents(MSIPACKAGE *package)
static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param )
{
- static const WCHAR szInstallerComponents[] = {
- 'S','o','f','t','w','a','r','e','\\',
- 'M','i','c','r','o','s','o','f','t','\\',
- 'I','n','s','t','a','l','l','e','r','\\',
- 'C','o','m','p','o','n','e','n','t','s','\\',0};
-
MSIPACKAGE *package = param;
LPCWSTR compgroupid, component, feature, qualifier;
MSICOMPONENT *comp;
@@ -6026,7 +5614,7 @@ static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param )
qualifier = MSI_RecordGetString( rec, 2 );
squash_guid( compgroupid, squashed );
- lstrcpyW( keypath, szInstallerComponents );
+ lstrcpyW( keypath, L"Software\\Microsoft\\Installer\\Components\\" );
lstrcatW( keypath, squashed );
res = RegDeleteKeyW( HKEY_CURRENT_USER, keypath );
@@ -6046,16 +5634,13 @@ static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param )
static UINT ACTION_UnpublishComponents( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szUnpublishComponents);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"UnpublishComponents");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `PublishComponent`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -6066,10 +5651,6 @@ static UINT ACTION_UnpublishComponents( MSIPACKAGE *package )
static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
{
- static const WCHAR query[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','o','m','p','o','n','e','n','t','`',' ','W','H','E','R','E',' ',
- '`','C','o','m','p','o','n','e','n','t','`',' ','=','\'','%','s','\'',0};
MSIPACKAGE *package = param;
MSICOMPONENT *component;
MSIRECORD *row;
@@ -6126,7 +5707,7 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
err_control &= ~msidbServiceInstallErrorControlVital;
/* fetch the service path */
- row = MSI_QueryGetRecord(package->db, query, comp);
+ row = MSI_QueryGetRecord(package->db, L"SELECT * FROM `Component` WHERE `Component` = '%s'", comp);
if (!row)
{
ERR("Query failed\n");
@@ -6156,7 +5737,7 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
}
lstrcpyW(image_path, file->TargetPath);
- lstrcatW(image_path, szSpace);
+ lstrcatW(image_path, L" ");
lstrcatW(image_path, args);
}
service = CreateServiceW(hscm, name, disp, GENERIC_ALL, serv_type,
@@ -6197,16 +5778,13 @@ done:
static UINT ACTION_InstallServices( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'S','e','r','v','i','c','e','I','n','s','t','a','l','l',0};
MSIQUERY *view;
UINT rc;
-
+
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szInstallServices);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"InstallServices");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ServiceInstall`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -6222,10 +5800,8 @@ static LPCWSTR *msi_service_args_to_vector(LPWSTR args, DWORD *numargs)
LPWSTR p, q;
DWORD sep_len;
- static const WCHAR separator[] = {'[','~',']',0};
-
*numargs = 0;
- sep_len = ARRAY_SIZE(separator) - 1;
+ sep_len = ARRAY_SIZE(L"[~]") - 1;
if (!args)
return NULL;
@@ -6240,7 +5816,7 @@ static LPCWSTR *msi_service_args_to_vector(LPWSTR args, DWORD *numargs)
(*numargs)++;
vector[*numargs - 1] = p;
- if ((q = wcsstr(p, separator)))
+ if ((q = wcsstr(p, L"[~]")))
{
*q = '\0';
@@ -6371,16 +5947,13 @@ done:
static UINT ACTION_StartServices( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szStartServices);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"StartServices");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ServiceControl`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -6537,16 +6110,13 @@ done:
static UINT ACTION_StopServices( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szStopServices);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"StopServices");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ServiceControl`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -6623,16 +6193,13 @@ done:
static UINT ACTION_DeleteServices( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szDeleteServices);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"DeleteServices");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ServiceControl`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -6653,13 +6220,6 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param )
DWORD len, usage;
UINT r = ERROR_SUCCESS;
- static const WCHAR driver_fmt[] = {
- 'D','r','i','v','e','r','=','%','s',0};
- static const WCHAR setup_fmt[] = {
- 'S','e','t','u','p','=','%','s',0};
- static const WCHAR usage_fmt[] = {
- 'F','i','l','e','U','s','a','g','e','=','1',0};
-
component = MSI_RecordGetString( rec, 2 );
comp = msi_get_loaded_component( package, component );
if (!comp)
@@ -6685,10 +6245,10 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param )
return ERROR_FUNCTION_FAILED;
}
- len = lstrlenW(desc) + lstrlenW(driver_fmt) + lstrlenW(driver_file->FileName);
+ len = lstrlenW(desc) + lstrlenW(L"Driver=%s") + lstrlenW(driver_file->FileName);
if (setup_file)
- len += lstrlenW(setup_fmt) + lstrlenW(setup_file->FileName);
- len += lstrlenW(usage_fmt) + 2; /* \0\0 */
+ len += lstrlenW(L"Setup=%s") + lstrlenW(setup_file->FileName);
+ len += lstrlenW(L"FileUsage=1") + 2; /* \0\0 */
driver = msi_alloc(len * sizeof(WCHAR));
if (!driver)
@@ -6698,16 +6258,16 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param )
lstrcpyW(ptr, desc);
ptr += lstrlenW(ptr) + 1;
- len = swprintf(ptr, len - (ptr - driver), driver_fmt, driver_file->FileName);
+ len = swprintf(ptr, len - (ptr - driver), L"Driver=%s", driver_file->FileName);
ptr += len + 1;
if (setup_file)
{
- len = swprintf(ptr, len - (ptr - driver), setup_fmt, setup_file->FileName);
+ len = swprintf(ptr, len - (ptr - driver), L"Setup=%s", setup_file->FileName);
ptr += len + 1;
}
- lstrcpyW(ptr, usage_fmt);
+ lstrcpyW(ptr, L"FileUsage=1");
ptr += lstrlenW(ptr) + 1;
*ptr = '\0';
@@ -6752,11 +6312,6 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param )
DWORD len, usage;
UINT r = ERROR_SUCCESS;
- static const WCHAR translator_fmt[] = {
- 'T','r','a','n','s','l','a','t','o','r','=','%','s',0};
- static const WCHAR setup_fmt[] = {
- 'S','e','t','u','p','=','%','s',0};
-
component = MSI_RecordGetString( rec, 2 );
comp = msi_get_loaded_component( package, component );
if (!comp)
@@ -6782,9 +6337,9 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param )
return ERROR_FUNCTION_FAILED;
}
- len = lstrlenW(desc) + lstrlenW(translator_fmt) + lstrlenW(translator_file->FileName) + 2; /* \0\0 */
+ len = lstrlenW(desc) + lstrlenW(L"Translator=%s") + lstrlenW(translator_file->FileName) + 2; /* \0\0 */
if (setup_file)
- len += lstrlenW(setup_fmt) + lstrlenW(setup_file->FileName);
+ len += lstrlenW(L"Setup=%s") + lstrlenW(setup_file->FileName);
translator = msi_alloc(len * sizeof(WCHAR));
if (!translator)
@@ -6794,12 +6349,12 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param )
lstrcpyW(ptr, desc);
ptr += lstrlenW(ptr) + 1;
- len = swprintf(ptr, len - (ptr - translator), translator_fmt, translator_file->FileName);
+ len = swprintf(ptr, len - (ptr - translator), L"Translator=%s", translator_file->FileName);
ptr += len + 1;
if (setup_file)
{
- len = swprintf(ptr, len - (ptr - translator), setup_fmt, setup_file->FileName);
+ len = swprintf(ptr, len - (ptr - translator), L"Setup=%s", setup_file->FileName);
ptr += len + 1;
}
*ptr = '\0';
@@ -6840,9 +6395,6 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param )
UINT r = ERROR_SUCCESS;
MSIRECORD *uirow;
- static const WCHAR attrs_fmt[] = {
- 'D','S','N','=','%','s',0 };
-
component = MSI_RecordGetString( rec, 2 );
comp = msi_get_loaded_component( package, component );
if (!comp)
@@ -6862,12 +6414,12 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param )
if (registration == msidbODBCDataSourceRegistrationPerMachine) request = ODBC_ADD_SYS_DSN;
else if (registration == msidbODBCDataSourceRegistrationPerUser) request = ODBC_ADD_DSN;
- len = lstrlenW(attrs_fmt) + lstrlenW(desc) + 2; /* \0\0 */
+ len = lstrlenW(L"DSN=%s") + lstrlenW(desc) + 2; /* \0\0 */
attrs = msi_alloc(len * sizeof(WCHAR));
if (!attrs)
return ERROR_OUTOFMEMORY;
- len = swprintf(attrs, len, attrs_fmt, desc);
+ len = swprintf(attrs, len, L"DSN=%s", desc);
attrs[len + 1] = 0;
if (!SQLConfigDataSourceW(NULL, request, driver, attrs))
@@ -6887,22 +6439,13 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param )
static UINT ACTION_InstallODBC( MSIPACKAGE *package )
{
- static const WCHAR driver_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','D','r','i','v','e','r',0};
- static const WCHAR translator_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0};
- static const WCHAR source_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szInstallODBC);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"InstallODBC");
- rc = MSI_DatabaseOpenViewW(package->db, driver_query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ODBCDriver`", &view);
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDriver, package);
@@ -6910,7 +6453,7 @@ static UINT ACTION_InstallODBC( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW(package->db, translator_query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ODBCTranslator`", &view);
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCTranslator, package);
@@ -6918,7 +6461,7 @@ static UINT ACTION_InstallODBC( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW(package->db, source_query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `ODBCDataSource`", &view);
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDataSource, package);
@@ -7018,9 +6561,6 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param )
INT registration;
DWORD len;
- static const WCHAR attrs_fmt[] = {
- 'D','S','N','=','%','s',0 };
-
component = MSI_RecordGetString( rec, 2 );
comp = msi_get_loaded_component( package, component );
if (!comp)
@@ -7040,14 +6580,14 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param )
if (registration == msidbODBCDataSourceRegistrationPerMachine) request = ODBC_REMOVE_SYS_DSN;
else if (registration == msidbODBCDataSourceRegistrationPerUser) request = ODBC_REMOVE_DSN;
- len = lstrlenW( attrs_fmt ) + lstrlenW( desc ) + 2; /* \0\0 */
+ len = lstrlenW( L"DSN=%s" ) + lstrlenW( desc ) + 2; /* \0\0 */
attrs = msi_alloc( len * sizeof(WCHAR) );
if (!attrs)
return ERROR_OUTOFMEMORY;
FIXME("Use ODBCSourceAttribute table\n");
- len = swprintf( attrs, len, attrs_fmt, desc );
+ len = swprintf( attrs, len, L"DSN=%s", desc );
attrs[len + 1] = 0;
if (!SQLConfigDataSourceW( NULL, request, driver, attrs ))
@@ -7068,22 +6608,13 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param )
static UINT ACTION_RemoveODBC( MSIPACKAGE *package )
{
- static const WCHAR driver_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','D','r','i','v','e','r',0};
- static const WCHAR translator_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0};
- static const WCHAR source_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveODBC);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveODBC");
- rc = MSI_DatabaseOpenViewW( package->db, driver_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ODBCDriver`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDriver, package );
@@ -7091,7 +6622,7 @@ static UINT ACTION_RemoveODBC( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW( package->db, translator_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ODBCTranslator`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCTranslator, package );
@@ -7099,7 +6630,7 @@ static UINT ACTION_RemoveODBC( MSIPACKAGE *package )
if (rc != ERROR_SUCCESS)
return rc;
}
- rc = MSI_DatabaseOpenViewW( package->db, source_query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ODBCDataSource`", &view );
if (rc == ERROR_SUCCESS)
{
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDataSource, package );
@@ -7124,10 +6655,7 @@ static UINT ACTION_RemoveODBC( MSIPACKAGE *package )
static UINT env_parse_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
{
- LPCWSTR cptr = *name;
-
- static const WCHAR prefix[] = {'[','~',']',0};
- static const int prefix_len = 3;
+ const WCHAR *cptr = *name;
*flags = 0;
while (*cptr)
@@ -7158,24 +6686,24 @@ static UINT env_parse_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
if (*value)
{
LPCWSTR ptr = *value;
- if (!wcsncmp(ptr, prefix, prefix_len))
+ if (!wcsncmp(ptr, L"[~]", 3))
{
- if (ptr[prefix_len] == szSemiColon[0])
+ if (ptr[3] == ';')
{
*flags |= ENV_MOD_APPEND;
- *value += lstrlenW(prefix);
+ *value += 3;
}
else
{
*value = NULL;
}
}
- else if (lstrlenW(*value) >= prefix_len)
+ else if (lstrlenW(*value) >= 3)
{
- ptr += lstrlenW(ptr) - prefix_len;
- if (!wcscmp( ptr, prefix ))
+ ptr += lstrlenW(ptr) - 3;
+ if (!wcscmp( ptr, L"[~]" ))
{
- if ((ptr-1) > *value && *(ptr-1) == szSemiColon[0])
+ if ((ptr-1) > *value && *(ptr-1) == ';')
{
*flags |= ENV_MOD_PREFIX;
/* the "[~]" will be removed by deformat_string */;
@@ -7205,26 +6733,18 @@ static UINT env_parse_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
static UINT open_env_key( DWORD flags, HKEY *key )
{
- static const WCHAR user_env[] =
- {'E','n','v','i','r','o','n','m','e','n','t',0};
- static const WCHAR machine_env[] =
- {'S','y','s','t','e','m','\\',
- 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
- 'C','o','n','t','r','o','l','\\',
- 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r','\\',
- 'E','n','v','i','r','o','n','m','e','n','t',0};
const WCHAR *env;
HKEY root;
LONG res;
if (flags & ENV_MOD_MACHINE)
{
- env = machine_env;
+ env = L"System\\CurrentControlSet\\Control\\Session Manager\\Environment";
root = HKEY_LOCAL_MACHINE;
}
else
{
- env = user_env;
+ env = L"Environment";
root = HKEY_CURRENT_USER;
}
@@ -7423,16 +6943,13 @@ done:
static UINT ACTION_WriteEnvironmentStrings( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','E','n','v','i','r','o','n','m','e','n','t','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szWriteEnvironmentStrings);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"WriteEnvironmentStrings");
- rc = MSI_DatabaseOpenViewW(package->db, query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, L"SELECT * FROM `Environment`", &view);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -7568,16 +7085,13 @@ done:
static UINT ACTION_RemoveEnvironmentStrings( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','E','n','v','i','r','o','n','m','e','n','t','`',0};
MSIQUERY *view;
UINT rc;
if (package->script == SCRIPT_NONE)
- return msi_schedule_action(package, SCRIPT_INSTALL, szRemoveEnvironmentStrings);
+ return msi_schedule_action(package, SCRIPT_INSTALL, L"RemoveEnvironmentStrings");
- rc = MSI_DatabaseOpenViewW( package->db, query, &view );
+ rc = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Environment`", &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -7591,18 +7105,18 @@ UINT msi_validate_product_id( MSIPACKAGE *package )
LPWSTR key, template, id;
UINT r = ERROR_SUCCESS;
- id = msi_dup_property( package->db, szProductID );
+ id = msi_dup_property( package->db, L"ProductID" );
if (id)
{
msi_free( id );
return ERROR_SUCCESS;
}
- template = msi_dup_property( package->db, szPIDTemplate );
- key = msi_dup_property( package->db, szPIDKEY );
+ template = msi_dup_property( package->db, L"PIDTemplate" );
+ key = msi_dup_property( package->db, L"PIDKEY" );
if (key && template)
{
FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) );
- r = msi_set_property( package->db, szProductID, key, -1 );
+ r = msi_set_property( package->db, L"ProductID", key, -1 );
}
msi_free( template );
msi_free( key );
@@ -7623,10 +7137,8 @@ static UINT ACTION_ScheduleReboot( MSIPACKAGE *package )
static UINT ACTION_AllocateRegistrySpace( MSIPACKAGE *package )
{
- static const WCHAR szAvailableFreeReg[] =
- {'A','V','A','I','L','A','B','L','E','F','R','E','E','R','E','G',0};
MSIRECORD *uirow;
- int space = msi_get_property_int( package->db, szAvailableFreeReg, 0 );
+ int space = msi_get_property_int( package->db, L"AVAILABLEFREEREG", 0 );
TRACE("%p %d kilobytes\n", package, space);
@@ -7642,7 +7154,7 @@ static UINT ACTION_DisableRollback( MSIPACKAGE *package )
{
TRACE("%p\n", package);
- msi_set_property( package->db, szRollbackDisabled, szOne, -1 );
+ msi_set_property( package->db, L"RollbackDisabled", L"1", -1 );
return ERROR_SUCCESS;
}
@@ -7654,16 +7166,10 @@ static UINT ACTION_InstallAdminPackage( MSIPACKAGE *package )
static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
{
- static const WCHAR driver_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','D','r','i','v','e','r',0};
- static const WCHAR translator_query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0};
MSIQUERY *view;
UINT r, count;
- r = MSI_DatabaseOpenViewW( package->db, driver_query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ODBCDriver`", &view );
if (r == ERROR_SUCCESS)
{
count = 0;
@@ -7673,7 +7179,7 @@ static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
return r;
if (count) FIXME("ignored %u rows in ODBCDriver table\n", count);
}
- r = MSI_DatabaseOpenViewW( package->db, translator_query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `ODBCTranslator`", &view );
if (r == ERROR_SUCCESS)
{
count = 0;
@@ -7688,13 +7194,10 @@ static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
{
- static const WCHAR fmtW[] =
- {'m','s','i','e','x','e','c',' ','/','q','n',' ','/','i',' ','%','s',' ',
- 'R','E','M','O','V','E','=','%','s',0};
MSIPACKAGE *package = param;
const WCHAR *property = MSI_RecordGetString( rec, 7 );
int attrs = MSI_RecordGetInteger( rec, 5 );
- UINT len = ARRAY_SIZE( fmtW );
+ UINT len = ARRAY_SIZE( L"msiexec /qn /i %s REMOVE=%s" );
WCHAR *product, *features, *cmd;
STARTUPINFOW si;
PROCESS_INFORMATION info;
@@ -7709,7 +7212,7 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
if (features)
len += lstrlenW( features );
else
- len += ARRAY_SIZE( szAll );
+ len += ARRAY_SIZE( L"ALL" );
if (!(cmd = msi_alloc( len * sizeof(WCHAR) )))
{
@@ -7717,7 +7220,7 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
msi_free( features );
return ERROR_OUTOFMEMORY;
}
- swprintf( cmd, len, fmtW, product, features ? features : szAll );
+ swprintf( cmd, len, L"msiexec /qn /i %s REMOVE=%s", product, features ? features : L"ALL" );
msi_free( product );
msi_free( features );
@@ -7734,12 +7237,10 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param )
static UINT ACTION_RemoveExistingProducts( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','U','p','g','r','a','d','e',0};
MSIQUERY *view;
UINT r;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Upgrade`", &view );
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords( view, NULL, ITERATE_RemoveExistingProducts, package );
@@ -7787,23 +7288,20 @@ static UINT ITERATE_MigrateFeatureStates( MSIRECORD *rec, LPVOID param )
static UINT ACTION_MigrateFeatureStates( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'U','p','g','r','a','d','e',0};
MSIQUERY *view;
UINT r;
- if (msi_get_property_int( package->db, szInstalled, 0 ))
+ if (msi_get_property_int( package->db, L"Installed", 0 ))
{
TRACE("product is installed, skipping action\n");
return ERROR_SUCCESS;
}
- if (msi_get_property_int( package->db, szPreselected, 0 ))
+ if (msi_get_property_int( package->db, L"Preselected", 0 ))
{
TRACE("Preselected property is set, not migrating feature states\n");
return ERROR_SUCCESS;
}
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `Upgrade`", &view );
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords( view, NULL, ITERATE_MigrateFeatureStates, package );
@@ -7871,13 +7369,10 @@ static UINT ITERATE_BindImage( MSIRECORD *rec, LPVOID param )
static UINT ACTION_BindImage( MSIPACKAGE *package )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- 'B','i','n','d','I','m','a','g','e',0};
MSIQUERY *view;
UINT r;
- r = MSI_DatabaseOpenViewW( package->db, query, &view );
+ r = MSI_DatabaseOpenViewW( package->db, L"SELECT * FROM `BindImage`", &view );
if (r == ERROR_SUCCESS)
{
MSI_IterateRecords( view, NULL, ITERATE_BindImage, package );
@@ -7888,13 +7383,11 @@ static UINT ACTION_BindImage( MSIPACKAGE *package )
static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, LPCSTR action, LPCWSTR table )
{
- static const WCHAR query[] = {
- 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','%','s','`',0};
MSIQUERY *view;
DWORD count = 0;
UINT r;
-
- r = MSI_OpenQuery( package->db, &view, query, table );
+
+ r = MSI_OpenQuery( package->db, &view, L"SELECT * FROM `%s`", table );
if (r == ERROR_SUCCESS)
{
r = MSI_IterateRecords(view, &count, NULL, package);
@@ -7908,33 +7401,27 @@ static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, LPCSTR action, L
static UINT ACTION_IsolateComponents( MSIPACKAGE *package )
{
- static const WCHAR table[] = {
- 'I','s','o','l','a','t','e','d','C','o','m','p','o','n','e','n','t',0 };
- return msi_unimplemented_action_stub( package, "IsolateComponents", table );
+ return msi_unimplemented_action_stub( package, "IsolateComponents", L"IsolateComponent" );
}
static UINT ACTION_RMCCPSearch( MSIPACKAGE *package )
{
- static const WCHAR table[] = { 'C','C','P','S','e','a','r','c','h',0 };
- return msi_unimplemented_action_stub( package, "RMCCPSearch", table );
+ return msi_unimplemented_action_stub( package, "RMCCPSearch", L"CCPSearch" );
}
static UINT ACTION_RegisterComPlus( MSIPACKAGE *package )
{
- static const WCHAR table[] = { 'C','o','m','p','l','u','s',0 };
- return msi_unimplemented_action_stub( package, "RegisterComPlus", table );
+ return msi_unimplemented_action_stub( package, "RegisterComPlus", L"Complus" );
}
static UINT ACTION_UnregisterComPlus( MSIPACKAGE *package )
{
- static const WCHAR table[] = { 'C','o','m','p','l','u','s',0 };
- return msi_unimplemented_action_stub( package, "UnregisterComPlus", table );
+ return msi_unimplemented_action_stub( package, "UnregisterComPlus", L"Complus" );
}
static UINT ACTION_InstallSFPCatalogFile( MSIPACKAGE *package )
{
- static const WCHAR table[] = { 'S','F','P','C','a','t','a','l','o','g',0 };
- return msi_unimplemented_action_stub( package, "InstallSFPCatalogFile", table );
+ return msi_unimplemented_action_stub( package, "InstallSFPCatalogFile", L"SFPCatalog" );
}
static const struct
@@ -7947,83 +7434,83 @@ static const struct
}
StandardActions[] =
{
- { szAllocateRegistrySpace, IDS_DESC_ALLOCATEREGISTRYSPACE, IDS_TEMP_ALLOCATEREGISTRYSPACE, ACTION_AllocateRegistrySpace, NULL },
- { szAppSearch, IDS_DESC_APPSEARCH, IDS_TEMP_APPSEARCH, ACTION_AppSearch, NULL },
- { szBindImage, IDS_DESC_BINDIMAGE, IDS_TEMP_BINDIMAGE, ACTION_BindImage, NULL },
- { szCCPSearch, IDS_DESC_CCPSEARCH, 0, ACTION_CCPSearch, NULL },
- { szCostFinalize, IDS_DESC_COSTFINALIZE, 0, ACTION_CostFinalize, NULL },
- { szCostInitialize, IDS_DESC_COSTINITIALIZE, 0, ACTION_CostInitialize, NULL },
- { szCreateFolders, IDS_DESC_CREATEFOLDERS, IDS_TEMP_CREATEFOLDERS, ACTION_CreateFolders, szRemoveFolders },
- { szCreateShortcuts, IDS_DESC_CREATESHORTCUTS, IDS_TEMP_CREATESHORTCUTS, ACTION_CreateShortcuts, szRemoveShortcuts },
- { szDeleteServices, IDS_DESC_DELETESERVICES, IDS_TEMP_DELETESERVICES, ACTION_DeleteServices, szInstallServices },
- { szDisableRollback, 0, 0, ACTION_DisableRollback, NULL },
- { szDuplicateFiles, IDS_DESC_DUPLICATEFILES, IDS_TEMP_DUPLICATEFILES, ACTION_DuplicateFiles, szRemoveDuplicateFiles },
- { szExecuteAction, 0, 0, ACTION_ExecuteAction, NULL },
- { szFileCost, IDS_DESC_FILECOST, 0, ACTION_FileCost, NULL },
- { szFindRelatedProducts, IDS_DESC_FINDRELATEDPRODUCTS, IDS_TEMP_FINDRELATEDPRODUCTS, ACTION_FindRelatedProducts, NULL },
- { szForceReboot, 0, 0, ACTION_ForceReboot, NULL },
- { szInstallAdminPackage, IDS_DESC_INSTALLADMINPACKAGE, IDS_TEMP_INSTALLADMINPACKAGE, ACTION_InstallAdminPackage, NULL },
- { szInstallExecute, 0, 0, ACTION_InstallExecute, NULL },
- { szInstallExecuteAgain, 0, 0, ACTION_InstallExecute, NULL },
- { szInstallFiles, IDS_DESC_INSTALLFILES, IDS_TEMP_INSTALLFILES, ACTION_InstallFiles, szRemoveFiles },
- { szInstallFinalize, 0, 0, ACTION_InstallFinalize, NULL },
- { szInstallInitialize, 0, 0, ACTION_InstallInitialize, NULL },
- { szInstallODBC, IDS_DESC_INSTALLODBC, 0, ACTION_InstallODBC, szRemoveODBC },
- { szInstallServices, IDS_DESC_INSTALLSERVICES, IDS_TEMP_INSTALLSERVICES, ACTION_InstallServices, szDeleteServices },
- { szInstallSFPCatalogFile, IDS_DESC_INSTALLSFPCATALOGFILE, IDS_TEMP_INSTALLSFPCATALOGFILE, ACTION_InstallSFPCatalogFile, NULL },
- { szInstallValidate, IDS_DESC_INSTALLVALIDATE, 0, ACTION_InstallValidate, NULL },
- { szIsolateComponents, 0, 0, ACTION_IsolateComponents, NULL },
- { szLaunchConditions, IDS_DESC_LAUNCHCONDITIONS, 0, ACTION_LaunchConditions, NULL },
- { szMigrateFeatureStates, IDS_DESC_MIGRATEFEATURESTATES, IDS_TEMP_MIGRATEFEATURESTATES, ACTION_MigrateFeatureStates, NULL },
- { szMoveFiles, IDS_DESC_MOVEFILES, IDS_TEMP_MOVEFILES, ACTION_MoveFiles, NULL },
- { szMsiPublishAssemblies, IDS_DESC_MSIPUBLISHASSEMBLIES, IDS_TEMP_MSIPUBLISHASSEMBLIES, ACTION_MsiPublishAssemblies, szMsiUnpublishAssemblies },
- { szMsiUnpublishAssemblies, IDS_DESC_MSIUNPUBLISHASSEMBLIES, IDS_TEMP_MSIUNPUBLISHASSEMBLIES, ACTION_MsiUnpublishAssemblies, szMsiPublishAssemblies },
- { szPatchFiles, IDS_DESC_PATCHFILES, IDS_TEMP_PATCHFILES, ACTION_PatchFiles, NULL },
- { szProcessComponents, IDS_DESC_PROCESSCOMPONENTS, 0, ACTION_ProcessComponents, szProcessComponents },
- { szPublishComponents, IDS_DESC_PUBLISHCOMPONENTS, IDS_TEMP_PUBLISHCOMPONENTS, ACTION_PublishComponents, szUnpublishComponents },
- { szPublishFeatures, IDS_DESC_PUBLISHFEATURES, IDS_TEMP_PUBLISHFEATURES, ACTION_PublishFeatures, szUnpublishFeatures },
- { szPublishProduct, IDS_DESC_PUBLISHPRODUCT, 0, ACTION_PublishProduct, szUnpublishProduct },
- { szRegisterClassInfo, IDS_DESC_REGISTERCLASSINFO, IDS_TEMP_REGISTERCLASSINFO, ACTION_RegisterClassInfo, szUnregisterClassInfo },
- { szRegisterComPlus, IDS_DESC_REGISTERCOMPLUS, IDS_TEMP_REGISTERCOMPLUS, ACTION_RegisterComPlus, szUnregisterComPlus },
- { szRegisterExtensionInfo, IDS_DESC_REGISTEREXTENSIONINFO, 0, ACTION_RegisterExtensionInfo, szUnregisterExtensionInfo },
- { szRegisterFonts, IDS_DESC_REGISTERFONTS, IDS_TEMP_REGISTERFONTS, ACTION_RegisterFonts, szUnregisterFonts },
- { szRegisterMIMEInfo, IDS_DESC_REGISTERMIMEINFO, IDS_TEMP_REGISTERMIMEINFO, ACTION_RegisterMIMEInfo, szUnregisterMIMEInfo },
- { szRegisterProduct, IDS_DESC_REGISTERPRODUCT, 0, ACTION_RegisterProduct, NULL },
- { szRegisterProgIdInfo, IDS_DESC_REGISTERPROGIDINFO, IDS_TEMP_REGISTERPROGIDINFO, ACTION_RegisterProgIdInfo, szUnregisterProgIdInfo },
- { szRegisterTypeLibraries, IDS_DESC_REGISTERTYPELIBRARIES, IDS_TEMP_REGISTERTYPELIBRARIES, ACTION_RegisterTypeLibraries, szUnregisterTypeLibraries },
- { szRegisterUser, IDS_DESC_REGISTERUSER, 0, ACTION_RegisterUser, NULL },
- { szRemoveDuplicateFiles, IDS_DESC_REMOVEDUPLICATEFILES, IDS_TEMP_REMOVEDUPLICATEFILES, ACTION_RemoveDuplicateFiles, szDuplicateFiles },
- { szRemoveEnvironmentStrings, IDS_DESC_REMOVEENVIRONMENTSTRINGS, IDS_TEMP_REMOVEENVIRONMENTSTRINGS, ACTION_RemoveEnvironmentStrings, szWriteEnvironmentStrings },
- { szRemoveExistingProducts, IDS_DESC_REMOVEEXISTINGPRODUCTS, IDS_TEMP_REMOVEEXISTINGPRODUCTS, ACTION_RemoveExistingProducts, NULL },
- { szRemoveFiles, IDS_DESC_REMOVEFILES, IDS_TEMP_REMOVEFILES, ACTION_RemoveFiles, szInstallFiles },
- { szRemoveFolders, IDS_DESC_REMOVEFOLDERS, IDS_TEMP_REMOVEFOLDERS, ACTION_RemoveFolders, szCreateFolders },
- { szRemoveIniValues, IDS_DESC_REMOVEINIVALUES, IDS_TEMP_REMOVEINIVALUES, ACTION_RemoveIniValues, szWriteIniValues },
- { szRemoveODBC, IDS_DESC_REMOVEODBC, 0, ACTION_RemoveODBC, szInstallODBC },
- { szRemoveRegistryValues, IDS_DESC_REMOVEREGISTRYVALUES, IDS_TEMP_REMOVEREGISTRYVALUES, ACTION_RemoveRegistryValues, szWriteRegistryValues },
- { szRemoveShortcuts, IDS_DESC_REMOVESHORTCUTS, IDS_TEMP_REMOVESHORTCUTS, ACTION_RemoveShortcuts, szCreateShortcuts },
- { szResolveSource, 0, 0, ACTION_ResolveSource, NULL },
- { szRMCCPSearch, IDS_DESC_RMCCPSEARCH, 0, ACTION_RMCCPSearch, NULL },
- { szScheduleReboot, 0, 0, ACTION_ScheduleReboot, NULL },
- { szSelfRegModules, IDS_DESC_SELFREGMODULES, IDS_TEMP_SELFREGMODULES, ACTION_SelfRegModules, szSelfUnregModules },
- { szSelfUnregModules, IDS_DESC_SELFUNREGMODULES, IDS_TEMP_SELFUNREGMODULES, ACTION_SelfUnregModules, szSelfRegModules },
- { szSetODBCFolders, IDS_DESC_SETODBCFOLDERS, 0, ACTION_SetODBCFolders, NULL },
- { szStartServices, IDS_DESC_STARTSERVICES, IDS_TEMP_STARTSERVICES, ACTION_StartServices, szStopServices },
- { szStopServices, IDS_DESC_STOPSERVICES, IDS_TEMP_STOPSERVICES, ACTION_StopServices, szStartServices },
- { szUnpublishComponents, IDS_DESC_UNPUBLISHCOMPONENTS, IDS_TEMP_UNPUBLISHCOMPONENTS, ACTION_UnpublishComponents, szPublishComponents },
- { szUnpublishFeatures, IDS_DESC_UNPUBLISHFEATURES, IDS_TEMP_UNPUBLISHFEATURES, ACTION_UnpublishFeatures, szPublishFeatures },
- { szUnpublishProduct, IDS_DESC_UNPUBLISHPRODUCT, 0, ACTION_UnpublishProduct, NULL }, /* for rollback only */
- { szUnregisterClassInfo, IDS_DESC_UNREGISTERCLASSINFO, IDS_TEMP_UNREGISTERCLASSINFO, ACTION_UnregisterClassInfo, szRegisterClassInfo },
- { szUnregisterComPlus, IDS_DESC_UNREGISTERCOMPLUS, IDS_TEMP_UNREGISTERCOMPLUS, ACTION_UnregisterComPlus, szRegisterComPlus },
- { szUnregisterExtensionInfo, IDS_DESC_UNREGISTEREXTENSIONINFO, IDS_TEMP_UNREGISTEREXTENSIONINFO, ACTION_UnregisterExtensionInfo, szRegisterExtensionInfo },
- { szUnregisterFonts, IDS_DESC_UNREGISTERFONTS, IDS_TEMP_UNREGISTERFONTS, ACTION_UnregisterFonts, szRegisterFonts },
- { szUnregisterMIMEInfo, IDS_DESC_UNREGISTERMIMEINFO, IDS_TEMP_UNREGISTERMIMEINFO, ACTION_UnregisterMIMEInfo, szRegisterMIMEInfo },
- { szUnregisterProgIdInfo, IDS_DESC_UNREGISTERPROGIDINFO, IDS_TEMP_UNREGISTERPROGIDINFO, ACTION_UnregisterProgIdInfo, szRegisterProgIdInfo },
- { szUnregisterTypeLibraries, IDS_DESC_UNREGISTERTYPELIBRARIES, IDS_TEMP_UNREGISTERTYPELIBRARIES, ACTION_UnregisterTypeLibraries, szRegisterTypeLibraries },
- { szValidateProductID, 0, 0, ACTION_ValidateProductID, NULL },
- { szWriteEnvironmentStrings, IDS_DESC_WRITEENVIRONMENTSTRINGS, IDS_TEMP_WRITEENVIRONMENTSTRINGS, ACTION_WriteEnvironmentStrings, szRemoveEnvironmentStrings },
- { szWriteIniValues, IDS_DESC_WRITEINIVALUES, IDS_TEMP_WRITEINIVALUES, ACTION_WriteIniValues, szRemoveIniValues },
- { szWriteRegistryValues, IDS_DESC_WRITEREGISTRYVALUES, IDS_TEMP_WRITEREGISTRYVALUES, ACTION_WriteRegistryValues, szRemoveRegistryValues },
- { szINSTALL, 0, 0, ACTION_INSTALL, NULL },
+ { L"AllocateRegistrySpace", IDS_DESC_ALLOCATEREGISTRYSPACE, IDS_TEMP_ALLOCATEREGISTRYSPACE, ACTION_AllocateRegistrySpace, NULL },
+ { L"AppSearch", IDS_DESC_APPSEARCH, IDS_TEMP_APPSEARCH, ACTION_AppSearch, NULL },
+ { L"BindImage", IDS_DESC_BINDIMAGE, IDS_TEMP_BINDIMAGE, ACTION_BindImage, NULL },
+ { L"CCPSearch", IDS_DESC_CCPSEARCH, 0, ACTION_CCPSearch, NULL },
+ { L"CostFinalize", IDS_DESC_COSTFINALIZE, 0, ACTION_CostFinalize, NULL },
+ { L"CostInitialize", IDS_DESC_COSTINITIALIZE, 0, ACTION_CostInitialize, NULL },
+ { L"CreateFolders", IDS_DESC_CREATEFOLDERS, IDS_TEMP_CREATEFOLDERS, ACTION_CreateFolders, L"RemoveFolders" },
+ { L"CreateShortcuts", IDS_DESC_CREATESHORTCUTS, IDS_TEMP_CREATESHORTCUTS, ACTION_CreateShortcuts, L"RemoveShortcuts" },
+ { L"DeleteServices", IDS_DESC_DELETESERVICES, IDS_TEMP_DELETESERVICES, ACTION_DeleteServices, L"InstallServices" },
+ { L"DisableRollback", 0, 0, ACTION_DisableRollback, NULL },
+ { L"DuplicateFiles", IDS_DESC_DUPLICATEFILES, IDS_TEMP_DUPLICATEFILES, ACTION_DuplicateFiles, L"RemoveDuplicateFiles" },
+ { L"ExecuteAction", 0, 0, ACTION_ExecuteAction, NULL },
+ { L"FileCost", IDS_DESC_FILECOST, 0, ACTION_FileCost, NULL },
+ { L"FindRelatedProducts", IDS_DESC_FINDRELATEDPRODUCTS, IDS_TEMP_FINDRELATEDPRODUCTS, ACTION_FindRelatedProducts, NULL },
+ { L"ForceReboot", 0, 0, ACTION_ForceReboot, NULL },
+ { L"InstallAdminPackage", IDS_DESC_INSTALLADMINPACKAGE, IDS_TEMP_INSTALLADMINPACKAGE, ACTION_InstallAdminPackage, NULL },
+ { L"InstallExecute", 0, 0, ACTION_InstallExecute, NULL },
+ { L"InstallExecuteAgain", 0, 0, ACTION_InstallExecute, NULL },
+ { L"InstallFiles", IDS_DESC_INSTALLFILES, IDS_TEMP_INSTALLFILES, ACTION_InstallFiles, L"RemoveFiles" },
+ { L"InstallFinalize", 0, 0, ACTION_InstallFinalize, NULL },
+ { L"InstallInitialize", 0, 0, ACTION_InstallInitialize, NULL },
+ { L"InstallODBC", IDS_DESC_INSTALLODBC, 0, ACTION_InstallODBC, L"RemoveODBC" },
+ { L"InstallServices", IDS_DESC_INSTALLSERVICES, IDS_TEMP_INSTALLSERVICES, ACTION_InstallServices, L"DeleteServices" },
+ { L"InstallSFPCatalogFile", IDS_DESC_INSTALLSFPCATALOGFILE, IDS_TEMP_INSTALLSFPCATALOGFILE, ACTION_InstallSFPCatalogFile, NULL },
+ { L"InstallValidate", IDS_DESC_INSTALLVALIDATE, 0, ACTION_InstallValidate, NULL },
+ { L"IsolateComponents", 0, 0, ACTION_IsolateComponents, NULL },
+ { L"LaunchConditions", IDS_DESC_LAUNCHCONDITIONS, 0, ACTION_LaunchConditions, NULL },
+ { L"MigrateFeutureStates", IDS_DESC_MIGRATEFEATURESTATES, IDS_TEMP_MIGRATEFEATURESTATES, ACTION_MigrateFeatureStates, NULL },
+ { L"MoveFiles", IDS_DESC_MOVEFILES, IDS_TEMP_MOVEFILES, ACTION_MoveFiles, NULL },
+ { L"MsiPublishAssemblies", IDS_DESC_MSIPUBLISHASSEMBLIES, IDS_TEMP_MSIPUBLISHASSEMBLIES, ACTION_MsiPublishAssemblies, L"MsiUnpublishAssemblies" },
+ { L"MsiUnpublishAssemblies", IDS_DESC_MSIUNPUBLISHASSEMBLIES, IDS_TEMP_MSIUNPUBLISHASSEMBLIES, ACTION_MsiUnpublishAssemblies, L"MsiPublishAssemblies" },
+ { L"PatchFiles", IDS_DESC_PATCHFILES, IDS_TEMP_PATCHFILES, ACTION_PatchFiles, NULL },
+ { L"ProcessComponents", IDS_DESC_PROCESSCOMPONENTS, 0, ACTION_ProcessComponents, L"ProcessComponents" },
+ { L"PublishComponents", IDS_DESC_PUBLISHCOMPONENTS, IDS_TEMP_PUBLISHCOMPONENTS, ACTION_PublishComponents, L"UnpublishComponents" },
+ { L"PublishFeatures", IDS_DESC_PUBLISHFEATURES, IDS_TEMP_PUBLISHFEATURES, ACTION_PublishFeatures, L"UnpublishFeatures" },
+ { L"PublishProduct", IDS_DESC_PUBLISHPRODUCT, 0, ACTION_PublishProduct, L"UnpublishProduct" },
+ { L"RegisterClassInfo", IDS_DESC_REGISTERCLASSINFO, IDS_TEMP_REGISTERCLASSINFO, ACTION_RegisterClassInfo, L"UnregisterClassInfo" },
+ { L"RegisterComPlus", IDS_DESC_REGISTERCOMPLUS, IDS_TEMP_REGISTERCOMPLUS, ACTION_RegisterComPlus, L"UnregisterComPlus" },
+ { L"RegisterExtensionInfo", IDS_DESC_REGISTEREXTENSIONINFO, 0, ACTION_RegisterExtensionInfo, L"UnregisterExtensionInfo" },
+ { L"RegisterFonts", IDS_DESC_REGISTERFONTS, IDS_TEMP_REGISTERFONTS, ACTION_RegisterFonts, L"UnregisterFonts" },
+ { L"RegisterMIMEInfo", IDS_DESC_REGISTERMIMEINFO, IDS_TEMP_REGISTERMIMEINFO, ACTION_RegisterMIMEInfo, L"UnregisterMIMEInfo" },
+ { L"RegisterProduct", IDS_DESC_REGISTERPRODUCT, 0, ACTION_RegisterProduct, NULL },
+ { L"RegisterProgIdInfo", IDS_DESC_REGISTERPROGIDINFO, IDS_TEMP_REGISTERPROGIDINFO, ACTION_RegisterProgIdInfo, L"UnregisterProgIdInfo" },
+ { L"RegisterTypeLibraries", IDS_DESC_REGISTERTYPELIBRARIES, IDS_TEMP_REGISTERTYPELIBRARIES, ACTION_RegisterTypeLibraries, L"UnregisterTypeLibraries" },
+ { L"RegisterUser", IDS_DESC_REGISTERUSER, 0, ACTION_RegisterUser, NULL },
+ { L"RemoveDuplicateFiles", IDS_DESC_REMOVEDUPLICATEFILES, IDS_TEMP_REMOVEDUPLICATEFILES, ACTION_RemoveDuplicateFiles, L"DuplicateFiles" },
+ { L"RemoveEnvironmentStrings", IDS_DESC_REMOVEENVIRONMENTSTRINGS, IDS_TEMP_REMOVEENVIRONMENTSTRINGS, ACTION_RemoveEnvironmentStrings, L"WriteEnvironmentStrings" },
+ { L"RemoveExistingProducts", IDS_DESC_REMOVEEXISTINGPRODUCTS, IDS_TEMP_REMOVEEXISTINGPRODUCTS, ACTION_RemoveExistingProducts, NULL },
+ { L"RemoveFiles", IDS_DESC_REMOVEFILES, IDS_TEMP_REMOVEFILES, ACTION_RemoveFiles, L"InstallFiles" },
+ { L"RemoveFolders", IDS_DESC_REMOVEFOLDERS, IDS_TEMP_REMOVEFOLDERS, ACTION_RemoveFolders, L"CreateFolders" },
+ { L"RemoveIniValues", IDS_DESC_REMOVEINIVALUES, IDS_TEMP_REMOVEINIVALUES, ACTION_RemoveIniValues, L"WriteIniValues" },
+ { L"RemoveODBC", IDS_DESC_REMOVEODBC, 0, ACTION_RemoveODBC, L"InstallODBC" },
+ { L"RemoveRegistryValues", IDS_DESC_REMOVEREGISTRYVALUES, IDS_TEMP_REMOVEREGISTRYVALUES, ACTION_RemoveRegistryValues, L"WriteRegistryValues" },
+ { L"RemoveShortcuts", IDS_DESC_REMOVESHORTCUTS, IDS_TEMP_REMOVESHORTCUTS, ACTION_RemoveShortcuts, L"CreateShortcuts" },
+ { L"ResolveSource", 0, 0, ACTION_ResolveSource, NULL },
+ { L"RMCCPSearch", IDS_DESC_RMCCPSEARCH, 0, ACTION_RMCCPSearch, NULL },
+ { L"ScheduleReboot", 0, 0, ACTION_ScheduleReboot, NULL },
+ { L"SelfRegModules", IDS_DESC_SELFREGMODULES, IDS_TEMP_SELFREGMODULES, ACTION_SelfRegModules, L"SelfUnregModules" },
+ { L"SelfUnregModules", IDS_DESC_SELFUNREGMODULES, IDS_TEMP_SELFUNREGMODULES, ACTION_SelfUnregModules, L"SelfRegModules" },
+ { L"SetODBCFolders", IDS_DESC_SETODBCFOLDERS, 0, ACTION_SetODBCFolders, NULL },
+ { L"StartServices", IDS_DESC_STARTSERVICES, IDS_TEMP_STARTSERVICES, ACTION_StartServices, L"StopServices" },
+ { L"StopServices", IDS_DESC_STOPSERVICES, IDS_TEMP_STOPSERVICES, ACTION_StopServices, L"StartServices" },
+ { L"UnpublishComponents", IDS_DESC_UNPUBLISHCOMPONENTS, IDS_TEMP_UNPUBLISHCOMPONENTS, ACTION_UnpublishComponents, L"PublishComponents" },
+ { L"UnpublishFeatures", IDS_DESC_UNPUBLISHFEATURES, IDS_TEMP_UNPUBLISHFEATURES, ACTION_UnpublishFeatures, L"PublishFeatures" },
+ { L"UnpublishProduct", IDS_DESC_UNPUBLISHPRODUCT, 0, ACTION_UnpublishProduct, NULL }, /* for rollback only */
+ { L"UnregisterClassInfo", IDS_DESC_UNREGISTERCLASSINFO, IDS_TEMP_UNREGISTERCLASSINFO, ACTION_UnregisterClassInfo, L"RegisterClassInfo" },
+ { L"UnregisterComPlus", IDS_DESC_UNREGISTERCOMPLUS, IDS_TEMP_UNREGISTERCOMPLUS, ACTION_UnregisterComPlus, L"RegisterComPlus" },
+ { L"UnregisterExtensionInfo", IDS_DESC_UNREGISTEREXTENSIONINFO, IDS_TEMP_UNREGISTEREXTENSIONINFO, ACTION_UnregisterExtensionInfo, L"RegisterExtensionInfo" },
+ { L"UnregisterFonts", IDS_DESC_UNREGISTERFONTS, IDS_TEMP_UNREGISTERFONTS, ACTION_UnregisterFonts, L"RegisterFonts" },
+ { L"UnregisterMIMEInfo", IDS_DESC_UNREGISTERMIMEINFO, IDS_TEMP_UNREGISTERMIMEINFO, ACTION_UnregisterMIMEInfo, L"RegisterMIMEInfo" },
+ { L"UnregisterProgIdInfo", IDS_DESC_UNREGISTERPROGIDINFO, IDS_TEMP_UNREGISTERPROGIDINFO, ACTION_UnregisterProgIdInfo, L"RegisterProgIdInfo" },
+ { L"UnregisterTypeLibraries", IDS_DESC_UNREGISTERTYPELIBRARIES, IDS_TEMP_UNREGISTERTYPELIBRARIES, ACTION_UnregisterTypeLibraries, L"RegisterTypeLibraries" },
+ { L"ValidateProductID", 0, 0, ACTION_ValidateProductID, NULL },
+ { L"WriteEnvironmentStrings", IDS_DESC_WRITEENVIRONMENTSTRINGS, IDS_TEMP_WRITEENVIRONMENTSTRINGS, ACTION_WriteEnvironmentStrings, L"RemoveEnvironmentStrings" },
+ { L"WriteIniValues", IDS_DESC_WRITEINIVALUES, IDS_TEMP_WRITEINIVALUES, ACTION_WriteIniValues, L"RemoveIniValues" },
+ { L"WriteRegistryValues", IDS_DESC_WRITEREGISTRYVALUES, IDS_TEMP_WRITEREGISTRYVALUES, ACTION_WriteRegistryValues, L"RemoveRegistryValues" },
+ { L"INSTALL", 0, 0, ACTION_INSTALL, NULL },
{ 0 }
};
@@ -8093,21 +7580,10 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq)
UINT rc = ERROR_SUCCESS;
MSIRECORD *row;
- static const WCHAR query[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','s','t','a','l','l','E','x','e','c','u','t','e',
- 'S','e','q','u','e','n','c','e','`',' ', 'W','H','E','R','E',' ',
- '`','S','e','q','u','e','n','c','e','`',' ', '=',' ','%','i',0};
- static const WCHAR ui_query[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e',
- '`', ' ', 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',
- ' ', '=',' ','%','i',0};
-
if (needs_ui_sequence(package))
- row = MSI_QueryGetRecord(package->db, ui_query, seq);
+ row = MSI_QueryGetRecord(package->db, L"SELECT * FROM `InstallUISequence` WHERE `Sequence` = %d", seq);
else
- row = MSI_QueryGetRecord(package->db, query, seq);
+ row = MSI_QueryGetRecord(package->db, L"SELECT * FROM `InstallExecuteSequence` WHERE `Sequence` = %d", seq);
if (row)
{
@@ -8148,8 +7624,6 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq)
UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
LPCWSTR szCommandLine )
{
- static const WCHAR szDisableRollback[] = {'D','I','S','A','B','L','E','R','O','L','L','B','A','C','K',0};
- static const WCHAR szAction[] = {'A','C','T','I','O','N',0};
WCHAR *reinstall = NULL, *productcode, *action;
UINT rc;
DWORD len = 0;
@@ -8171,7 +7645,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_free(dir);
dir = msi_alloc(MAX_PATH * sizeof(WCHAR));
GetCurrentDirectoryW(MAX_PATH, dir);
- lstrcatW(dir, szBackSlash);
+ lstrcatW(dir, L"\\");
file = szPackagePath;
}
@@ -8197,9 +7671,9 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( package );
msi_apply_patches( package );
- if (msi_get_property( package->db, szAction, NULL, &len ))
- msi_set_property( package->db, szAction, szINSTALL, -1 );
- action = msi_dup_property( package->db, szAction );
+ if (msi_get_property( package->db, L"ACTION", NULL, &len ))
+ msi_set_property( package->db, L"ACTION", L"INSTALL", -1 );
+ action = msi_dup_property( package->db, L"ACTION" );
CharUpperW(action);
msi_set_original_database_property( package->db, szPackagePath );
@@ -8207,7 +7681,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_adjust_privilege_properties( package );
msi_set_context( package );
- productcode = msi_dup_property( package->db, szProductCode );
+ productcode = msi_dup_property( package->db, L"ProductCode" );
if (wcsicmp( productcode, package->ProductCode ))
{
TRACE( "product code changed %s -> %s\n", debugstr_w(package->ProductCode), debugstr_w(productcode) );
@@ -8216,10 +7690,10 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
}
else msi_free( productcode );
- if (msi_get_property_int( package->db, szDisableRollback, 0 ))
+ if (msi_get_property_int( package->db, L"DISABLEROLLBACK", 0 ))
{
TRACE("disabling rollback\n");
- msi_set_property( package->db, szRollbackDisabled, szOne, -1 );
+ msi_set_property( package->db, L"RollbackDisabled", L"1", -1 );
}
rc = ACTION_PerformAction(package, action);
@@ -8234,7 +7708,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
else /* failed */
{
ACTION_PerformActionSequence(package, -3);
- if (!msi_get_property_int( package->db, szRollbackDisabled, 0 ))
+ if (!msi_get_property_int( package->db, L"RollbackDisabled", 0 ))
{
package->need_rollback = TRUE;
}
@@ -8243,7 +7717,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
/* finish up running custom actions */
ACTION_FinishCustomActions(package);
- if (package->need_rollback && !(reinstall = msi_dup_property( package->db, szReinstall )))
+ if (package->need_rollback && !(reinstall = msi_dup_property( package->db, L"REINSTALL" )))
{
WARN("installation failed, running rollback script\n");
execute_script( package, SCRIPT_ROLLBACK );
--
2.28.0
1
0
From: Giovanni Mascellani <wine(a)mascellani.eu>
Signed-off-by: Giovanni Mascellani <wine(a)mascellani.eu>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
Minor style fixes.
dlls/d2d1/d2d1.spec | 2 +-
dlls/d2d1/factory.c | 7 +++++++
dlls/d2d1/tests/d2d1.c | 23 ++++++++++++++++++++++-
include/d2d1_1.idl | 1 +
4 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/d2d1.spec b/dlls/d2d1/d2d1.spec
index 410abfa5de6..7b624c7096e 100644
--- a/dlls/d2d1/d2d1.spec
+++ b/dlls/d2d1/d2d1.spec
@@ -7,5 +7,5 @@
@ stdcall D2D1CreateDevice(ptr ptr ptr)
@ stub D2D1CreateDeviceContext
@ stdcall D2D1SinCos(float ptr ptr)
-@ stub D2D1Tan
+@ stdcall D2D1Tan(float)
@ stub D2D1Vec3Length
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index 943347d7884..9c5337590cd 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -721,6 +721,13 @@ void WINAPI D2D1SinCos(float angle, float *s, float *c)
*c = cosf(angle);
}
+float WINAPI D2D1Tan(float angle)
+{
+ TRACE("angle %.8e.\n", angle);
+
+ return tanf(angle);
+}
+
static BOOL get_config_key_dword(HKEY default_key, HKEY application_key, const char *name, DWORD *value)
{
DWORD type, data, size;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index df1df01c051..b269770365f 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -9428,7 +9428,7 @@ static void test_wic_bitmap_format(void)
static void test_math(void)
{
unsigned int i;
- float s, c;
+ float s, c, t;
static const struct
{
@@ -9445,6 +9445,20 @@ static void test_math(void)
{M_PI, -8.74227766e-008f, -1.0f},
};
+ static const struct
+ {
+ float x;
+ float t;
+ }
+ t_data[] =
+ {
+ {0.0f, 0.0f},
+ {1.0f, 1.55740774f},
+ {2.0f, -2.18503976f},
+ {M_PI / 2.0f, -2.28773320e+007f},
+ {M_PI, 8.74227766e-008f},
+ };
+
for (i = 0; i < ARRAY_SIZE(sc_data); ++i)
{
D2D1SinCos(sc_data[i].x, &s, &c);
@@ -9453,6 +9467,13 @@ static void test_math(void)
ok(compare_float(c, sc_data[i].c, 0),
"Test %u: Got unexpected cos %.8e, expected %.8e.\n", i, c, sc_data[i].c);
}
+
+ for (i = 0; i < ARRAY_SIZE(t_data); ++i)
+ {
+ t = D2D1Tan(t_data[i].x);
+ ok(compare_float(t, t_data[i].t, 1),
+ "Test %u: Got unexpected tan %.8e, expected %.8e.\n", i, t, t_data[i].t);
+ }
}
START_TEST(d2d1)
diff --git a/include/d2d1_1.idl b/include/d2d1_1.idl
index 6fa893edbda..bd111bd6628 100644
--- a/include/d2d1_1.idl
+++ b/include/d2d1_1.idl
@@ -795,3 +795,4 @@ interface ID2D1Factory1 : ID2D1Factory
[local] HRESULT __stdcall D2D1CreateDevice(IDXGIDevice *dxgi_device,
const D2D1_CREATION_PROPERTIES *creation_properties, ID2D1Device **device);
[local] void __stdcall D2D1SinCos(float angle, float *s, float *c);
+[local] float __stdcall D2D1Tan(float angle);
--
2.20.1
4
3
[PATCH 5/5] riched20: Fix the struct size check in the para fmt retrieval function.
by Huw Davies Oct. 27, 2020
by Huw Davies Oct. 27, 2020
Oct. 27, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/para.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index e1b848cf8f9..c7a0e271510 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -928,7 +928,8 @@ void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt)
ME_DisplayItem *para, *para_end;
PARAFORMAT2 *curFmt;
- if (pFmt->cbSize < sizeof(PARAFORMAT)) {
+ if (pFmt->cbSize < sizeof(PARAFORMAT))
+ {
pFmt->dwMask = 0;
return;
}
@@ -951,13 +952,14 @@ void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt)
CHECK_FIELD(PFM_RIGHTINDENT, dxRightIndent);
CHECK_FIELD(PFM_OFFSET, dxOffset);
CHECK_FIELD(PFM_ALIGNMENT, wAlignment);
- if (pFmt->dwMask & PFM_TABSTOPS) {
+ if (pFmt->dwMask & PFM_TABSTOPS)
+ {
if (pFmt->cTabCount != para->member.para.fmt.cTabCount ||
memcmp(pFmt->rgxTabs, curFmt->rgxTabs, curFmt->cTabCount*sizeof(int)))
pFmt->dwMask &= ~PFM_TABSTOPS;
}
- if (pFmt->dwMask >= sizeof(PARAFORMAT2))
+ if (pFmt->cbSize >= sizeof(PARAFORMAT2))
{
pFmt->dwMask &= ~((pFmt->wEffects ^ curFmt->wEffects) << 16);
CHECK_FIELD(PFM_SPACEBEFORE, dySpaceBefore);
--
2.23.0
1
0
[PATCH 4/5] riched20: Use row and para ptrs in the ensure visible function.
by Huw Davies Oct. 27, 2020
by Huw Davies Oct. 27, 2020
Oct. 27, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/caret.c | 10 ++++------
dlls/riched20/editor.c | 2 +-
dlls/riched20/editor.h | 2 +-
dlls/riched20/paint.c | 25 ++++++++++++-------------
4 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 6a8f1e1cd71..47fe77df922 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -1176,13 +1176,11 @@ void ME_MouseMove(ME_TextEditor *editor, int x, int y)
if (editor->nSelectionType != stPosition &&
memcmp(&editor->pCursors[1], &editor->pCursors[3], sizeof(ME_Cursor)))
- {
/* The scroll the cursor towards the other end, since it was the one
* extended by ME_ExtendAnchorSelection */
- ME_EnsureVisible(editor, &editor->pCursors[1]);
- } else {
- ME_EnsureVisible(editor, &editor->pCursors[0]);
- }
+ editor_ensure_visible( editor, &editor->pCursors[1] );
+ else
+ editor_ensure_visible( editor, &editor->pCursors[0] );
ME_InvalidateSelection(editor);
update_caret(editor);
@@ -1520,7 +1518,7 @@ ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl)
ME_InvalidateSelection(editor);
ME_Repaint(editor);
hide_caret(editor);
- ME_EnsureVisible(editor, &tmp_curs);
+ editor_ensure_visible( editor, &tmp_curs );
update_caret(editor);
ME_SendSelChange(editor);
return success;
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 6a2e96a3c7c..462245db233 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -4095,7 +4095,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
return len;
}
case EM_SCROLLCARET:
- ME_EnsureVisible(editor, &editor->pCursors[0]);
+ editor_ensure_visible( editor, &editor->pCursors[0] );
return 0;
case WM_SETFONT:
{
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index ba1e5c169ff..1a2346854e7 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -242,7 +242,7 @@ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, const RECT *rcUpdate) DECLS
void ME_Repaint(ME_TextEditor *editor) DECLSPEC_HIDDEN;
void ME_RewrapRepaint(ME_TextEditor *editor) DECLSPEC_HIDDEN;
void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now) DECLSPEC_HIDDEN;
-void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor) DECLSPEC_HIDDEN;
+void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
void ME_InvalidateSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN;
BOOL ME_SetZoom(ME_TextEditor *editor, int numerator, int denominator) DECLSPEC_HIDDEN;
int ME_twips2pointsX(const ME_Context *c, int x) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 0c37fc7c707..180307ae01b 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -117,7 +117,7 @@ void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now)
ME_UpdateScrollBar(editor);
/* Ensure that the cursor is visible */
- ME_EnsureVisible(editor, &editor->pCursors[0]);
+ editor_ensure_visible( editor, &editor->pCursors[0] );
ITextHost_TxViewChange(editor->texthost, update_now);
@@ -1269,19 +1269,17 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
}
}
-void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor)
+void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
{
- ME_Run *pRun = &pCursor->pRun->member.run;
- ME_DisplayItem *pRow = ME_FindItemBack(pCursor->pRun, diStartRow);
- ME_DisplayItem *pPara = pCursor->pPara;
+ ME_Run *run = &cursor->pRun->member.run;
+ ME_Row *row = row_from_cursor( cursor );
+ ME_Paragraph *para = &cursor->pPara->member.para;
int x, y, yheight;
- assert(pRow);
- assert(pPara);
if (editor->styleFlags & ES_AUTOHSCROLL)
{
- x = pRun->pt.x + ME_PointFromChar(editor, pRun, pCursor->nOffset, TRUE);
+ x = run->pt.x + ME_PointFromChar( editor, run, cursor->nOffset, TRUE );
if (x > editor->horz_si.nPos + editor->sizeWindow.cx)
x = x + 1 - editor->sizeWindow.cx;
else if (x > editor->horz_si.nPos)
@@ -1292,14 +1290,15 @@ void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor)
ME_HScrollAbs(editor, x);
return;
}
- } else {
- if (~editor->styleFlags & ES_AUTOVSCROLL)
- return;
+ }
+ else
+ {
+ if (~editor->styleFlags & ES_AUTOVSCROLL) return;
x = editor->horz_si.nPos;
}
- y = pPara->member.para.pt.y + pRow->member.row.pt.y;
- yheight = pRow->member.row.nHeight;
+ y = para->pt.y + row->pt.y;
+ yheight = row->nHeight;
if (y < editor->vert_si.nPos)
ME_ScrollAbs(editor, x, y);
--
2.23.0
1
0
Oct. 27, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/editor.h | 2 +-
dlls/riched20/paint.c | 41 +++++++++++++++++++++--------------------
dlls/riched20/richole.c | 2 +-
3 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index f4484f57d39..ba1e5c169ff 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -264,7 +264,7 @@ int ME_GetParaBorderWidth(const ME_Context *c, int flags) DECLSPEC_HIDDEN;
/* richole.c */
LRESULT CreateIRichEditOle(IUnknown *outer_unk, ME_TextEditor *editor, LPVOID *ppvObj) DECLSPEC_HIDDEN;
-void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run* run, BOOL selected) DECLSPEC_HIDDEN;
+void draw_ole( ME_Context *c, int x, int y, ME_Run* run, BOOL selected ) DECLSPEC_HIDDEN;
void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) DECLSPEC_HIDDEN;
void ME_CopyReObject(REOBJECT *dst, const REOBJECT *src, DWORD flags) DECLSPEC_HIDDEN;
void ME_DeleteReObject(struct re_object *re_object) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 42f370c857c..0c37fc7c707 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -359,8 +359,8 @@ static void draw_text( ME_Context *c, ME_Run *run, int x, int y, BOOL selected,
}
-static void ME_DrawTextWithStyle(ME_Context *c, ME_Run *run, int x, int y,
- int nSelFrom, int nSelTo, int ymin, int cy)
+static void draw_text_with_style( ME_Context *c, ME_Run *run, int x, int y,
+ int nSelFrom, int nSelTo, int ymin, int cy )
{
HDC hDC = c->hDC;
int yOffset = 0;
@@ -434,16 +434,16 @@ static void ME_DebugWrite(HDC hDC, const POINT *pt, LPCWSTR szText) {
SetTextColor(hDC, color);
}
-static void ME_DrawRun( ME_Context *c, int x, int y, ME_Run *run, ME_Paragraph *para )
+static void draw_run( ME_Context *c, int x, int y, ME_Cursor *cursor )
{
- ME_DisplayItem *start;
- int runofs = run->nCharOfs+para->nCharOfs;
+ ME_Row *row;
+ ME_Run *run = &cursor->pRun->member.run;
+ int runofs = run_char_ofs( run, cursor->nOffset );
int nSelFrom, nSelTo;
- if (run->nFlags & MERF_HIDDEN)
- return;
+ if (run->nFlags & MERF_HIDDEN) return;
- start = ME_FindItemBack( run_get_di( run ), diStartRow );
+ row = row_from_cursor( cursor );
ME_GetSelectionOfs(c->editor, &nSelFrom, &nSelTo);
/* Draw selected end-of-paragraph mark */
@@ -452,8 +452,7 @@ static void ME_DrawRun( ME_Context *c, int x, int y, ME_Run *run, ME_Paragraph *
if (runofs >= nSelFrom && runofs < nSelTo)
{
draw_space( c, run, x, y, TRUE, FALSE,
- c->pt.y + para->pt.y + start->member.row.pt.y,
- start->member.row.nHeight );
+ c->pt.y + run->para->pt.y + row->pt.y, row->nHeight );
}
return;
}
@@ -463,19 +462,15 @@ static void ME_DrawRun( ME_Context *c, int x, int y, ME_Run *run, ME_Paragraph *
BOOL selected = runofs >= nSelFrom && runofs < nSelTo;
draw_space( c, run, x, y, selected, TRUE,
- c->pt.y + para->pt.y + start->member.row.pt.y,
- start->member.row.nHeight );
+ c->pt.y + run->para->pt.y + row->pt.y, row->nHeight );
return;
}
if (run->nFlags & MERF_GRAPHICS)
- ME_DrawOLE(c, x, y, run, (runofs >= nSelFrom) && (runofs < nSelTo));
+ draw_ole( c, x, y, run, (runofs >= nSelFrom) && (runofs < nSelTo) );
else
- {
- ME_DrawTextWithStyle(c, run, x, y, nSelFrom - runofs, nSelTo - runofs,
- c->pt.y + para->pt.y + start->member.row.pt.y,
- start->member.row.nHeight);
- }
+ draw_text_with_style( c, run, x, y, nSelFrom - runofs, nSelTo - runofs,
+ c->pt.y + run->para->pt.y + row->pt.y, row->nHeight );
}
/* The documented widths are in points (72 dpi), but converting them to
@@ -1001,8 +996,14 @@ static void draw_paragraph( ME_Context *c, ME_Paragraph *para )
FrameRect(c->hDC, &rc, GetSysColorBrush(COLOR_GRAYTEXT));
}
if (visible)
- ME_DrawRun( c, c->pt.x + run->pt.x,
- c->pt.y + para->pt.y + run->pt.y + baseline, run, para );
+ {
+ ME_Cursor cursor;
+
+ cursor.pRun = run_get_di( run );
+ cursor.pPara = para_get_di( para );
+ cursor.nOffset = 0;
+ draw_run( c, c->pt.x + run->pt.x, c->pt.y + para->pt.y + run->pt.y + baseline, &cursor );
+ }
if (me_debug)
{
static const WCHAR wszRunDebug[] = {'[','%','d',':','%','x',']',' ','%','l','s',0};
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 21b63911954..015326c5abc 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -5846,7 +5846,7 @@ void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize)
}
}
-void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run, BOOL selected)
+void draw_ole( ME_Context *c, int x, int y, ME_Run *run, BOOL selected )
{
IDataObject* ido;
FORMATETC fmt;
--
2.23.0
1
0
Oct. 27, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/caret.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index d92b93ac2f0..6a8f1e1cd71 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -405,8 +405,8 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
}
if (pThisCur->nOffset == run->len)
{
- pThisCur->pRun = ME_FindItemFwd(pThisCur->pRun, diRunOrParagraphOrEnd);
- assert(pThisCur->pRun->type == diRun);
+ pThisCur->pRun = run_get_di( run_next( &pThisCur->pRun->member.run ) );
+ assert( pThisCur->pRun );
pThisCur->nOffset = 0;
}
}
--
2.23.0
1
0
[PATCH 1/5] riched20: Use row and para helpers in the extend selection function.
by Huw Davies Oct. 27, 2020
by Huw Davies Oct. 27, 2020
Oct. 27, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/caret.c | 58 +++++++++++++++++++++++++++----------------
1 file changed, 37 insertions(+), 21 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 834f9fd3afe..d92b93ac2f0 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -1044,37 +1044,53 @@ static void ME_ExtendAnchorSelection(ME_TextEditor *editor)
{
/* Extend the left side of selection */
editor->pCursors[1] = tmp_cursor;
- if (editor->nSelectionType == stWord)
+ switch (editor->nSelectionType)
+ {
+ case stWord:
ME_MoveCursorWords(editor, &editor->pCursors[1], -1);
- else
+ break;
+
+ case stLine:
{
- ME_DisplayItem *pItem;
- ME_DIType searchType = ((editor->nSelectionType == stLine) ?
- diStartRowOrParagraph:diParagraph);
- pItem = ME_FindItemBack(editor->pCursors[1].pRun, searchType);
- editor->pCursors[1].pRun = ME_FindItemFwd(pItem, diRun);
- editor->pCursors[1].pPara = ME_GetParagraph(editor->pCursors[1].pRun);
+ ME_Row *row = row_from_cursor( editor->pCursors + 1 );
+ row_first_cursor( row, editor->pCursors + 1 );
+ break;
+ }
+
+ case stParagraph:
+ editor->pCursors[1].pRun = run_get_di( para_first_run( &editor->pCursors[1].pPara->member.para ) );
editor->pCursors[1].nOffset = 0;
+ break;
+
+ default:
+ break;
}
}
else if (curOfs >= anchorEndOfs)
{
/* Extend the right side of selection */
editor->pCursors[0] = tmp_cursor;
- if (editor->nSelectionType == stWord)
- ME_MoveCursorWords(editor, &editor->pCursors[0], +1);
- else
+ switch (editor->nSelectionType)
{
- ME_DisplayItem *pItem;
- ME_DIType searchType = ((editor->nSelectionType == stLine) ?
- diStartRowOrParagraphOrEnd:diParagraphOrEnd);
- pItem = ME_FindItemFwd(editor->pCursors[0].pRun, searchType);
- if (pItem->type == diTextEnd)
- editor->pCursors[0].pRun = ME_FindItemBack(pItem, diRun);
- else
- editor->pCursors[0].pRun = ME_FindItemFwd(pItem, diRun);
- editor->pCursors[0].pPara = ME_GetParagraph(editor->pCursors[0].pRun);
- editor->pCursors[0].nOffset = 0;
+ case stWord:
+ ME_MoveCursorWords( editor, &editor->pCursors[0], +1 );
+ break;
+
+ case stLine:
+ {
+ ME_Row *row = row_from_cursor( editor->pCursors );
+ row_end_cursor( row, editor->pCursors, TRUE );
+ break;
+ }
+
+ case stParagraph:
+ editor->pCursors[0].pRun = run_get_di( para_end_run( &editor->pCursors[0].pPara->member.para ) );
+ editor->pCursors[0].pPara = para_get_di( editor->pCursors[0].pRun->member.run.para );
+ editor->pCursors[0].nOffset = editor->pCursors[0].pRun->member.run.len;
+ break;
+
+ default:
+ break;
}
}
}
--
2.23.0
1
0
[PATCH 2/2] user32: Use current width or height if a mode specifies zero width or height for ChangeDisplaySettingsExW().
by Zhiyi Zhang Oct. 27, 2020
by Zhiyi Zhang Oct. 27, 2020
Oct. 27, 2020
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
Fix failures to change display modes like in https://test.winehq.org/data/93107c08f5aa7f37ad7ece9cd7ca248dba3030ce/linux…
dlls/user32/sysparams.c | 16 ++++++++++++++++
dlls/user32/tests/monitor.c | 16 +++-------------
2 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index d4640e0068e..1381f387e03 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3182,6 +3182,22 @@ LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND
return DISP_CHANGE_BADMODE;
}
+ if (!is_detached_mode(devmode) && (!devmode->dmPelsWidth || !devmode->dmPelsHeight))
+ {
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ if (!EnumDisplaySettingsExW(devname, ENUM_CURRENT_SETTINGS, &dm, 0))
+ {
+ ERR("Current mode not found!\n");
+ return DISP_CHANGE_BADMODE;
+ }
+
+ if (!devmode->dmPelsWidth)
+ devmode->dmPelsWidth = dm.dmPelsWidth;
+ if (!devmode->dmPelsHeight)
+ devmode->dmPelsHeight = dm.dmPelsHeight;
+ }
+
ret = USER_Driver->pChangeDisplaySettingsEx(devname, devmode, hwnd, flags, lparam);
if (ret != DISP_CHANGE_SUCCESSFUL)
ERR("Changing %s display settings returned %d.\n", wine_dbgstr_w(devname), ret);
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index d7d9086672d..009fc0d626e 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -602,8 +602,7 @@ static void test_ChangeDisplaySettingsEx(void)
}
/* Test changing to a mode with depth set but with zero width and height */
- /* This test is only ran for non-primary adapters for now as it may detach the adapters on Wine */
- for (device = 1; device < device_count; ++device)
+ for (device = 0; device < device_count; ++device)
{
for (test = 0; test < ARRAY_SIZE(depths); ++test)
{
@@ -689,10 +688,8 @@ static void test_ChangeDisplaySettingsEx(void)
dd.cb = sizeof(dd);
res = EnumDisplayDevicesA(NULL, devices[device].index, &dd, 0);
ok(res, "EnumDisplayDevicesA %s failed, error %#x.\n", devices[device].name, GetLastError());
- todo_wine ok(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP, "Expect %s attached.\n",
- devices[device].name);
- if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
- continue;
+ ok(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP, "Expect %s attached.\n",
+ devices[device].name);
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
@@ -715,13 +712,6 @@ static void test_ChangeDisplaySettingsEx(void)
/* Detach all non-primary adapters to avoid position conflicts */
for (device = 1; device < device_count; ++device)
{
- dd.cb = sizeof(dd);
- res = EnumDisplayDevicesA(NULL, devices[device].index, &dd, 0);
- ok(res, "EnumDisplayDevicesA %s failed, error %#x.\n", devices[device].name, GetLastError());
- /* Already detached by previous tests */
- if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
- continue;
-
old_count = GetSystemMetrics(SM_CMONITORS);
memset(&dm, 0, sizeof(dm));
--
2.27.0
2
1
[PATCH 1/2] user32/tests: Test changing to a valid depth but zero width and height display mode.
by Zhiyi Zhang Oct. 27, 2020
by Zhiyi Zhang Oct. 27, 2020
Oct. 27, 2020
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/user32/tests/monitor.c | 119 ++++++++++++++++++++++++++++++++++++
1 file changed, 119 insertions(+)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 0ce27455a66..d7d9086672d 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -323,6 +323,7 @@ static void test_ChangeDisplaySettingsEx(void)
{
static const DWORD registry_fields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT |
DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY | DM_POSITION;
+ static const DWORD depths[] = {8, 16, 32};
DPI_AWARENESS_CONTEXT context = NULL;
UINT primary, device, test, mode;
UINT device_size, device_count;
@@ -600,9 +601,127 @@ static void test_ChangeDisplaySettingsEx(void)
ok(count == old_count, "Expect monitor count %d, got %d\n", old_count, count);
}
+ /* Test changing to a mode with depth set but with zero width and height */
+ /* This test is only ran for non-primary adapters for now as it may detach the adapters on Wine */
+ for (device = 1; device < device_count; ++device)
+ {
+ for (test = 0; test < ARRAY_SIZE(depths); ++test)
+ {
+ /* Find the native resolution */
+ memset(&dm, 0, sizeof(dm));
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode = 0; EnumDisplaySettingsExA(devices[device].name, mode, &dm2, 0); ++mode)
+ {
+ if (dm2.dmBitsPerPel == depths[test]
+ && dm2.dmPelsWidth > dm.dmPelsWidth && dm2.dmPelsHeight > dm.dmPelsHeight)
+ dm = dm2;
+ }
+ if (dm.dmBitsPerPel != depths[test])
+ {
+ skip("Depth %u is unsupported for %s.\n", depths[test], devices[device].name);
+ continue;
+ }
+
+ /* Find the second resolution */
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode = 0; EnumDisplaySettingsExA(devices[device].name, mode, &dm2, 0); ++mode)
+ {
+ if (dm2.dmBitsPerPel == depths[test]
+ && dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight)
+ break;
+ }
+ if (dm2.dmBitsPerPel != depths[test]
+ || dm2.dmPelsWidth == dm.dmPelsWidth || dm2.dmPelsHeight == dm.dmPelsHeight)
+ {
+ skip("Failed to find the second mode for %s.\n", devices[device].name);
+ continue;
+ }
+
+ /* Find the third resolution */
+ memset(&dm3, 0, sizeof(dm3));
+ dm3.dmSize = sizeof(dm3);
+ for (mode = 0; EnumDisplaySettingsExA(devices[device].name, mode, &dm3, 0); ++mode)
+ {
+ if (dm3.dmBitsPerPel == depths[test]
+ && dm3.dmPelsWidth != dm.dmPelsWidth && dm3.dmPelsHeight != dm.dmPelsHeight
+ && dm3.dmPelsWidth != dm2.dmPelsWidth && dm3.dmPelsHeight != dm2.dmPelsHeight)
+ break;
+ }
+ if (dm3.dmBitsPerPel != depths[test]
+ || dm3.dmPelsWidth == dm.dmPelsWidth || dm3.dmPelsHeight == dm.dmPelsHeight
+ || dm3.dmPelsWidth == dm2.dmPelsWidth || dm3.dmPelsHeight == dm2.dmPelsHeight)
+ {
+ skip("Failed to find the third mode for %s.\n", devices[device].name);
+ continue;
+ }
+
+ /* Change the current mode to the third mode first */
+ res = ChangeDisplaySettingsExA(devices[device].name, &dm3, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL
+ || broken(res == DISP_CHANGE_FAILED), /* Win8 TestBots */
+ "ChangeDisplaySettingsExA %s returned unexpected %d.\n", devices[device].name, res);
+ if (res != DISP_CHANGE_SUCCESSFUL)
+ {
+ win_skip("Failed to change display mode for %s.\n", devices[device].name);
+ continue;
+ }
+ flush_events();
+ expect_dm(dm3, devices[device].name, test);
+
+ /* Change the registry mode to the second mode */
+ res = ChangeDisplaySettingsExA(devices[device].name, &dm2, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL
+ || broken(res == DISP_CHANGE_BADFLAGS), /* Win10 32bit */
+ "ChangeDisplaySettingsExA %s returned unexpected %d.\n", devices[device].name, res);
+
+ /* Change to a mode with depth set but with zero width and height */
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ dm.dmBitsPerPel = depths[test];
+ res = ChangeDisplaySettingsExA(devices[device].name, &dm, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ devices[device].name, res);
+ flush_events();
+
+ dd.cb = sizeof(dd);
+ res = EnumDisplayDevicesA(NULL, devices[device].index, &dd, 0);
+ ok(res, "EnumDisplayDevicesA %s failed, error %#x.\n", devices[device].name, GetLastError());
+ todo_wine ok(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP, "Expect %s attached.\n",
+ devices[device].name);
+ if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
+ continue;
+
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ res = EnumDisplaySettingsA(devices[device].name, ENUM_CURRENT_SETTINGS, &dm);
+ ok(res, "Device %s EnumDisplaySettingsA failed, error %#x.\n", devices[device].name, GetLastError());
+ todo_wine_if(depths[test] != 32)
+ ok(dm.dmBitsPerPel == depths[test], "Device %s expect dmBitsPerPel %u, got %u.\n",
+ devices[device].name, depths[test], dm.dmBitsPerPel);
+ /* 2008 resets to the resolution in the registry. Newer versions of Windows doesn't
+ * change the current resolution */
+ ok(dm.dmPelsWidth == dm3.dmPelsWidth || broken(dm.dmPelsWidth == dm2.dmPelsWidth),
+ "Device %s expect dmPelsWidth %u, got %u.\n",
+ devices[device].name, dm3.dmPelsWidth, dm.dmPelsWidth);
+ ok(dm.dmPelsHeight == dm3.dmPelsHeight || broken(dm.dmPelsHeight == dm2.dmPelsHeight),
+ "Device %s expect dmPelsHeight %u, got %u.\n",
+ devices[device].name, dm3.dmPelsHeight, dm.dmPelsHeight);
+ }
+ }
+
/* Detach all non-primary adapters to avoid position conflicts */
for (device = 1; device < device_count; ++device)
{
+ dd.cb = sizeof(dd);
+ res = EnumDisplayDevicesA(NULL, devices[device].index, &dd, 0);
+ ok(res, "EnumDisplayDevicesA %s failed, error %#x.\n", devices[device].name, GetLastError());
+ /* Already detached by previous tests */
+ if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
+ continue;
+
old_count = GetSystemMetrics(SM_CMONITORS);
memset(&dm, 0, sizeof(dm));
--
2.27.0
1
0
Oct. 26, 2020
When a BITS job is being transferred, it may enter into the state
BG_JOB_STATE_TRANSIENT_ERROR (for example, if the hostname fails to
resolve). Currently, entering this state causes qmgr job tests to fail,
even though it may occur due to temporary network issues out of our
control.
If a job enters BG_JOB_STATE_TRANSIENT_ERROR before the timeout has
elapsed, attempt to resume the job using
IBackgroundCopyJob_Resume. If the job is still in
BG_JOB_STATE_TRANSIENT_ERROR, query BITS for detailed error
information, and print it out.
Additionally, ensure that we are able to transfer files on Windows 10
with a metered connection. By default, BITS will not attempt to transfer
a job on a metered connection, instead failing with
BG_JOB_STATE_TRANSIENT_ERROR. On newer versions of Windows, we can
use IBackgroundCopyJob5 to set the transfer policy, forcing the job to
run even on a metered connection. This allows qmgr job tests to pass on
the testbot Windows 10 VMs, which have metered connections enabled in
order to disable Windows Update.
Setting the job transfer policy requires using APIs from BITS 5.0. Add
the minimal amount of the interface needed for the test.
With this patch, the qmgr job tests now pass on all testbot VMs.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50048
Signed-off-by: Aaron Hill <aa1ronham(a)gmail.com>
---
dlls/qmgr/qmgr_local.idl | 1 +
dlls/qmgr/tests/job.c | 117 +++++++++++++++++++++++++++++++++++++--
include/Makefile.in | 1 +
include/bits5_0.idl | 36 ++++++++++++
4 files changed, 151 insertions(+), 4 deletions(-)
create mode 100644 include/bits5_0.idl
diff --git a/dlls/qmgr/qmgr_local.idl b/dlls/qmgr/qmgr_local.idl
index 110d479ab92..48439fc5dac 100644
--- a/dlls/qmgr/qmgr_local.idl
+++ b/dlls/qmgr/qmgr_local.idl
@@ -25,3 +25,4 @@
#include "bits2_0.idl"
#include "bits2_5.idl"
#include "bits3_0.idl"
+#include "bits5_0.idl"
diff --git a/dlls/qmgr/tests/job.c b/dlls/qmgr/tests/job.c
index 53b724eadbf..68d15acaf0a 100644
--- a/dlls/qmgr/tests/job.c
+++ b/dlls/qmgr/tests/job.c
@@ -27,6 +27,7 @@
#include "initguid.h"
#include "bits2_0.h"
#include "bits2_5.h"
+#include "bits5_0.h"
/* Globals used by many tests */
static WCHAR test_remotePathA[MAX_PATH];
@@ -75,6 +76,8 @@ static void init_paths(void)
static BOOL setup(void)
{
HRESULT hres;
+ IBackgroundCopyJob5* test_job_5;
+ BITS_JOB_PROPERTY_VALUE prop_val;
test_manager = NULL;
test_job = NULL;
@@ -95,6 +98,25 @@ static BOOL setup(void)
return FALSE;
}
+ /* The Wine TestBot Windows 10 VMs disable Windows Update by putting
+ the network connection in metered mode (see https://wiki.winehq.org/Wine_TestBot_VMs#Windows_configuration)
+
+ Unfortunately, this will make BITS jobs fail, since the default transfer policy
+ on Windows 10 prevents BITs job from running over a metered network
+
+ To allow these tests in this file to run on the testbot, we
+ set the BITS_JOB_PROPERTY_ID_COST_FLAGS property to BITS_COST_STATE_TRANSFER_ALWAYS,
+ ensuring that BITS will still try to run the job on a metered network */
+ prop_val.Dword = BITS_COST_STATE_TRANSFER_ALWAYS;
+ hres = IBackgroundCopyJob_QueryInterface(test_job, &IID_IBackgroundCopyJob5, (void **)&test_job_5);
+ /* BackgroundCopyJob5 was added in Windows 8, so this may not exist. The metered connection
+ workaround is only applied on Windows 10, so it's fine if this fails. */
+ if (SUCCEEDED(hres)) {
+ hres = IBackgroundCopyJob5_SetProperty(test_job_5, BITS_JOB_PROPERTY_ID_COST_FLAGS, prop_val);
+ ok(hres == S_OK, "Failed to set the cost flags: %08x\n", hres);
+ IBackgroundCopyJob5_Release(test_job_5);
+ }
+
return TRUE;
}
@@ -333,6 +355,43 @@ static void compareFiles(WCHAR *n1, WCHAR *n2)
ok(memcmp(b1, b2, s1) == 0, "Files differ in contents\n");
}
+/* Handles a timeout in the BG_JOB_STATE_ERROR or BG_JOB_STATE_TRANSIENT_ERROR state */
+static void handle_job_err(void)
+{
+ HRESULT hres;
+ IBackgroundCopyError *err;
+ BG_ERROR_CONTEXT errContext;
+ HRESULT errCode;
+ LPWSTR contextDesc;
+ LPWSTR errDesc;
+
+ hres = IBackgroundCopyJob_GetError(test_job, &err);
+ if (SUCCEEDED(hres)) {
+ hres = IBackgroundCopyError_GetError(err, &errContext, &errCode);
+ if (SUCCEEDED(hres)) {
+ ok(0, "Got context: %d code: %d\n", errContext, errCode);
+ } else {
+ ok(0, "Failed to get error info: 0x%08x\n", hres);
+ }
+
+ hres = IBackgroundCopyError_GetErrorContextDescription(err, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), &contextDesc);
+ if (SUCCEEDED(hres)) {
+ ok(0, "Got context desc: %s\n", wine_dbgstr_w(contextDesc));
+ } else {
+ ok(0, "Failed to get context desc: 0x%08x\n", hres);
+ }
+
+ hres = IBackgroundCopyError_GetErrorDescription(err, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), &errDesc);
+ if (SUCCEEDED(hres)) {
+ ok(0, "Got error desc: %s\n", wine_dbgstr_w(errDesc));
+ } else {
+ ok(0, "Failed to get error desc: 0x%08x\n", hres);
+ }
+ } else {
+ ok(0, "Failed to get error: 0x%08x\n", hres);
+ }
+}
+
/* Test a complete transfer for local files */
static void test_CompleteLocal(void)
{
@@ -362,13 +421,23 @@ static void test_CompleteLocal(void)
hres = IBackgroundCopyJob_GetState(test_job, &state);
ok(hres == S_OK, "IBackgroundCopyJob_GetState\n");
ok(state == BG_JOB_STATE_QUEUED || state == BG_JOB_STATE_CONNECTING
- || state == BG_JOB_STATE_TRANSFERRING || state == BG_JOB_STATE_TRANSFERRED,
+ || state == BG_JOB_STATE_TRANSFERRING || state == BG_JOB_STATE_TRANSFERRED
+ || state == BG_JOB_STATE_TRANSIENT_ERROR,
"Bad state: %d\n", state);
+
+ if (state == BG_JOB_STATE_TRANSIENT_ERROR) {
+ hres = IBackgroundCopyJob_Resume(test_job);
+ ok(hres == S_OK, "IBackgroundCopyJob_Resume\n");
+ }
+
if (state == BG_JOB_STATE_TRANSFERRED)
break;
Sleep(1000);
}
+ if (state == BG_JOB_STATE_ERROR || state == BG_JOB_STATE_TRANSIENT_ERROR)
+ handle_job_err();
+
ok(i < timeout_sec, "BITS jobs timed out\n");
hres = IBackgroundCopyJob_Complete(test_job);
ok(hres == S_OK, "IBackgroundCopyJob_Complete\n");
@@ -430,13 +499,24 @@ static void test_CompleteLocalURL(void)
hres = IBackgroundCopyJob_GetState(test_job, &state);
ok(hres == S_OK, "IBackgroundCopyJob_GetState\n");
ok(state == BG_JOB_STATE_QUEUED || state == BG_JOB_STATE_CONNECTING
- || state == BG_JOB_STATE_TRANSFERRING || state == BG_JOB_STATE_TRANSFERRED,
+ || state == BG_JOB_STATE_TRANSFERRING || state == BG_JOB_STATE_TRANSFERRED
+ || state == BG_JOB_STATE_TRANSIENT_ERROR,
"Bad state: %d\n", state);
+
+ if (state == BG_JOB_STATE_TRANSIENT_ERROR) {
+ hres = IBackgroundCopyJob_Resume(test_job);
+ ok(hres == S_OK, "IBackgroundCopyJob_Resume\n");
+ }
+
if (state == BG_JOB_STATE_TRANSFERRED)
break;
Sleep(1000);
}
+ if (state == BG_JOB_STATE_ERROR || state == BG_JOB_STATE_TRANSIENT_ERROR)
+ handle_job_err();
+
+
ok(i < timeout_sec, "BITS jobs timed out\n");
hres = IBackgroundCopyJob_Complete(test_job);
ok(hres == S_OK, "IBackgroundCopyJob_Complete\n");
@@ -572,11 +652,22 @@ static void test_HttpOptions(void)
ok(state == BG_JOB_STATE_QUEUED ||
state == BG_JOB_STATE_CONNECTING ||
state == BG_JOB_STATE_TRANSFERRING ||
- state == BG_JOB_STATE_TRANSFERRED, "unexpected state: %u\n", state);
+ state == BG_JOB_STATE_TRANSFERRED ||
+ state == BG_JOB_STATE_TRANSIENT_ERROR, "unexpected state: %u\n", state);
+
+ if (state == BG_JOB_STATE_TRANSIENT_ERROR) {
+ hr = IBackgroundCopyJob_Resume(test_job);
+ ok(hr == S_OK, "IBackgroundCopyJob_Resume\n");
+ }
if (state == BG_JOB_STATE_TRANSFERRED) break;
Sleep(1000);
}
+
+ if (state == BG_JOB_STATE_ERROR || state == BG_JOB_STATE_TRANSIENT_ERROR)
+ handle_job_err();
+
+
ok(i < timeout, "BITS job timed out\n");
if (i < timeout)
{
@@ -651,10 +742,28 @@ START_TEST(job)
};
const test_t *test;
int i;
+ HRESULT hres;
init_paths();
- CoInitialize(NULL);
+ /* CoInitializeEx and CoInitializeSecurity with RPC_C_IMP_LEVEL_IMPERSONATE
+ * are required to set the job transfer policy
+ * See https://docs.microsoft.com/en-us/windows/win32/bits/how-to-block-a-bits-job…
+ */
+ hres = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+ if (FAILED(hres)) {
+ ok(0, "CoInitializeEx faied: %0x\n", hres);
+ return;
+ }
+
+ hres = CoInitializeSecurity(NULL, -1, NULL, NULL,
+ RPC_C_AUTHN_LEVEL_CONNECT,
+ RPC_C_IMP_LEVEL_IMPERSONATE,
+ NULL, EOAC_NONE, 0);
+ if (FAILED(hres)) {
+ ok(0, "CoInitializeSecurity failed: %0x\n", hres);
+ return;
+ }
if (FAILED(test_create_manager()))
{
diff --git a/include/Makefile.in b/include/Makefile.in
index 23306689cab..b2c8ba7f987 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -50,6 +50,7 @@ SOURCES = \
bits2_0.idl \
bits2_5.idl \
bits3_0.idl \
+ bits5_0.idl \
bitsmsg.h \
bluetoothapis.h \
bthsdpdef.h \
diff --git a/include/bits5_0.idl b/include/bits5_0.idl
new file mode 100644
index 00000000000..30b4e4bbe37
--- /dev/null
+++ b/include/bits5_0.idl
@@ -0,0 +1,36 @@
+#ifndef DO_NO_IMPORTS
+import "bits.idl";
+import "bits2_0.idl";
+import "bits3_0.idl";
+#endif
+
+cpp_quote("#define BITS_COST_STATE_TRANSFER_ALWAYS 0x800000ff")
+
+[
+ uuid(e847030c-bbba-4657-af6d-484aa42bf1fe),
+ odl
+]
+interface IBackgroundCopyJob5: IBackgroundCopyJob4
+{
+ typedef enum {
+ BITS_JOB_PROPERTY_ID_COST_FLAGS = 1,
+ BITS_JOB_PROPERTY_NOTIFICATION_CLSID = 2,
+ BITS_JOB_PROPERTY_DYNAMIC_CONTENT = 3,
+ BITS_JOB_PROPERTY_HIGH_PERFORMANCE = 4,
+ BITS_JOB_PROPERTY_MAX_DOWNLOAD_SIZE = 5,
+ BITS_JOB_PROPERTY_USE_STORED_CREDENTIALS = 7,
+ BITS_JOB_PROPERTY_MINIMUM_NOTIFICATION_INTERVAL_MS = 9,
+ BITS_JOB_PROPERTY_ON_DEMAND_MODE = 10,
+ } BITS_JOB_PROPERTY_ID;
+
+ typedef union _BITS_JOB_PROPERTY_VALUE {
+ DWORD Dword;
+ GUID ClsID;
+ BOOL Enable;
+ UINT64 Uint64;
+ BG_AUTH_TARGET Target;
+ } BITS_JOB_PROPERTY_VALUE;
+
+ HRESULT SetProperty(BITS_JOB_PROPERTY_ID id, BITS_JOB_PROPERTY_VALUE value);
+ HRESULT GetProperty(BITS_JOB_PROPERTY_ID id, [out, ref] BITS_JOB_PROPERTY_VALUE *value);
+}
--
2.29.1
3
2