"Var23\t+-MSITESTVAR19\t1\tOne\n"
"Var24\t+-MSITESTVAR19\t[~]2\tOne\n"
"Var25\t+-MSITESTVAR20\t1\tOne\n"
- "Var26\t+-MSITESTVAR20\t2[~]\tOne\n";
+ "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"
+ "Var27\t+-MSITESTVAR21\t[~];1\tOne\n";
static const char service_install_dat[] =
"ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
"var2\t=+-MSITESTVAR2\t1\tenvvar\n"
"var3\t=MSITESTVAR3\t1\tenvvar\n"
"var4\t=-MSITESTVAR4\t\tenvvar\n"
- "var5\t=MSITESTVAR5\t\tenvvar\n";
+ "var5\t=MSITESTVAR5\t\tenvvar\n"
+ "Var6\t-MSITESTVAR6\t1;[~]\tenvvar\n"
+ "Var7\t-MSITESTVAR7\t[~];1\tenvvar\n"
+ "Var8\t-MSITESTVAR8\t1;[~]\tenvvar\n"
+ "Var9\t-MSITESTVAR9\t[~];1\tenvvar\n"
+ "Var10\t-MSITESTVAR10\t1\tenvvar\n"
+ "Var11\t-MSITESTVAR11\t2\tenvvar\n";
static const char res_install_exec_seq_dat[] =
"Action\tCondition\tSequence\n"
"1;;2;;", /* MSITESTVAR18 */
"1", /* MSITESTVAR19 */
"1", /* MSITESTVAR20 */
+ "1", /* MSITESTVAR21 */
NULL
};
UINT r;
res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+ res = RegSetValueExA(env, "MSITESTVAR21", 0, REG_SZ, (const BYTE *)"1", 2);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
r = MsiInstallProductA(msifile, NULL);
error:
RegDeleteValueA(env, "MSITESTVAR1");
RegDeleteValueA(env, "MSITESTVAR2");
+ RegDeleteValueA(env, "MSITESTVAR21");
RegCloseKey(env);
delete_test_files();
{
static const char keypath[] =
"Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
+ static const char keypath2[] =
+ "Software\\Classes\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
UINT r;
LONG res;
HKEY key;
+ BYTE *data;
+ DWORD size;
if (is_process_limited())
{
}
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+ size = 0;
+ r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
+ "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
+ ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r);
+
res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key);
ok(res == ERROR_SUCCESS, "components key not created %d\n", res);
- res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL);
+ res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, &size);
ok(res == ERROR_SUCCESS, "value not found %d\n", res);
+
+ data = HeapAlloc(GetProcessHeap(), 0, size);
+ res = RegQueryValueExA(key, "english.txt", NULL, NULL, data, &size);
+ ok(res == ERROR_SUCCESS, "value not found %d\n", res);
+ RegCloseKey(key);
+
+ res = RegDeleteKeyA(HKEY_CURRENT_USER, keypath);
+ ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res);
+
+ res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath2, 0, NULL, REG_OPTION_NON_VOLATILE,
+ MAXIMUM_ALLOWED | KEY_WOW64_64KEY, NULL, &key, NULL );
+ ok(res == ERROR_SUCCESS, "RegCreateKeyEx failed %d\n", res);
+ res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
+ ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res);
+ RegCloseKey(key);
+
+ size = 0;
+ r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
+ "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
+ ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r);
+
+ if (pRegDeleteKeyExA)
+ res = pRegDeleteKeyExA(HKEY_LOCAL_MACHINE, keypath2, KEY_WOW64_64KEY, 0);
+ else
+ res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2);
+ ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res);
+
+ res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key);
+ ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res);
+
+ res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
+ ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res);
+ HeapFree(GetProcessHeap(), 0, data);
RegCloseKey(key);
r = MsiInstallProductA(msifile, "REMOVE=ALL");
RegSetValueExA(key, "MSITESTVAR3", 0, REG_SZ, (const BYTE *)"1", 2);
RegSetValueExA(key, "MSITESTVAR4", 0, REG_SZ, (const BYTE *)"1", 2);
RegSetValueExA(key, "MSITESTVAR5", 0, REG_SZ, (const BYTE *)"1", 2);
+ RegSetValueExA(key, "MSITESTVAR6", 0, REG_SZ, (const BYTE *)"1;2", 4);
+ RegSetValueExA(key, "MSITESTVAR7", 0, REG_SZ, (const BYTE *)"1;2", 4);
+ RegSetValueExA(key, "MSITESTVAR8", 0, REG_SZ, (const BYTE *)"2;1;0", 6);
+ RegSetValueExA(key, "MSITESTVAR9", 0, REG_SZ, (const BYTE *)"0;1;2", 6);
+ RegSetValueExA(key, "MSITESTVAR10", 0, REG_SZ, (const BYTE *)"1", 2);
+ RegSetValueExA(key, "MSITESTVAR11", 0, REG_SZ, (const BYTE *)"1", 2);
RegCloseKey(key);
ok(!lstrcmpA(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer);
RegDeleteValueA(key, "MSITESTVAR5");
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR6", 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(!lstrcmpA(buffer, "2"), "expected \"2\", got \"%s\"\n", buffer);
+ RegDeleteValueA(key, "MSITESTVAR6");
+
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR7", 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(!lstrcmpA(buffer, "2"), "expected \"2\", got \"%s\"\n", buffer);
+ RegDeleteValueA(key, "MSITESTVAR7");
+
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR8", 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(!lstrcmpA(buffer, "2;0"), "expected \"2;0\", got \"%s\"\n", buffer);
+ RegDeleteValueA(key, "MSITESTVAR8");
+
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR9", 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(!lstrcmpA(buffer, "0;2"), "expected \"0;2\", got \"%s\"\n", buffer);
+ RegDeleteValueA(key, "MSITESTVAR9");
+
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR10", NULL, &type, (LPBYTE)buffer, &size);
+ ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
+
+ type = REG_NONE;
+ buffer[0] = 0;
+ size = sizeof(buffer);
+ res = RegQueryValueExA(key, "MSITESTVAR11", 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(!lstrcmpA(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer);
+ RegDeleteValueA(key, "MSITESTVAR11");
+
ok(!delete_pf("msitest\\envvar.txt", TRUE), "file not removed\n");
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
RegDeleteValueA(key, "MSITESTVAR3");
RegDeleteValueA(key, "MSITESTVAR4");
RegDeleteValueA(key, "MSITESTVAR5");
+ RegDeleteValueA(key, "MSITESTVAR6");
+ RegDeleteValueA(key, "MSITESTVAR7");
+ RegDeleteValueA(key, "MSITESTVAR8");
+ RegDeleteValueA(key, "MSITESTVAR9");
+ RegDeleteValueA(key, "MSITESTVAR10");
+ RegDeleteValueA(key, "MSITESTVAR11");
RegCloseKey(key);
DeleteFileA("msitest\\envvar.txt");
return invoke(pInstaller, "UILevel", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY);
}
+static HRESULT Installer_SummaryInformation(BSTR PackagePath, int UpdateCount, IDispatch **pSumInfo)
+{
+ VARIANT varresult;
+ VARIANTARG vararg[2];
+ DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0};
+ HRESULT hr;
+
+ VariantInit(&vararg[1]);
+ V_VT(&vararg[1]) = VT_BSTR;
+ V_BSTR(&vararg[1]) = SysAllocString(PackagePath);
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_I4;
+ V_I4(&vararg[0]) = UpdateCount;
+
+ hr = invoke(pInstaller, "SummaryInformation", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_DISPATCH);
+ *pSumInfo = V_DISPATCH(&varresult);
+ return hr;
+}
+
static HRESULT Session_Installer(IDispatch *pSession, IDispatch **pInst)
{
VARIANT varresult;
return hr;
}
-static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, BOOL *pMode)
+static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, VARIANT_BOOL *mode)
{
VARIANT varresult;
VARIANTARG vararg[1];
V_I4(&vararg[0]) = iFlag;
hr = invoke(pSession, "Mode", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BOOL);
- *pMode = V_BOOL(&varresult);
+ *mode = V_BOOL(&varresult);
VariantClear(&varresult);
return hr;
}
-static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, BOOL bMode)
+static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, VARIANT_BOOL mode)
{
VARIANT varresult;
VARIANTARG vararg[2];
V_I4(&vararg[1]) = iFlag;
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BOOL;
- V_BOOL(&vararg[0]) = bMode;
+ V_BOOL(&vararg[0]) = mode;
return invoke(pSession, "Mode", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY);
}
WCHAR stringw[MAX_PATH];
CHAR string[MAX_PATH];
UINT len;
- BOOL bool;
+ VARIANT_BOOL bool;
int myint;
IDispatch *pDatabase = NULL, *pInst = NULL, *record = NULL;
ULONG refs_before, refs_after;
ok(!bool, "Maintenance mode is %d\n", bool);
/* Session::Mode, put */
- hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, TRUE);
+ hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, VARIANT_TRUE);
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
hr = Session_ModeGet(pSession, MSIRUNMODE_REBOOTATEND, &bool);
ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr);
ok(bool, "Reboot at end session mode is %d, expected 1\n", bool);
- hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, FALSE); /* set it again so we don't reboot */
+ hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, VARIANT_FALSE); /* set it again so we don't reboot */
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
- hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, TRUE);
+ hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, VARIANT_TRUE);
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
ok_exception(hr, szModeFlag);
ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr);
ok(bool, "Reboot now mode is %d, expected 1\n", bool);
- hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, FALSE); /* set it again so we don't reboot */
+ hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, VARIANT_FALSE); /* set it again so we don't reboot */
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
ok_exception(hr, szModeFlag);
- hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, TRUE);
+ hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, VARIANT_TRUE);
ok(hr == DISP_E_EXCEPTION, "Session_ModePut failed, hresult 0x%08x\n", hr);
ok_exception(hr, szModeFlag);
static const WCHAR szIntegerDataException[] = { 'I','n','t','e','g','e','r','D','a','t','a',',','F','i','e','l','d',0 };
WCHAR szPath[MAX_PATH];
HRESULT hr;
- IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL;
+ IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL, *pSumInfo = NULL;
int iValue, iCount;
if (!pInstaller) return;
IDispatch_Release(pDatabase);
}
+ /* Installer::SummaryInformation */
+ hr = Installer_SummaryInformation(szPath, 0, &pSumInfo);
+ ok(hr == S_OK, "Installer_SummaryInformation failed, hresult 0x%08x\n", hr);
+ if (hr == S_OK)
+ {
+ test_SummaryInfo(pSumInfo, summary_info, sizeof(summary_info)/sizeof(msi_summary_info), TRUE);
+ IDispatch_Release(pSumInfo);
+ }
+
+ hr = Installer_SummaryInformation(NULL, 0, &pSumInfo);
+ ok(hr == DISP_E_EXCEPTION, "Installer_SummaryInformation failed, hresult 0x%08x\n", hr);
+
/* Installer::RegistryValue */
test_Installer_RegistryValue();
"CustomAction\tAction\n"
"TestPrimaryVolumePath0\t19\t\tPrimaryVolumePath set before CostFinalize\t\n"
"TestPrimaryVolumeSpaceAvailable0\t19\t\tPrimaryVolumeSpaceAvailable set before CostFinalize\t\n"
+ "TestPrimaryVolumeSpaceRequired0\t19\t\tPrimaryVolumeSpaceRequired set before CostFinalize\t\n"
+ "TestPrimaryVolumeSpaceRemaining0\t19\t\tPrimaryVolumeSpaceRemaining set before CostFinalize\t\n"
"TestPrimaryVolumePath1\t19\t\tPrimaryVolumePath set before InstallValidate\t\n"
"TestPrimaryVolumeSpaceAvailable1\t19\t\tPrimaryVolumeSpaceAvailable not set before InstallValidate\t\n"
+ "TestPrimaryVolumeSpaceRequired1\t19\t\tPrimaryVolumeSpaceRequired not set before InstallValidate\t\n"
+ "TestPrimaryVolumeSpaceRemaining1\t19\t\tPrimaryVolumeSpaceRemaining not set before InstallValidate\t\n"
"TestPrimaryVolumePath2\t19\t\tPrimaryVolumePath not set after InstallValidate\t\n"
- "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n";
+ "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n"
+ "TestPrimaryVolumeSpaceRequired2\t19\t\tPrimaryVolumeSpaceRequired not set after InstallValidate\t\n"
+ "TestPrimaryVolumeSpaceRemaining2\t19\t\tPrimaryVolumeSpaceRemaining not set after InstallValidate\t\n";
static const char vp_install_exec_seq_dat[] =
"Action\tCondition\tSequence\n"
"FileCost\t\t300\n"
"TestPrimaryVolumePath0\tPrimaryVolumePath AND NOT REMOVE\t400\n"
"TestPrimaryVolumeSpaceAvailable0\tPrimaryVolumeSpaceAvailable AND NOT REMOVE\t500\n"
+ "TestPrimaryVolumeSpaceRequired0\tPrimaryVolumeSpaceRequired AND NOT REMOVE\t510\n"
+ "TestPrimaryVolumeSpaceRemaining0\tPrimaryVolumeSpaceRemaining AND NOT REMOVE\t520\n"
"CostFinalize\t\t600\n"
"TestPrimaryVolumePath1\tPrimaryVolumePath AND NOT REMOVE\t600\n"
"TestPrimaryVolumeSpaceAvailable1\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t800\n"
+ "TestPrimaryVolumeSpaceRequired1\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t810\n"
+ "TestPrimaryVolumeSpaceRemaining1\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t820\n"
"InstallValidate\t\t900\n"
"TestPrimaryVolumePath2\tNOT PrimaryVolumePath AND NOT REMOVE\t1000\n"
"TestPrimaryVolumeSpaceAvailable2\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t1100\n"
+ "TestPrimaryVolumeSpaceRequired2\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t1110\n"
+ "TestPrimaryVolumeSpaceRemaining2\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t1120\n"
"InstallInitialize\t\t1200\n"
"ProcessComponents\t\t1300\n"
"RemoveFiles\t\t1400\n"
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
r = MsiInstallProductA(msifile, NULL);
+ if (r == ERROR_INSTALL_FAILURE)
+ {
+ win_skip("unprivileged user?\n");
+ goto error;
+ }
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
if (r == ERROR_SUCCESS)
{
ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "Directory not created\n");
}
+
+error:
delete_cab_files();
DeleteFileA(msifile);
}
MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL);
r = MsiInstallProductA(msifile, NULL);
+ if (r == ERROR_INSTALL_FAILURE)
+ {
+ win_skip("unprivileged user?\n");
+ goto error;
+ }
+
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
if (r == ERROR_SUCCESS)
{
ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "Directory not created\n");
}
+
+error:
delete_cab_files();
DeleteFileA(msifile);
}
ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "Directory not created\n");
+ r = MsiInstallProductA(msifile, "Prop1=\"Copyright \"\"My Company\"\" 2015\" MyProp=42");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+ ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
+ ok(delete_pf("msitest", FALSE), "Directory not created\n");
+
+ r = MsiInstallProductA(msifile, "Prop1=\"\"\"install.exe\"\" /Install\" MyProp=\"42\"");
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+ ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
+ ok(delete_pf("msitest", FALSE), "Directory not created\n");
+
error:
DeleteFileA(msifile);
DeleteFileA("msitest\\augustus");
static INSTALLSTATE (WINAPI *pMsiGetComponentPathA)
(LPCSTR, LPCSTR, LPSTR, DWORD*);
+static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)
+ (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD);
static INSTALLSTATE (WINAPI *pMsiProvideComponentA)
(LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD);
static INSTALLSTATE (WINAPI *pMsiProvideComponentW)
trace("GetProcAddress(%s) failed\n", #func);
GET_PROC(hmsi, MsiGetComponentPathA)
+ GET_PROC(hmsi, MsiGetComponentPathExA);
GET_PROC(hmsi, MsiProvideComponentA)
GET_PROC(hmsi, MsiProvideComponentW)
GET_PROC(hmsi, MsiGetFileHashA)
ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz);
/* pcchLangBuf not big enough */
- langsz = 3;
+ langsz = 4;
lstrcpyA(lang, "lang");
r = MsiGetFileVersionA(path, NULL, NULL, lang, &langsz);
ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
- ok(!strncmp(lang, langcheck, 2),
- "Expected first character of \"%s\", got \"%s\"\n", langcheck, lang);
+ ok(lstrcmpA(lang, "lang"), "lang not set\n");
ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz);
/* pcchVersionBuf big enough, pcchLangBuf not big enough */
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz);
ok(langsz >= langchecksz && langsz < MAX_PATH, "Expected %d >= %d\n", langsz, langchecksz);
- ok(lstrcmpA(lang, "lang"), "lang buffer not modified\n");
+ ok(strstr(lang, langcheck) != NULL, "expected %s in %s\n", langcheck, lang);
/* NULL pcchVersionBuf and pcchLangBuf */
r = MsiGetFileVersionA(path, version, NULL, lang, NULL);
test_lastusedsource();
test_setpropertyfolder();
test_sourcedir_props();
- test_concurrentinstall();
+ if (pMsiGetComponentPathExA)
+ test_concurrentinstall();
test_command_line_parsing();
SetCurrentDirectoryA(prev_path);
/* reinstall the product */
r = MsiInstallProductA(msifile3, "REINSTALL=ALL");
- ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(r == ERROR_SUCCESS || broken(r == ERROR_INSTALL_FAILURE) /* win2k3 */, "Expected ERROR_SUCCESS, got %d\n", r);
state = MsiQueryFeatureStateA("{7262AC98-EEBD-4364-8CE3-D654F6A425B9}", "five");
ok(state == INSTALLSTATE_UNKNOWN, "state = %d\n", state);