Commit 659768e2 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Set or override a user environment string when there is no prefix.

parent d13b2b65
...@@ -5313,8 +5313,7 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags ) ...@@ -5313,8 +5313,7 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
} }
} }
if (!*flags || if (check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETABSENT) || check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETALWAYS) || check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETALWAYS) ||
check_flag_combo(*flags, ENV_ACT_SETABSENT | ENV_MOD_MASK)) check_flag_combo(*flags, ENV_ACT_SETABSENT | ENV_MOD_MASK))
...@@ -5323,6 +5322,9 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags ) ...@@ -5323,6 +5322,9 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
} }
if (!*flags)
*flags = ENV_ACT_SETALWAYS | ENV_ACT_REMOVE;
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
...@@ -5350,6 +5352,8 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) ...@@ -5350,6 +5352,8 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
name = MSI_RecordGetString(rec, 2); name = MSI_RecordGetString(rec, 2);
value = MSI_RecordGetString(rec, 3); value = MSI_RecordGetString(rec, 3);
TRACE("name %s value %s\n", debugstr_w(name), debugstr_w(value));
res = env_set_flags(&name, &value, &flags); res = env_set_flags(&name, &value, &flags);
if (res != ERROR_SUCCESS) if (res != ERROR_SUCCESS)
goto done; goto done;
......
...@@ -124,6 +124,7 @@ static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n" ...@@ -124,6 +124,7 @@ static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"MoveFiles\t\t1700\n" "MoveFiles\t\t1700\n"
"InstallFiles\t\t4000\n" "InstallFiles\t\t4000\n"
"DuplicateFiles\t\t4500\n" "DuplicateFiles\t\t4500\n"
"WriteEnvironmentStrings\t\t4550\n"
"CreateShortcuts\t\t4600\n" "CreateShortcuts\t\t4600\n"
"InstallServices\t\t5000\n" "InstallServices\t\t5000\n"
"InstallFinalize\t\t6600\n" "InstallFinalize\t\t6600\n"
...@@ -165,6 +166,15 @@ static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarg ...@@ -165,6 +166,15 @@ static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarg
"Shortcut\tShortcut\n" "Shortcut\tShortcut\n"
"Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n"; "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n"
"s72\tl255\tL255\ts72\n"
"Environment\tEnvironment\n"
"Var1\t=-MSITESTVAR1\t1\tOne\n"
"Var2\tMSITESTVAR2\t1\tOne\n"
"Var3\t=-MSITESTVAR3\t1\tOne\n"
"Var4\tMSITESTVAR4\t1\tOne\n";
static const CHAR up_property_dat[] = "Property\tValue\n" static const CHAR up_property_dat[] = "Property\tValue\n"
"s72\tl0\n" "s72\tl0\n"
"Property\tProperty\n" "Property\tProperty\n"
...@@ -904,6 +914,19 @@ static const msi_table sc_tables[] = ...@@ -904,6 +914,19 @@ static const msi_table sc_tables[] =
ADD_TABLE(shortcut) ADD_TABLE(shortcut)
}; };
static const msi_table env_tables[] =
{
ADD_TABLE(component),
ADD_TABLE(directory),
ADD_TABLE(feature),
ADD_TABLE(feature_comp),
ADD_TABLE(file),
ADD_TABLE(install_exec_seq),
ADD_TABLE(media),
ADD_TABLE(property),
ADD_TABLE(environment)
};
static const msi_table up_tables[] = static const msi_table up_tables[] =
{ {
ADD_TABLE(component), ADD_TABLE(component),
...@@ -6240,6 +6263,74 @@ static void test_shortcut(void) ...@@ -6240,6 +6263,74 @@ static void test_shortcut(void)
delete_test_files(); delete_test_files();
} }
static void test_envvar(void)
{
UINT r;
HKEY env;
LONG res;
DWORD type, size;
char buffer[16];
create_test_files();
create_database(msifile, env_tables, sizeof(env_tables) / sizeof(msi_table));
res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
type = REG_NONE;
size = sizeof(buffer);
buffer[0] = 0;
res = RegQueryValueExA(env, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer);
res = RegDeleteValueA(env, "MSITESTVAR1");
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
type = REG_NONE;
size = sizeof(buffer);
buffer[0] = 0;
res = RegQueryValueExA(env, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer);
res = RegDeleteValueA(env, "MSITESTVAR2");
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegDeleteValueA(env, "MSITESTVAR3");
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegDeleteValueA(env, "MSITESTVAR4");
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegCloseKey(env);
delete_pf("msitest\\cabout\\new\\five.txt", TRUE);
delete_pf("msitest\\cabout\\new", FALSE);
delete_pf("msitest\\cabout\\four.txt", TRUE);
delete_pf("msitest\\cabout", FALSE);
delete_pf("msitest\\changed\\three.txt", TRUE);
delete_pf("msitest\\changed", FALSE);
delete_pf("msitest\\first\\two.txt", TRUE);
delete_pf("msitest\\first", FALSE);
delete_pf("msitest\\filename", TRUE);
delete_pf("msitest\\one.txt", TRUE);
delete_pf("msitest\\service.exe", TRUE);
delete_pf("msitest", FALSE);
delete_test_files();
}
START_TEST(install) START_TEST(install)
{ {
DWORD len; DWORD len;
...@@ -6322,6 +6413,7 @@ START_TEST(install) ...@@ -6322,6 +6413,7 @@ START_TEST(install)
test_propcase(); test_propcase();
test_int_widths(); test_int_widths();
test_shortcut(); test_shortcut();
test_envvar();
DeleteFileA(log_file); DeleteFileA(log_file);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment