mirror of
https://github.com/reactos/reactos.git
synced 2025-01-03 21:09:19 +00:00
[MSI_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246
svn path=/trunk/; revision=66633
This commit is contained in:
parent
102b741c7e
commit
8ffd0f2576
7 changed files with 243 additions and 75 deletions
|
@ -182,7 +182,8 @@ static const char property_dat[] =
|
|||
"SERVNAME2\tTestService2\n"
|
||||
"SERVDISP\tTestServiceDisp\n"
|
||||
"SERVDISP2\tTestServiceDisp2\n"
|
||||
"MSIFASTINSTALL\t1\n";
|
||||
"MSIFASTINSTALL\t1\n"
|
||||
"regdata15\t#x01\n";
|
||||
|
||||
static const char environment_dat[] =
|
||||
"Environment\tName\tValue\tComponent_\n"
|
||||
|
@ -242,7 +243,10 @@ static const char sss_service_control_dat[] =
|
|||
"ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
|
||||
"s72\tl255\ti2\tL255\tI2\ts72\n"
|
||||
"ServiceControl\tServiceControl\n"
|
||||
"ServiceControl\tSpooler\t1\t\t0\tservice_comp";
|
||||
"ServiceControl\tSpooler\t1\t\t1\tservice_comp\n"
|
||||
"ServiceControl2\tSpooler\t2\t\t1\tservice_comp\n"
|
||||
"ServiceControl3\tSpooler\t16\t\t1\tservice_comp\n"
|
||||
"ServiceControl4\tSpooler\t32\t\t1\tservice_comp\n";
|
||||
|
||||
static const char sss_install_exec_seq_dat[] =
|
||||
"Action\tCondition\tSequence\n"
|
||||
|
@ -255,11 +259,15 @@ static const char sss_install_exec_seq_dat[] =
|
|||
"CostFinalize\t\t1000\n"
|
||||
"InstallValidate\t\t1400\n"
|
||||
"InstallInitialize\t\t1500\n"
|
||||
"StopServices\t\t4000\n"
|
||||
"DeleteServices\t\t5000\n"
|
||||
"MoveFiles\t\t5100\n"
|
||||
"InstallFiles\t\t5200\n"
|
||||
"DuplicateFiles\t\t5300\n"
|
||||
"StartServices\t\t5400\n"
|
||||
"RegisterProduct\t\t5500\n"
|
||||
"PublishFeatures\t\t5600\n"
|
||||
"PublishProduct\t\t5700\n"
|
||||
"InstallFinalize\t\t6000\n";
|
||||
|
||||
static const char sds_install_exec_seq_dat[] =
|
||||
|
@ -510,7 +518,11 @@ static const char wrv_registry_dat[] =
|
|||
"regdata8\t2\tSOFTWARE\\Wine\\msitest\tValue4\tone[~]two\taugustus\n"
|
||||
"regdata9\t2\tSOFTWARE\\Wine\\msitest\tValue5\t[~]one[~]two[~]three\taugustus\n"
|
||||
"regdata10\t2\tSOFTWARE\\Wine\\msitest\tValue6\t[~]\taugustus\n"
|
||||
"regdata11\t2\tSOFTWARE\\Wine\\msitest\tValue7\t[~]two\taugustus\n";
|
||||
"regdata11\t2\tSOFTWARE\\Wine\\msitest\tValue7\t[~]two\taugustus\n"
|
||||
"regdata12\t2\tSOFTWARE\\Wine\\msitest\tValue8\t#1\taugustus\n"
|
||||
"regdata13\t2\tSOFTWARE\\Wine\\msitest\tValue9\t#x1\taugustus\n"
|
||||
"regdata14\t2\tSOFTWARE\\Wine\\msitest\tValue10\t#x01\taugustus\n"
|
||||
"regdata15\t2\tSOFTWARE\\Wine\\msitest\tValue11\t[regdata15]\taugustus\n";
|
||||
|
||||
static const char cf_directory_dat[] =
|
||||
"Directory\tDirectory_Parent\tDefaultDir\n"
|
||||
|
@ -2706,7 +2718,7 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
|
|||
}
|
||||
|
||||
if (!expected)
|
||||
ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
|
||||
ok_(__FILE__, line)(!val[0], "Expected empty string, got %s\n", val);
|
||||
else
|
||||
{
|
||||
if (bcase)
|
||||
|
@ -4919,6 +4931,7 @@ static void test_write_registry_values(void)
|
|||
HKEY hkey;
|
||||
DWORD type, size;
|
||||
CHAR path[MAX_PATH];
|
||||
BYTE buf[8];
|
||||
|
||||
if (is_process_limited())
|
||||
{
|
||||
|
@ -5051,6 +5064,42 @@ static void test_write_registry_values(void)
|
|||
ok(size == 5, "Expected 5, got %d\n", size);
|
||||
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
|
||||
|
||||
size = sizeof(buf);
|
||||
type = 0xdeadbeef;
|
||||
memset(buf, 0, size);
|
||||
res = RegQueryValueExA(hkey, "Value8", NULL, &type, buf, &size);
|
||||
ok(res == ERROR_SUCCESS, "got %u\n", res);
|
||||
ok(*(DWORD *)buf == 1, "got %u\n", *(DWORD *)buf);
|
||||
ok(size == 4, "got %u\n", size);
|
||||
ok(type == REG_DWORD, "got %u\n", type);
|
||||
|
||||
size = sizeof(buf);
|
||||
type = 0xdeadbeef;
|
||||
memset(buf, 0, size);
|
||||
res = RegQueryValueExA(hkey, "Value9", NULL, &type, buf, &size);
|
||||
ok(res == ERROR_SUCCESS, "got %u\n", res);
|
||||
ok(buf[0] == 1, "got %u\n", buf[0]);
|
||||
ok(size == 1, "got %u\n", size);
|
||||
ok(type == REG_BINARY, "got %u\n", type);
|
||||
|
||||
size = sizeof(buf);
|
||||
type = 0xdeadbeef;
|
||||
memset(buf, 0, size);
|
||||
res = RegQueryValueExA(hkey, "Value10", NULL, &type, buf, &size);
|
||||
ok(res == ERROR_SUCCESS, "got %u\n", res);
|
||||
ok(buf[0] == 1, "got %u\n", buf[0]);
|
||||
ok(size == 1, "got %u\n", size);
|
||||
ok(type == REG_BINARY, "got %u\n", type);
|
||||
|
||||
size = sizeof(buf);
|
||||
type = 0xdeadbeef;
|
||||
memset(buf, 0, size);
|
||||
res = RegQueryValueExA(hkey, "Value11", NULL, &type, buf, &size);
|
||||
ok(res == ERROR_SUCCESS, "got %u\n", res);
|
||||
ok(buf[0] == 1, "got %u\n", buf[0]);
|
||||
ok(size == 1, "got %u\n", size);
|
||||
ok(type == REG_BINARY, "got %u\n", type);
|
||||
|
||||
RegDeleteValueA(hkey, "Value");
|
||||
RegDeleteValueA(hkey, "Value1");
|
||||
RegDeleteValueA(hkey, "Value2");
|
||||
|
@ -5059,6 +5108,10 @@ static void test_write_registry_values(void)
|
|||
RegDeleteValueA(hkey, "Value5");
|
||||
RegDeleteValueA(hkey, "Value6");
|
||||
RegDeleteValueA(hkey, "Value7");
|
||||
RegDeleteValueA(hkey, "Value8");
|
||||
RegDeleteValueA(hkey, "Value9");
|
||||
RegDeleteValueA(hkey, "Value10");
|
||||
RegDeleteValueA(hkey, "Value11");
|
||||
RegCloseKey(hkey);
|
||||
RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
|
||||
|
||||
|
@ -5260,7 +5313,7 @@ error:
|
|||
DeleteFileA(msifile);
|
||||
}
|
||||
|
||||
static void test_start_services(void)
|
||||
static void test_start_stop_services(void)
|
||||
{
|
||||
UINT r;
|
||||
SC_HANDLE scm, service;
|
||||
|
@ -5309,6 +5362,23 @@ static void test_start_services(void)
|
|||
r = MsiInstallProductA(msifile, NULL);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||
|
||||
if (error == ERROR_SUCCESS)
|
||||
{
|
||||
SERVICE_STATUS status;
|
||||
|
||||
scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS);
|
||||
|
||||
ret = ControlService(service, SERVICE_CONTROL_STOP, &status);
|
||||
ok(ret, "ControlService failed %u\n", GetLastError());
|
||||
|
||||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
}
|
||||
|
||||
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||
|
||||
ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
|
||||
ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
|
||||
ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
|
||||
|
@ -5323,9 +5393,6 @@ static void test_start_services(void)
|
|||
ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
|
||||
ok(delete_pf("msitest", FALSE), "Directory not created\n");
|
||||
|
||||
delete_test_files();
|
||||
DeleteFileA(msifile);
|
||||
|
||||
if (error == ERROR_SUCCESS)
|
||||
{
|
||||
SERVICE_STATUS status;
|
||||
|
@ -5339,6 +5406,9 @@ static void test_start_services(void)
|
|||
CloseServiceHandle(service);
|
||||
CloseServiceHandle(scm);
|
||||
}
|
||||
|
||||
delete_test_files();
|
||||
DeleteFileA(msifile);
|
||||
}
|
||||
|
||||
static void test_delete_services(void)
|
||||
|
@ -6819,7 +6889,7 @@ START_TEST(action)
|
|||
test_write_registry_values();
|
||||
test_envvar();
|
||||
test_create_remove_folder();
|
||||
test_start_services();
|
||||
test_start_stop_services();
|
||||
test_delete_services();
|
||||
test_install_services();
|
||||
test_self_registration();
|
||||
|
|
|
@ -1934,7 +1934,7 @@ static void test_Session(IDispatch *pSession)
|
|||
|
||||
hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, TRUE);
|
||||
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
|
||||
if (hr == DISP_E_EXCEPTION) ok_exception(hr, szModeFlag);
|
||||
ok_exception(hr, szModeFlag);
|
||||
|
||||
hr = Session_ModeGet(pSession, MSIRUNMODE_REBOOTNOW, &bool);
|
||||
ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr);
|
||||
|
@ -1942,7 +1942,7 @@ static void test_Session(IDispatch *pSession)
|
|||
|
||||
hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, FALSE); /* set it again so we don't reboot */
|
||||
ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr);
|
||||
if (hr == DISP_E_EXCEPTION) ok_exception(hr, szModeFlag);
|
||||
ok_exception(hr, szModeFlag);
|
||||
|
||||
hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, TRUE);
|
||||
ok(hr == DISP_E_EXCEPTION, "Session_ModePut failed, hresult 0x%08x\n", hr);
|
||||
|
|
|
@ -1670,6 +1670,28 @@ static void test_streamtable(void)
|
|||
MsiViewClose( view );
|
||||
MsiCloseHandle( view );
|
||||
|
||||
/* try again */
|
||||
create_file( "test1.txt" );
|
||||
|
||||
rec = MsiCreateRecord( 2 );
|
||||
MsiRecordSetStringA( rec, 1, "data1" );
|
||||
|
||||
r = MsiRecordSetStreamA( rec, 2, "test1.txt" );
|
||||
ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r );
|
||||
|
||||
DeleteFileA( "test1.txt" );
|
||||
|
||||
r = MsiDatabaseOpenViewA( hdb,
|
||||
"INSERT INTO `_Streams` ( `Name`, `Data` ) VALUES ( ?, ? )", &view );
|
||||
ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r );
|
||||
|
||||
r = MsiViewExecute( view, rec );
|
||||
ok( r == ERROR_FUNCTION_FAILED, "got %u\n", r );
|
||||
|
||||
MsiCloseHandle( rec );
|
||||
MsiViewClose( view );
|
||||
MsiCloseHandle( view );
|
||||
|
||||
r = MsiDatabaseOpenViewA( hdb,
|
||||
"SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data'", &view );
|
||||
ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r);
|
||||
|
@ -1759,7 +1781,7 @@ static void test_streamtable(void)
|
|||
memset(buf, 0, MAX_PATH);
|
||||
r = MsiRecordReadStream( rec, 2, buf, &size );
|
||||
ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r);
|
||||
todo_wine ok( !lstrcmpA(buf, "test2.txt\n"), "Expected 'test2.txt\\n', got %s\n", buf);
|
||||
ok( !lstrcmpA(buf, "test2.txt\n"), "Expected 'test2.txt\\n', got %s\n", buf);
|
||||
|
||||
MsiCloseHandle( rec );
|
||||
MsiViewClose( view );
|
||||
|
@ -1791,10 +1813,41 @@ static void test_binary(void)
|
|||
ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r);
|
||||
DeleteFileA( "test.txt" );
|
||||
|
||||
/* try a name that exceeds maximum OLE stream name length */
|
||||
query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'encryption.dll.CB4E6205_F99A_4C51_ADD4_184506EFAB87', 10000, ? )";
|
||||
r = run_query( hdb, rec, query );
|
||||
ok( r == ERROR_SUCCESS, "Insert into Binary table failed: %d\n", r );
|
||||
|
||||
r = MsiCloseHandle( rec );
|
||||
ok( r == ERROR_SUCCESS , "Failed to close record handle\n" );
|
||||
|
||||
r = MsiDatabaseCommit( hdb );
|
||||
ok( r == ERROR_FUNCTION_FAILED , "got %u\n", r );
|
||||
|
||||
r = MsiCloseHandle( hdb );
|
||||
ok( r == ERROR_SUCCESS , "Failed to close database\n" );
|
||||
|
||||
r = MsiOpenDatabaseW(msifileW, MSIDBOPEN_CREATE, &hdb );
|
||||
ok( r == ERROR_SUCCESS , "Failed to open database\n" );
|
||||
|
||||
query = "CREATE TABLE `Binary` ( `Name` CHAR(72) NOT NULL, `ID` INT NOT NULL, `Data` OBJECT PRIMARY KEY `Name`, `ID`)";
|
||||
r = run_query( hdb, 0, query );
|
||||
ok( r == ERROR_SUCCESS, "Cannot create Binary table: %d\n", r );
|
||||
|
||||
create_file( "test.txt" );
|
||||
rec = MsiCreateRecord( 1 );
|
||||
r = MsiRecordSetStreamA( rec, 1, "test.txt" );
|
||||
ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r );
|
||||
DeleteFileA( "test.txt" );
|
||||
|
||||
query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'filename1', 1, ? )";
|
||||
r = run_query( hdb, rec, query );
|
||||
ok( r == ERROR_SUCCESS, "Insert into Binary table failed: %d\n", r );
|
||||
|
||||
query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'filename1', 1, ? )";
|
||||
r = run_query( hdb, rec, query );
|
||||
ok( r == ERROR_FUNCTION_FAILED, "got %u\n", r );
|
||||
|
||||
r = MsiCloseHandle( rec );
|
||||
ok( r == ERROR_SUCCESS , "Failed to close record handle\n" );
|
||||
|
||||
|
@ -4535,7 +4588,7 @@ static void test_update(void)
|
|||
size = MAX_PATH;
|
||||
r = MsiRecordGetStringA(rec, 1, result, &size);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
ok(!lstrlenA(result), "Expected an empty string, got %s\n", result);
|
||||
ok(!result[0], "Expected an empty string, got %s\n", result);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
|
@ -4581,7 +4634,7 @@ static void test_update(void)
|
|||
size = MAX_PATH;
|
||||
r = MsiRecordGetStringA(rec, 1, result, &size);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
ok(!lstrlenA(result), "Expected an empty string, got %s\n", result);
|
||||
ok(!result[0], "Expected an empty string, got %s\n", result);
|
||||
|
||||
MsiCloseHandle(rec);
|
||||
|
||||
|
|
|
@ -561,35 +561,11 @@ static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\t
|
|||
"2\t2\t\ttest2.cab\tDISK2\t\n"
|
||||
"3\t12\t\ttest3.cab\tDISK3\t\n";
|
||||
|
||||
static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
|
||||
"s72\tS255\tI2\n"
|
||||
"InstallExecuteSequence\tAction\n"
|
||||
"CostFinalize\t\t1000\n"
|
||||
"CostInitialize\t\t800\n"
|
||||
"FileCost\t\t900\n"
|
||||
"InstallFiles\t\t4000\n"
|
||||
"InstallServices\t\t5000\n"
|
||||
"InstallFinalize\t\t6600\n"
|
||||
"InstallInitialize\t\t1500\n"
|
||||
"RunInstall\t\t1600\n"
|
||||
"InstallValidate\t\t1400\n"
|
||||
"LaunchConditions\t\t100";
|
||||
|
||||
static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
|
||||
"s72\ti2\tS64\tS0\tS255\n"
|
||||
"CustomAction\tAction\n"
|
||||
"RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n";
|
||||
|
||||
static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
|
||||
"s72\tS38\ts72\ti2\tS255\tS72\n"
|
||||
"Component\tComponent\n"
|
||||
"maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n";
|
||||
|
||||
static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
|
||||
"s72\tS38\ts72\ti2\tS255\tS72\n"
|
||||
"Component\tComponent\n"
|
||||
"augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n";
|
||||
|
||||
static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n"
|
||||
"s38\ts72\n"
|
||||
"FeatureComponents\tFeature_\tComponent_\n"
|
||||
|
@ -657,13 +633,6 @@ static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAtt
|
|||
"Component\tComponent\n"
|
||||
"augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n";
|
||||
|
||||
static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
|
||||
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
|
||||
"File\tFile\n"
|
||||
"hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n"
|
||||
"helium\thelium\thelium\t0\t\t\t8192\t1\n"
|
||||
"lithium\tlithium\tlithium\t0\t\t\t8192\t1";
|
||||
|
||||
static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
|
||||
"s72\tS255\tI2\n"
|
||||
"InstallExecuteSequence\tAction\n"
|
||||
|
@ -1541,31 +1510,6 @@ static const msi_table cie_tables[] =
|
|||
ADD_TABLE(property),
|
||||
};
|
||||
|
||||
static const msi_table ci_tables[] =
|
||||
{
|
||||
ADD_TABLE(ci_component),
|
||||
ADD_TABLE(directory),
|
||||
ADD_TABLE(rof_feature),
|
||||
ADD_TABLE(rof_feature_comp),
|
||||
ADD_TABLE(rof_file),
|
||||
ADD_TABLE(ci_install_exec_seq),
|
||||
ADD_TABLE(rof_media),
|
||||
ADD_TABLE(property),
|
||||
ADD_TABLE(ci_custom_action),
|
||||
};
|
||||
|
||||
static const msi_table ci2_tables[] =
|
||||
{
|
||||
ADD_TABLE(ci2_component),
|
||||
ADD_TABLE(directory),
|
||||
ADD_TABLE(rof_feature),
|
||||
ADD_TABLE(ci2_feature_comp),
|
||||
ADD_TABLE(ci2_file),
|
||||
ADD_TABLE(install_exec_seq),
|
||||
ADD_TABLE(rof_media),
|
||||
ADD_TABLE(property),
|
||||
};
|
||||
|
||||
static const msi_table tp_tables[] =
|
||||
{
|
||||
ADD_TABLE(tp_component),
|
||||
|
@ -5723,7 +5667,7 @@ static void test_mixed_package(void)
|
|||
res = RegOpenKeyExA(HKEY_CLASSES_ROOT,
|
||||
"CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
|
||||
0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey);
|
||||
todo_wine ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res);
|
||||
ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res);
|
||||
if (res == ERROR_SUCCESS) {
|
||||
size = sizeof(value);
|
||||
res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size);
|
||||
|
@ -5786,7 +5730,7 @@ static void test_mixed_package(void)
|
|||
res = RegOpenKeyExA(HKEY_CLASSES_ROOT,
|
||||
"CLSID\\{8dfef911-6885-41eb-b280-8f0304728e8b}\\InProcServer32",
|
||||
0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey);
|
||||
todo_wine ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res);
|
||||
ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res);
|
||||
if (res == ERROR_SUCCESS) {
|
||||
size = sizeof(value);
|
||||
res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size);
|
||||
|
|
|
@ -48,6 +48,10 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
|
|||
|
||||
static INSTALLSTATE (WINAPI *pMsiGetComponentPathA)
|
||||
(LPCSTR, LPCSTR, LPSTR, DWORD*);
|
||||
static INSTALLSTATE (WINAPI *pMsiProvideComponentA)
|
||||
(LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD);
|
||||
static INSTALLSTATE (WINAPI *pMsiProvideComponentW)
|
||||
(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPWSTR, LPDWORD);
|
||||
static UINT (WINAPI *pMsiGetFileHashA)
|
||||
(LPCSTR, DWORD, PMSIFILEHASHINFO);
|
||||
static UINT (WINAPI *pMsiGetProductInfoExA)
|
||||
|
@ -86,6 +90,8 @@ static void init_functionpointers(void)
|
|||
trace("GetProcAddress(%s) failed\n", #func);
|
||||
|
||||
GET_PROC(hmsi, MsiGetComponentPathA)
|
||||
GET_PROC(hmsi, MsiProvideComponentA)
|
||||
GET_PROC(hmsi, MsiProvideComponentW)
|
||||
GET_PROC(hmsi, MsiGetFileHashA)
|
||||
GET_PROC(hmsi, MsiGetProductInfoExA)
|
||||
GET_PROC(hmsi, MsiOpenPackageExA)
|
||||
|
@ -3402,6 +3408,100 @@ static void test_MsiGetComponentPath(void)
|
|||
LocalFree(usersid);
|
||||
}
|
||||
|
||||
static void test_MsiProvideComponent(void)
|
||||
{
|
||||
static const WCHAR sourcedirW[] =
|
||||
{'s','o','u','r','c','e','d','i','r',0};
|
||||
static const WCHAR productW[] =
|
||||
{'{','3','8','8','4','7','3','3','8','-','1','B','B','C','-','4','1','0','4','-',
|
||||
'8','1','A','C','-','2','F','A','A','C','7','E','C','D','D','C','D','}',0};
|
||||
static const WCHAR componentW[] =
|
||||
{'{','D','D','4','2','2','F','9','2','-','3','E','D','8','-','4','9','B','5','-',
|
||||
'A','0','B','7','-','F','2','6','6','F','9','8','3','5','7','D','F','}',0};
|
||||
INSTALLSTATE state;
|
||||
char buf[0x100];
|
||||
WCHAR bufW[0x100];
|
||||
DWORD len, len2;
|
||||
UINT r;
|
||||
|
||||
if (is_process_limited())
|
||||
{
|
||||
skip("process is limited\n");
|
||||
return;
|
||||
}
|
||||
|
||||
create_test_files();
|
||||
create_file("msitest\\sourcedir.txt", "msitest\\sourcedir.txt", 1000);
|
||||
create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table));
|
||||
|
||||
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
|
||||
|
||||
buf[0] = 0;
|
||||
len = sizeof(buf);
|
||||
r = pMsiProvideComponentA("{90120000-0070-0000-0000-4000000FF1CE}",
|
||||
"{17961602-C4E2-482E-800A-DF6E627549CF}",
|
||||
"ProductFiles", INSTALLMODE_NODETECTION, buf, &len);
|
||||
ok(r == ERROR_INVALID_PARAMETER, "got %u\n", r);
|
||||
|
||||
r = MsiInstallProductA(msifile, NULL);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||
|
||||
state = MsiQueryFeatureStateA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir");
|
||||
ok(state == INSTALLSTATE_LOCAL, "got %d\n", state);
|
||||
|
||||
buf[0] = 0;
|
||||
len = sizeof(buf);
|
||||
r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir",
|
||||
"{DD422F92-3ED8-49B5-A0B7-F266F98357DF}",
|
||||
INSTALLMODE_NODETECTION, buf, &len);
|
||||
ok(r == ERROR_SUCCESS, "got %u\n", r);
|
||||
ok(buf[0], "empty path\n");
|
||||
ok(len == lstrlenA(buf), "got %u\n", len);
|
||||
|
||||
len2 = 0;
|
||||
r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir",
|
||||
"{DD422F92-3ED8-49B5-A0B7-F266F98357DF}",
|
||||
INSTALLMODE_NODETECTION, NULL, &len2);
|
||||
ok(r == ERROR_SUCCESS, "got %u\n", r);
|
||||
ok(len2 == len, "got %u\n", len2);
|
||||
|
||||
len2 = 0;
|
||||
r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir",
|
||||
"{DD422F92-3ED8-49B5-A0B7-F266F98357DF}",
|
||||
INSTALLMODE_NODETECTION, buf, &len2);
|
||||
ok(r == ERROR_MORE_DATA, "got %u\n", r);
|
||||
ok(len2 == len, "got %u\n", len2);
|
||||
|
||||
/* wide version */
|
||||
|
||||
bufW[0] = 0;
|
||||
len = sizeof(buf);
|
||||
r = pMsiProvideComponentW(productW, sourcedirW, componentW,
|
||||
INSTALLMODE_NODETECTION, bufW, &len);
|
||||
ok(r == ERROR_SUCCESS, "got %u\n", r);
|
||||
ok(bufW[0], "empty path\n");
|
||||
ok(len == lstrlenW(bufW), "got %u\n", len);
|
||||
|
||||
len2 = 0;
|
||||
r = pMsiProvideComponentW(productW, sourcedirW, componentW,
|
||||
INSTALLMODE_NODETECTION, NULL, &len2);
|
||||
ok(r == ERROR_SUCCESS, "got %u\n", r);
|
||||
ok(len2 == len, "got %u\n", len2);
|
||||
|
||||
len2 = 0;
|
||||
r = pMsiProvideComponentW(productW, sourcedirW, componentW,
|
||||
INSTALLMODE_NODETECTION, bufW, &len2);
|
||||
ok(r == ERROR_MORE_DATA, "got %u\n", r);
|
||||
ok(len2 == len, "got %u\n", len2);
|
||||
|
||||
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
||||
ok(r == ERROR_SUCCESS, "got %u\n", r);
|
||||
|
||||
DeleteFileA("msitest\\sourcedir.txt");
|
||||
delete_test_files();
|
||||
DeleteFileA(msifile);
|
||||
}
|
||||
|
||||
static void test_MsiGetProductCode(void)
|
||||
{
|
||||
HKEY compkey, prodkey;
|
||||
|
@ -14298,6 +14398,7 @@ START_TEST(msi)
|
|||
test_MsiQueryFeatureState();
|
||||
test_MsiQueryComponentState();
|
||||
test_MsiGetComponentPath();
|
||||
test_MsiProvideComponent();
|
||||
test_MsiGetProductCode();
|
||||
test_MsiEnumClients();
|
||||
test_MsiGetProductInfo();
|
||||
|
|
|
@ -2194,7 +2194,7 @@ static void test_props(void)
|
|||
sz = 6;
|
||||
r = MsiGetPropertyA(hpkg, "property", buffer, &sz);
|
||||
ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
ok( !strlen(buffer), "Expected empty string, got %s\n", buffer);
|
||||
ok(!buffer[0], "Expected empty string, got %s\n", buffer);
|
||||
|
||||
MsiCloseHandle( hpkg );
|
||||
DeleteFileA(msifile);
|
||||
|
@ -2347,7 +2347,7 @@ static void test_property_table(void)
|
|||
lstrcpyA(buffer, "aaa");
|
||||
r = MsiGetPropertyA(hpkg, "dantes", buffer, &sz);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer);
|
||||
ok(!buffer[0], "Expected empty string, got %s\n", buffer);
|
||||
|
||||
r = MsiSetPropertyA(hpkg, "dantes", "mercedes");
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
|
|
@ -175,7 +175,7 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
|
|||
}
|
||||
|
||||
if (!expected)
|
||||
ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val);
|
||||
ok_(__FILE__, line)(!val[0], "Expected empty string, got %s\n", val);
|
||||
else
|
||||
{
|
||||
if (bcase)
|
||||
|
|
Loading…
Reference in a new issue