ReactOS 0.4.16-dev-188-g678aa63
action.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <msiquery.h>
#include <msidefs.h>
#include <msi.h>
#include <fci.h>
#include <wtypes.h>
#include <shellapi.h>
#include <winsvc.h>
#include <odbcinst.h>
#include <sddl.h>
#include "wine/test.h"
#include "utils.h"
#include "typelib.h"
Include dependency graph for action.c:

Go to the source code of this file.

Macros

#define _WIN32_MSI   300
 
#define COBJMACROS
 
#define MEDIA_SIZE   0x7FFFFFFF
 
#define CHECK_REG_STR(prodkey, name, expected)    check_reg_str(prodkey, name, expected, TRUE, FALSE, __LINE__);
 
#define CHECK_DEL_REG_STR(prodkey, name, expected)
 
#define CHECK_DEL_REG_STR_TODO(prodkey, name, expected)
 
#define CHECK_REG_ISTR(prodkey, name, expected)    check_reg_str(prodkey, name, expected, FALSE, FALSE, __LINE__);
 
#define CHECK_DEL_REG_ISTR(prodkey, name, expected)
 
#define CHECK_REG_MULTI(key, name, expect)    check_reg_multi(key, name, expect, __LINE__);
 
#define CHECK_DEL_REG_MULTI(key, name, expect)
 
#define CHECK_REG_DWORD(prodkey, name, expected)    check_reg_dword(prodkey, name, expected, FALSE, __LINE__);
 
#define CHECK_REG_DWORD_TODO(prodkey, name, expected)    check_reg_dword(prodkey, name, expected, TRUE, __LINE__);
 
#define CHECK_DEL_REG_DWORD(prodkey, name, expected)
 
#define CHECK_DEL_REG_DWORD_TODO(prodkey, name, expected)
 

Functions

static charget_user_sid (void)
 
static void create_test_files (void)
 
static void delete_test_files (void)
 
static void delete_pfmsitest_files (void)
 
static void check_reg_str (HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, BOOL todo, DWORD line)
 
static void check_reg_multi (HKEY prodkey, const char *name, const char *expect, DWORD line)
 
static void check_reg_dword (HKEY prodkey, LPCSTR name, DWORD expected, BOOL todo, DWORD line)
 
static void get_date_str (LPSTR date)
 
static DWORD get_estimated_size (void)
 
static void extract_resource (const char *name, const char *type, const char *path)
 
static void test_register_product (void)
 
static void test_publish_product (void)
 
static void test_publish_features (void)
 
static LPSTR reg_get_val_str (HKEY hkey, LPCSTR name)
 
static void get_owner_company (LPSTR *owner, LPSTR *company)
 
static void test_register_user (void)
 
static void test_process_components (void)
 
static void test_publish (void)
 
static void test_publish_sourcelist (void)
 
static void test_remove_files (void)
 
static void test_move_files (void)
 
static void test_duplicate_files (void)
 
static void test_write_registry_values (void)
 
static void test_envvar (void)
 
static void test_create_remove_folder (void)
 
static void test_start_stop_services (void)
 
static void delete_test_service (const char *name)
 
static void test_delete_services (void)
 
static void test_install_services (void)
 
static void test_self_registration (void)
 
static void test_register_font (void)
 
static void test_validate_product_id (void)
 
static void test_install_remove_odbc (void)
 
static void test_register_typelib (void)
 
static void test_create_remove_shortcut (void)
 
static void test_publish_components (void)
 
static void test_remove_duplicate_files (void)
 
static void test_find_related_products (void)
 
static void test_ini_values (void)
 
static void test_register_class_info (void)
 
static void test_register_extension_info (void)
 
static void test_register_progid_info (void)
 
static void test_register_mime_info (void)
 
static void test_publish_assemblies (void)
 
static void test_remove_existing_products (void)
 
static HANDLE get_admin_token (void)
 
void restart_as_admin_elevated (void)
 
 START_TEST (action)
 

Variables

static BOOL is_wow64
 
static const BOOL is_64bit = sizeof(void *) > sizeof(int)
 
static const charmsifile = "msitest.msi"
 
static const char component_dat []
 
static const char directory_dat []
 
static const char feature_dat []
 
static const char feature_comp_dat []
 
static const char file_dat []
 
static const char install_exec_seq_dat []
 
static const char media_dat []
 
static const char property_dat []
 
static const char env_install_exec_seq_dat []
 
static const char env_custom_action_dat []
 
static const char env_environment_dat []
 
static const char service_install_dat []
 
static const char service_install2_dat []
 
static const char service_control_dat []
 
static const char sss_service_control_dat []
 
static const char sss_install_exec_seq_dat []
 
static const char sss_custom_action_dat []
 
static const char sds_install_exec_seq_dat []
 
static const char sds_custom_action_dat []
 
static const char sis_install_exec_seq_dat []
 
static const char sis_custom_action_dat []
 
static const char rof_component_dat []
 
static const char rof_feature_dat []
 
static const char rof_feature_comp_dat []
 
static const char rof_file_dat []
 
static const char rof_media_dat []
 
static const char ci2_feature_comp_dat []
 
static const char ci2_file_dat []
 
static const char pp_install_exec_seq_dat []
 
static const char pp_custom_action_dat []
 
static const char pp_component_dat []
 
static const char ppc_component_dat []
 
static const char ppc_file_dat []
 
static const char ppc_media_dat []
 
static const char ppc_feature_comp_dat []
 
static const char cwd_component_dat []
 
static const char rem_component_dat []
 
static const char rem_feature_comp_dat []
 
static const char rem_file_dat []
 
static const char rem_install_exec_seq_dat []
 
static const char rem_remove_files_dat []
 
static const char mov_move_file_dat []
 
static const char mov_install_exec_seq_dat []
 
static const char mov_custom_action_dat []
 
static const char df_directory_dat []
 
static const char df_duplicate_file_dat []
 
static const char wrv_component_dat []
 
static const char wrv_feature_dat []
 
static const char wrv_feature_comp_dat []
 
static const char wrv_registry_dat []
 
static const char wrv_remove_registry_dat []
 
static const char wrv_install_exec_seq_dat []
 
static const char wrv_custom_action_dat []
 
static const char cf_directory_dat []
 
static const char cf_component_dat []
 
static const char cf_feature_dat []
 
static const char cf_feature_comp_dat []
 
static const char cf_file_dat []
 
static const char cf_create_folders_dat []
 
static const char cf_install_exec_seq_dat []
 
static const char cf_custom_action_dat []
 
static const char sr_file_dat []
 
static const char sr_feature_dat []
 
static const char sr_feature_comp_dat []
 
static const char sr_component_dat []
 
static const char sr_selfreg_dat []
 
static const char sr_install_exec_seq_dat []
 
static const char sr_custom_action_dat []
 
static const char font_media_dat []
 
static const char font_file_dat []
 
static const char font_feature_dat []
 
static const char font_component_dat []
 
static const char font_feature_comp_dat []
 
static const char font_dat []
 
static const char font_install_exec_seq_dat []
 
static const char font_custom_action_dat []
 
static const char vp_property_dat []
 
static const char vp_custom_action_dat []
 
static const char vp_install_exec_seq_dat []
 
static const char odbc_file_dat []
 
static const char odbc_feature_dat []
 
static const char odbc_feature_comp_dat []
 
static const char odbc_component_dat []
 
static const char odbc_driver_dat []
 
static const char odbc_translator_dat []
 
static const char odbc_datasource_dat []
 
static const char odbc_install_exec_seq_dat []
 
static const char odbc_custom_action_dat []
 
static const char odbc_media_dat []
 
static const char tl_file_dat []
 
static const char tl_feature_dat []
 
static const char tl_feature_comp_dat []
 
static const char tl_component_dat []
 
static const char tl_typelib_dat []
 
static const char tl_install_exec_seq_dat []
 
static const char tl_custom_action_dat []
 
static const char crs_file_dat []
 
static const char crs_feature_dat []
 
static const char crs_feature_comp_dat []
 
static const char crs_component_dat []
 
static const char crs_shortcut_dat []
 
static const char crs_install_exec_seq_dat []
 
static const char crs_custom_action_dat []
 
static const char pub_file_dat []
 
static const char pub_feature_dat []
 
static const char pub_feature_comp_dat []
 
static const char pub_component_dat []
 
static const char pub_publish_component_dat []
 
static const char pub_install_exec_seq_dat []
 
static const char pub_custom_action_dat []
 
static const char rd_file_dat []
 
static const char rd_feature_dat []
 
static const char rd_feature_comp_dat []
 
static const char rd_component_dat []
 
static const char rd_duplicate_file_dat []
 
static const char rd_install_exec_seq_dat []
 
static const char rd_custom_action_dat []
 
static const char frp_file_dat []
 
static const char frp_feature_dat []
 
static const char frp_feature_comp_dat []
 
static const char frp_component_dat []
 
static const char frp_custom_action_dat []
 
static const char frp_upgrade_dat []
 
static const char frp_install_exec_seq_dat []
 
static const char ini_file_dat []
 
static const char ini_feature_dat []
 
static const char ini_feature_comp_dat []
 
static const char ini_component_dat []
 
static const char ini_ini_file_dat []
 
static const char ini_remove_ini_file_dat []
 
static const char ini_install_exec_seq_dat []
 
static const char ini_custom_action_dat []
 
static const char rci_file_dat []
 
static const char rci_feature_dat []
 
static const char rci_feature_comp_dat []
 
static const char rci_component_dat []
 
static const char rci_appid_dat []
 
static const char rci_class_dat []
 
static const char rci_install_exec_seq_dat []
 
static const char rci_custom_action_dat []
 
static const char rei_file_dat []
 
static const char rei_feature_dat []
 
static const char rei_feature_comp_dat []
 
static const char rei_component_dat []
 
static const char rei_extension_dat []
 
static const char rei_verb_dat []
 
static const char rei_progid_dat []
 
static const char rei_install_exec_seq_dat []
 
static const char rei_custom_action_dat []
 
static const char rpi_file_dat []
 
static const char rpi_feature_dat []
 
static const char rpi_feature_comp_dat []
 
static const char rpi_component_dat []
 
static const char rpi_appid_dat []
 
static const char rpi_class_dat []
 
static const char rpi_extension_dat []
 
static const char rpi_verb_dat []
 
static const char rpi_progid_dat []
 
static const char rpi_install_exec_seq_dat []
 
static const char rpi_custom_action_dat []
 
static const char rmi_file_dat []
 
static const char rmi_feature_dat []
 
static const char rmi_feature_comp_dat []
 
static const char rmi_component_dat []
 
static const char rmi_extension_dat []
 
static const char rmi_verb_dat []
 
static const char rmi_mime_dat []
 
static const char rmi_install_exec_seq_dat []
 
static const char rmi_custom_action_dat []
 
static const char pa_file_dat []
 
static const char pa_feature_dat []
 
static const char pa_feature_comp_dat []
 
static const char pa_component_dat []
 
static const char pa_msi_assembly_dat []
 
static const char pa_msi_assembly_name_dat []
 
static const char pa_install_exec_seq_dat []
 
static const char pa_custom_action_dat []
 
static const char rep_file_dat []
 
static const char rep_feature_dat []
 
static const char rep_feature_comp_dat []
 
static const char rep_component_dat []
 
static const char rep_upgrade_dat []
 
static const char rep_property_dat []
 
static const char rep_install_exec_seq_dat []
 
static const msi_table env_tables []
 
static const msi_table pp_tables []
 
static const msi_table ppc_tables []
 
static const msi_table rem_tables []
 
static const msi_table mov_tables []
 
static const msi_table df_tables []
 
static const msi_table wrv_tables []
 
static const msi_table cf_tables []
 
static const msi_table sss_tables []
 
static const msi_table sds_tables []
 
static const msi_table sis_tables []
 
static const msi_table sr_tables []
 
static const msi_table font_tables []
 
static const msi_table vp_tables []
 
static const msi_table odbc_tables []
 
static const msi_table tl_tables []
 
static const msi_table crs_tables []
 
static const msi_table pub_tables []
 
static const msi_table rd_tables []
 
static const msi_table frp_tables []
 
static const msi_table ini_tables []
 
static const msi_table rci_tables []
 
static const msi_table rei_tables []
 
static const msi_table rpi_tables []
 
static const msi_table rmi_tables []
 
static const msi_table pa_tables []
 
static const msi_table rep_tables []
 

Macro Definition Documentation

◆ _WIN32_MSI

#define _WIN32_MSI   300

Definition at line 22 of file action.c.

◆ CHECK_DEL_REG_DWORD

#define CHECK_DEL_REG_DWORD (   prodkey,
  name,
  expected 
)
Value:
do { \
check_reg_dword(prodkey, name, expected, FALSE, __LINE__); \
RegDeleteValueA(prodkey, name); \
} while(0)
#define FALSE
Definition: types.h:117
BOOL expected
Definition: store.c:2063
Definition: name.c:39

Definition at line 2529 of file action.c.

◆ CHECK_DEL_REG_DWORD_TODO

#define CHECK_DEL_REG_DWORD_TODO (   prodkey,
  name,
  expected 
)
Value:
do { \
check_reg_dword(prodkey, name, expected, TRUE, __LINE__); \
RegDeleteValueA(prodkey, name); \
} while(0)
#define TRUE
Definition: types.h:120

Definition at line 2535 of file action.c.

◆ CHECK_DEL_REG_ISTR

#define CHECK_DEL_REG_ISTR (   prodkey,
  name,
  expected 
)
Value:
do { \
check_reg_str(prodkey, name, expected, FALSE, FALSE, __LINE__); \
RegDeleteValueA(prodkey, name); \
} while(0)

Definition at line 2508 of file action.c.

◆ CHECK_DEL_REG_MULTI

#define CHECK_DEL_REG_MULTI (   key,
  name,
  expect 
)
Value:
do { \
check_reg_multi(key, name, expect, __LINE__); \
RegDeleteValueA(key, name); \
} while(0)
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
Definition: copy.c:22

Definition at line 2517 of file action.c.

◆ CHECK_DEL_REG_STR

#define CHECK_DEL_REG_STR (   prodkey,
  name,
  expected 
)
Value:
do { \
check_reg_str(prodkey, name, expected, TRUE, FALSE, __LINE__); \
RegDeleteValueA(prodkey, name); \
} while(0)

Definition at line 2493 of file action.c.

◆ CHECK_DEL_REG_STR_TODO

#define CHECK_DEL_REG_STR_TODO (   prodkey,
  name,
  expected 
)
Value:
do { \
check_reg_str(prodkey, name, expected, TRUE, TRUE, __LINE__); \
RegDeleteValueA(prodkey, name); \
} while(0)

Definition at line 2499 of file action.c.

◆ CHECK_REG_DWORD

#define CHECK_REG_DWORD (   prodkey,
  name,
  expected 
)     check_reg_dword(prodkey, name, expected, FALSE, __LINE__);

Definition at line 2523 of file action.c.

◆ CHECK_REG_DWORD_TODO

#define CHECK_REG_DWORD_TODO (   prodkey,
  name,
  expected 
)     check_reg_dword(prodkey, name, expected, TRUE, __LINE__);

Definition at line 2526 of file action.c.

◆ CHECK_REG_ISTR

#define CHECK_REG_ISTR (   prodkey,
  name,
  expected 
)     check_reg_str(prodkey, name, expected, FALSE, FALSE, __LINE__);

Definition at line 2505 of file action.c.

◆ CHECK_REG_MULTI

#define CHECK_REG_MULTI (   key,
  name,
  expect 
)     check_reg_multi(key, name, expect, __LINE__);

Definition at line 2514 of file action.c.

◆ CHECK_REG_STR

#define CHECK_REG_STR (   prodkey,
  name,
  expected 
)     check_reg_str(prodkey, name, expected, TRUE, FALSE, __LINE__);

Definition at line 2490 of file action.c.

◆ COBJMACROS

#define COBJMACROS

Definition at line 26 of file action.c.

◆ MEDIA_SIZE

#define MEDIA_SIZE   0x7FFFFFFF

Definition at line 2358 of file action.c.

Function Documentation

◆ check_reg_dword()

static void check_reg_dword ( HKEY  prodkey,
LPCSTR  name,
DWORD  expected,
BOOL  todo,
DWORD  line 
)
static

Definition at line 2477 of file action.c.

2478{
2479 DWORD val, size, type;
2480 LONG res;
2481
2482 size = sizeof(DWORD);
2483 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)&val, &size);
2484 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2485 ok_(__FILE__, line)(type == REG_DWORD, "Got wrong type %lu\n", type);
2487 ok_(__FILE__, line)(val == expected, "Expected %lu, got %lu\n", expected, val);
2488}
#define ok_(x1, x2)
Definition: atltest.h:61
#define NULL
Definition: types.h:112
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
GLuint GLfloat * val
Definition: glext.h:7180
BOOL todo
Definition: filedlg.c:313
#define todo_wine_if(is_todo)
Definition: custom.c:86
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define REG_DWORD
Definition: sdbapi.c:596
Definition: parser.c:49
unsigned char BYTE
Definition: xxhash.c:193

◆ check_reg_multi()

static void check_reg_multi ( HKEY  prodkey,
const char name,
const char expect,
DWORD  line 
)
static

Definition at line 2457 of file action.c.

2458{
2459 char val[MAX_PATH];
2460 DWORD expect_size = 0, size, type;
2461 const char *p;
2462 LONG res;
2463
2464 for (p = expect; *p; p += strlen(p) + 1)
2465 ;
2466 expect_size = (p + 1) - expect;
2467
2468 size = MAX_PATH;
2469 val[0] = '\0';
2470 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)val, &size);
2471 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2472 ok_(__FILE__, line)(type == REG_MULTI_SZ, "Got wrong type %lu\n", type);
2473 ok_(__FILE__, line)(size == expect_size, "expected size %lu, got %lu\n", expect_size, size);
2474 ok_(__FILE__, line)(!memcmp(val, expect, size), "got %s\n", debugstr_an(val, size));
2475}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
#define MAX_PATH
Definition: compat.h:34
GLfloat GLfloat p
Definition: glext.h:8902
#define REG_MULTI_SZ
Definition: nt_native.h:1501

◆ check_reg_str()

static void check_reg_str ( HKEY  prodkey,
LPCSTR  name,
LPCSTR  expected,
BOOL  bcase,
BOOL  todo,
DWORD  line 
)
static

Definition at line 2437 of file action.c.

2438{
2439 char val[MAX_PATH];
2440 DWORD size, type;
2441 LONG res;
2442
2443 size = MAX_PATH;
2444 val[0] = '\0';
2445 res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)val, &size);
2446 ok_(__FILE__, line)(!res, "Failed to query value, error %ld\n", res);
2447 ok_(__FILE__, line)(type == REG_SZ || type == REG_EXPAND_SZ, "Got wrong type %lu\n", type);
2449 {
2450 if (bcase)
2451 ok_(__FILE__, line)(!strcmp(val, expected), "got %s\n", debugstr_a(val));
2452 else
2453 ok_(__FILE__, line)(!strcasecmp(val, expected), "got %s\n", debugstr_a(val));
2454 }
2455}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define strcasecmp
Definition: fake.h:9
#define debugstr_a
Definition: kernel32.h:31
#define REG_SZ
Definition: layer.c:22
#define REG_EXPAND_SZ
Definition: nt_native.h:1494

◆ create_test_files()

static void create_test_files ( void  )
static

Definition at line 2379 of file action.c.

2380{
2381 CreateDirectoryA("msitest", NULL);
2382 create_file("msitest\\one.txt", 100);
2383 CreateDirectoryA("msitest\\first", NULL);
2384 create_file("msitest\\first\\two.txt", 100);
2385 CreateDirectoryA("msitest\\second", NULL);
2386 create_file("msitest\\second\\three.txt", 100);
2387
2388 create_file("four.txt", 100);
2389 create_file("five.txt", 100);
2390 create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0");
2391
2392 create_file("msitest\\filename", 100);
2393 create_file("msitest\\service.exe", 100);
2394 create_file("msitest\\service2.exe", 100);
2395
2396 DeleteFileA("four.txt");
2397 DeleteFileA("five.txt");
2398}
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
static void create_cab_file(void)
Definition: files.c:356
#define create_file(name, size)
Definition: asmcache.c:813
#define MEDIA_SIZE
Definition: action.c:2358

Referenced by test_create_remove_shortcut(), test_delete_services(), test_find_related_products(), test_ini_values(), test_install_remove_odbc(), test_install_services(), test_publish_assemblies(), test_publish_components(), test_register_class_info(), test_register_extension_info(), test_register_font(), test_register_mime_info(), test_register_progid_info(), test_register_typelib(), test_remove_duplicate_files(), test_remove_existing_products(), test_self_registration(), test_start_stop_services(), and test_validate_product_id().

◆ delete_pfmsitest_files()

static void delete_pfmsitest_files ( void  )
static

Definition at line 2415 of file action.c.

2416{
2417 SHFILEOPSTRUCTA shfl;
2418 CHAR path[MAX_PATH+11];
2419
2421 lstrcatA(path, "\\msitest\\*");
2422 path[strlen(path) + 1] = '\0';
2423
2424 shfl.hwnd = NULL;
2425 shfl.wFunc = FO_DELETE;
2426 shfl.pFrom = path;
2427 shfl.pTo = NULL;
2429
2430 SHFileOperationA(&shfl);
2431
2433 lstrcatA(path, "\\msitest");
2435}
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
Definition: dir.c:714
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
char PROG_FILES_DIR[MAX_PATH]
Definition: install.c:50
#define FO_DELETE
Definition: shellapi.h:138
#define FOF_FILESONLY
Definition: shellapi.h:148
#define FOF_NOERRORUI
Definition: shellapi.h:151
#define FOF_NOCONFIRMATION
Definition: shellapi.h:145
#define FOF_SILENT
Definition: shellapi.h:143
#define FOF_NORECURSION
Definition: shlfileop.c:38
int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)
Definition: shlfileop.cpp:1060
FILEOP_FLAGS fFlags
Definition: shellapi.h:349
char CHAR
Definition: xmlstorage.h:175

Referenced by test_publish(), and test_publish_sourcelist().

◆ delete_test_files()

static void delete_test_files ( void  )
static

◆ delete_test_service()

static void delete_test_service ( const char name)
static

Definition at line 5172 of file action.c.

5173{
5174 BOOL ret;
5175 SC_HANDLE manager, service;
5176
5178 ok(manager != NULL, "can't open service manager\n");
5179 if (!manager) return;
5180
5181 service = OpenServiceA(manager, name, GENERIC_ALL);
5182 if (service)
5183 {
5184 ret = DeleteService( service );
5185 ok( ret, "failed to delete service %lu\n", GetLastError() );
5186 CloseServiceHandle(service);
5187 }
5188 CloseServiceHandle(manager);
5189}
#define ok(value,...)
Definition: atltest.h:57
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_ALL
Definition: nt_native.h:92
BOOL WINAPI DeleteService(SC_HANDLE hService)
Definition: scm.c:921
SC_HANDLE WINAPI OpenServiceA(SC_HANDLE hSCManager, LPCSTR lpServiceName, DWORD dwDesiredAccess)
Definition: scm.c:2112
SC_HANDLE WINAPI OpenSCManagerA(LPCSTR lpMachineName, LPCSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2024
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define SC_MANAGER_ALL_ACCESS
Definition: winsvc.h:13

Referenced by test_delete_services(), and test_install_services().

◆ extract_resource()

static void extract_resource ( const char name,
const char type,
const char path 
)
static

Definition at line 2566 of file action.c.

2567{
2568 DWORD written;
2569 HANDLE file;
2570 HRSRC res;
2571 void *ptr;
2572
2574 ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %lu\n", path, GetLastError());
2575
2577 ok( res != 0, "couldn't find resource\n" );
2580 ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
2581 CloseHandle( file );
2582}
#define CloseHandle
Definition: compat.h:739
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
#define CREATE_ALWAYS
Definition: disk.h:72
static PVOID ptr
Definition: dispmode.c:27
#define GENERIC_WRITE
Definition: nt_native.h:90
Definition: fci.c:127

Referenced by test_register_typelib(), and test_self_registration().

◆ get_admin_token()

static HANDLE get_admin_token ( void  )
static

Definition at line 6456 of file action.c.

6457{
6459 TOKEN_LINKED_TOKEN linked;
6460 DWORD size;
6461
6462#ifdef __REACTOS__
6463#ifndef GetCurrentThreadEffectiveToken
6464#define GetCurrentProcessToken() ((HANDLE)~(ULONG_PTR)3)
6465#define GetCurrentThreadEffectiveToken() GetCurrentProcessToken()
6466#endif
6467#endif
6468
6471 return NULL;
6472
6473 if (!GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenLinkedToken, &linked, sizeof(linked), &size))
6474 return NULL;
6475 return linked.LinkedToken;
6476}
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:411
#define GetCurrentThreadEffectiveToken()
Definition: security.c:42
enum _TOKEN_ELEVATION_TYPE TOKEN_ELEVATION_TYPE
@ TokenElevationTypeFull
Definition: winnt_old.h:2487
@ TokenElevationType
Definition: setypes.h:983
@ TokenLinkedToken
Definition: setypes.h:984

Referenced by restart_as_admin_elevated().

◆ get_date_str()

static void get_date_str ( LPSTR  date)
static

Definition at line 2541 of file action.c.

2542{
2543 SYSTEMTIME systime;
2544
2545 static const char date_fmt[] = "%d%02d%02d";
2546 GetLocalTime(&systime);
2547 sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
2548}
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:286
__u16 date
Definition: mkdosfs.c:8
#define sprintf(buf, format,...)
Definition: sprintf.c:55
WORD wYear
Definition: winbase.h:905
WORD wMonth
Definition: winbase.h:906
WORD wDay
Definition: winbase.h:908

Referenced by test_publish(), and test_register_product().

◆ get_estimated_size()

static DWORD get_estimated_size ( void  )
static

Definition at line 2551 of file action.c.

2552{
2553 SYSTEM_INFO si;
2554 HANDLE file;
2555 DWORD size;
2556
2557 GetSystemInfo(&si);
2558
2560 size = ((GetFileSize(file, NULL) + si.dwPageSize - 1) / si.dwPageSize + 1);
2561 size = size * si.dwPageSize / 1024;
2563 return size;
2564}
#define OPEN_EXISTING
Definition: compat.h:775
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
VOID WINAPI GetSystemInfo(IN LPSYSTEM_INFO lpSystemInfo)
Definition: sysinfo.c:143
static const char * msifile
Definition: action.c:48
DWORD dwPageSize
Definition: winbase.h:1173

Referenced by test_publish(), and test_register_product().

◆ get_owner_company()

static void get_owner_company ( LPSTR owner,
LPSTR company 
)
static

Definition at line 3338 of file action.c.

3339{
3340 LONG res;
3341 HKEY hkey;
3343
3344 *owner = *company = NULL;
3345
3346 if (is_wow64)
3348
3350 "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey);
3351 if (res == ERROR_SUCCESS)
3352 {
3353 *owner = reg_get_val_str(hkey, "DefName");
3354 *company = reg_get_val_str(hkey, "DefCompany");
3355 RegCloseKey(hkey);
3356 }
3357
3358 if (!*owner || !*company)
3359 {
3361 "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, access, &hkey);
3362 if (res == ERROR_SUCCESS)
3363 {
3364 *owner = reg_get_val_str(hkey, "RegisteredOwner");
3365 *company = reg_get_val_str(hkey, "RegisteredOrganization");
3366 RegCloseKey(hkey);
3367 }
3368 }
3369
3370 if (!*owner || !*company)
3371 {
3373 "Software\\Microsoft\\Windows\\CurrentVersion", 0, access, &hkey);
3374 if (res == ERROR_SUCCESS)
3375 {
3376 *owner = reg_get_val_str(hkey, "RegisteredOwner");
3377 *company = reg_get_val_str(hkey, "RegisteredOrganization");
3378 RegCloseKey(hkey);
3379 }
3380 }
3381}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3234
BOOL is_wow64
Definition: msi.c:52
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
static LPSTR reg_get_val_str(HKEY hkey, LPCSTR name)
Definition: action.c:3320
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
ACCESS_MASK REGSAM
Definition: winreg.h:69
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46

Referenced by test_register_user().

◆ get_user_sid()

static char * get_user_sid ( void  )
static

Definition at line 2360 of file action.c.

2361{
2362 HANDLE token;
2363 DWORD size = 0;
2365 char *usersid = NULL;
2366
2369
2370 user = malloc(size);
2372 ConvertSidToStringSidA(user->User.Sid, &usersid);
2373 free(user);
2374
2376 return usersid;
2377}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI ConvertSidToStringSidA(PSID Sid, LPSTR *StringSid)
Definition: security.c:3637
#define GetCurrentProcess()
Definition: compat.h:759
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
Definition: glfuncs.h:210
#define TOKEN_QUERY
Definition: setypes.h:928
@ TokenUser
Definition: setypes.h:966

Referenced by test_process_components(), test_publish_features(), test_publish_product(), test_register_product(), and test_register_user().

◆ reg_get_val_str()

static LPSTR reg_get_val_str ( HKEY  hkey,
LPCSTR  name 
)
static

Definition at line 3320 of file action.c.

3321{
3322 DWORD len = 0;
3323 LPSTR val;
3324 LONG r;
3325
3326 r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len);
3327 if (r != ERROR_SUCCESS)
3328 return NULL;
3329
3330 len += sizeof (WCHAR);
3331 val = malloc(len);
3332 if (!val) return NULL;
3333 val[0] = 0;
3335 return val;
3336}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum GLsizei len
Definition: glext.h:6722
unsigned char * LPBYTE
Definition: typedefs.h:53
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by get_owner_company().

◆ restart_as_admin_elevated()

void restart_as_admin_elevated ( void  )

Definition at line 6478 of file action.c.

6479{
6480 HANDLE token;
6482 STARTUPINFOW si;
6483
6484 if (!(token = get_admin_token())) return;
6485
6486 memset(&si, 0, sizeof(si));
6487 si.cb = sizeof(si);
6489 {
6491
6492 trace("restarting\n");
6493 WaitForSingleObject(pi.hProcess, INFINITE);
6494 GetExitCodeProcess(pi.hProcess, &exit_code);
6495 CloseHandle(pi.hProcess);
6496 CloseHandle(pi.hThread);
6498 }
6499 else trace("failed to restart as admin %lu\n", GetLastError());
6500
6502}
#define trace
Definition: atltest.h:70
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessAsUserW(_In_opt_ HANDLE hToken, _In_opt_ LPCWSTR lpApplicationName, _Inout_opt_ LPWSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCWSTR lpCurrentDirectory, _In_ LPSTARTUPINFOW lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation)
Definition: logon.c:993
BOOL WINAPI GetExitCodeProcess(IN HANDLE hProcess, IN LPDWORD lpExitCode)
Definition: proc.c:1168
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2019
#define INFINITE
Definition: serial.h:102
static UINT exit_code
Definition: process.c:78
static HANDLE get_admin_token(void)
Definition: action.c:6456
static refpint_t pi[]
Definition: server.c:96
#define memset(x, y, z)
Definition: compat.h:39
DWORD cb
Definition: winbase.h:852
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( action  )

Definition at line 6504 of file action.c.

6505{
6506 DWORD len;
6507 char temp_path[MAX_PATH], prev_path[MAX_PATH], log_file[MAX_PATH];
6508
6510
6511 subtest("custom");
6512
6514
6515 GetCurrentDirectoryA(MAX_PATH, prev_path);
6518
6521
6522 if(len && (CURR_DIR[len - 1] == '\\'))
6523 CURR_DIR[len - 1] = 0;
6524
6525 ok(get_system_dirs(), "failed to retrieve system dirs\n");
6526 ok(get_user_dirs(), "failed to retrieve user dirs\n");
6527
6528 /* Create only one log file and don't append. We have to pass something
6529 * for the log mode for this to work. The logfile needs to have an absolute
6530 * path otherwise we still end up with some extra logfiles as some tests
6531 * change the current directory.
6532 */
6534 lstrcatA(log_file, "\\msitest.log");
6536
6542 test_publish();
6548 test_envvar();
6569
6571 SetCurrentDirectoryA(prev_path);
6572}
static char CURR_DIR[MAX_PATH]
#define IsWow64Process
Definition: compat.h:760
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2146
BOOL WINAPI SetCurrentDirectoryA(IN LPCSTR lpPathName)
Definition: path.c:2206
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
UINT WINAPI MsiEnableLogA(DWORD dwLogMode, const char *szLogFile, DWORD attributes)
Definition: msi.c:1882
static BOOL is_process_elevated(void)
Definition: dplayx.c:6742
UNICODE_STRING log_file
Definition: btrfs.c:89
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
static void test_remove_duplicate_files(void)
Definition: action.c:5759
static void test_register_product(void)
Definition: action.c:2584
static void test_register_font(void)
Definition: action.c:5386
static void test_delete_services(void)
Definition: action.c:5191
static void test_publish_features(void)
Definition: action.c:3195
static void test_publish_product(void)
Definition: action.c:2958
static void test_envvar(void)
Definition: action.c:4903
static void test_remove_existing_products(void)
Definition: action.c:6420
static void test_ini_values(void)
Definition: action.c:5849
static void test_publish_assemblies(void)
Definition: action.c:6200
static void test_find_related_products(void)
Definition: action.c:5809
static void test_register_mime_info(void)
Definition: action.c:6155
static void test_install_remove_odbc(void)
Definition: action.c:5493
static void test_create_remove_folder(void)
Definition: action.c:5021
static void test_start_stop_services(void)
Definition: action.c:5074
static void test_publish(void)
Definition: action.c:3615
static void test_duplicate_files(void)
Definition: action.c:4695
static void test_register_user(void)
Definition: action.c:3383
static void test_write_registry_values(void)
Definition: action.c:4734
static void test_remove_files(void)
Definition: action.c:4414
static void test_create_remove_shortcut(void)
Definition: action.c:5629
static void test_publish_components(void)
Definition: action.c:5669
static void test_process_components(void)
Definition: action.c:3480
static void test_install_services(void)
Definition: action.c:5263
static void test_register_class_info(void)
Definition: action.c:5912
static void test_move_files(void)
Definition: action.c:4548
static void test_validate_product_id(void)
Definition: action.c:5442
static void test_publish_sourcelist(void)
Definition: action.c:4212
static void test_self_registration(void)
Definition: action.c:5342
static void test_register_extension_info(void)
Definition: action.c:5977
void restart_as_admin_elevated(void)
Definition: action.c:6478
static void test_register_typelib(void)
Definition: action.c:5577
static void test_register_progid_info(void)
Definition: action.c:6029
BOOL get_user_dirs(void)
Definition: install.c:2338
BOOL get_system_dirs(void)
Definition: install.c:2357
@ INSTALLLOGMODE_FATALEXIT
Definition: msi.h:131
char temp_path[MAX_PATH]
Definition: mspatcha.c:123
#define subtest
Definition: test.h:160

◆ test_create_remove_folder()

static void test_create_remove_folder ( void  )
static

Definition at line 5021 of file action.c.

5022{
5023 UINT r;
5024
5025 if (!is_process_elevated())
5026 {
5027 skip("process is limited\n");
5028 return;
5029 }
5030
5031 CreateDirectoryA("msitest", NULL);
5032 CreateDirectoryA("msitest\\first", NULL);
5033 CreateDirectoryA("msitest\\second", NULL);
5034 create_file("msitest\\first\\one.txt", 1000);
5035 create_file("msitest\\second\\two.txt", 1000);
5037
5039
5042 {
5043 skip("Not enough rights to perform tests\n");
5044 goto error;
5045 }
5046 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5047
5048 ok(pf_exists("msitest\\first\\one.txt"), "file not installed\n");
5049 ok(pf_exists("msitest\\first"), "directory not created\n");
5050 ok(pf_exists("msitest\\second\\two.txt"), "file not installed\n");
5051 ok(pf_exists("msitest\\second"), "directory not created\n");
5052 ok(pf_exists("msitest\\third"), "directory not created\n");
5053 ok(pf_exists("msitest"), "directory not created\n");
5054
5055 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5056 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5057
5058 ok(!pf_exists("msitest\\first\\one.txt"), "file not removed\n");
5059 ok(!pf_exists("msitest\\first"), "directory not removed\n");
5060 ok(!pf_exists("msitest\\second\\two.txt"), "file not removed\n");
5061 ok(!pf_exists("msitest\\second"), "directory not removed\n");
5062 ok(!pf_exists("msitest\\third"), "directory not removed\n");
5063 todo_wine ok(!pf_exists("msitest"), "directory not removed\n");
5064
5065error:
5066 DeleteFileA("msitest\\first\\one.txt");
5067 DeleteFileA("msitest\\second\\two.txt");
5068 RemoveDirectoryA("msitest\\first");
5069 RemoveDirectoryA("msitest\\second");
5070 RemoveDirectoryA("msitest");
5072}
#define skip(...)
Definition: atltest.h:64
#define ARRAY_SIZE(A)
Definition: main.h:20
UINT WINAPI MsiInstallProductA(LPCSTR szPackagePath, LPCSTR szCommandLine)
Definition: msi.c:198
INSTALLUILEVEL WINAPI MsiSetInternalUI(INSTALLUILEVEL dwUILevel, HWND *phWnd)
Definition: msi.c:2281
#define error(str)
Definition: mkdosfs.c:1605
static const msi_table cf_tables[]
Definition: action.c:2063
static BOOL pf_exists(const char *file)
Definition: custom.c:1414
#define todo_wine
Definition: custom.c:89
#define create_database(name, tables, num_tables)
Definition: utils.h:42
@ INSTALLUILEVEL_NONE
Definition: msi.h:66
unsigned int UINT
Definition: ndis.h:50
#define ERROR_INSTALL_PACKAGE_REJECTED
Definition: winerror.h:983

Referenced by START_TEST().

◆ test_create_remove_shortcut()

static void test_create_remove_shortcut ( void  )
static

Definition at line 5629 of file action.c.

5630{
5631 UINT r;
5632
5633 if (!is_process_elevated())
5634 {
5635 skip("process is limited\n");
5636 return;
5637 }
5638
5640 create_file("msitest\\target.txt", 1000);
5642
5644
5647 {
5648 skip("Not enough rights to perform tests\n");
5649 goto error;
5650 }
5651 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5652
5653 ok(pf_exists("msitest\\target.txt"), "file not created\n");
5654 ok(pf_exists("msitest\\shortcut.lnk"), "file not created\n");
5655
5656 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5657 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5658
5659 ok(!delete_pf("msitest\\shortcut.lnk", TRUE), "file not removed\n");
5660 ok(!delete_pf("msitest\\target.txt", TRUE), "file not removed\n");
5661 todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5662
5663error:
5664 DeleteFileA("msitest\\target.txt");
5667}
static void delete_test_files(void)
Definition: action.c:2400
static void create_test_files(void)
Definition: action.c:2379
static const msi_table crs_tables[]
Definition: action.c:2191
BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
Definition: install.c:2433

Referenced by START_TEST().

◆ test_delete_services()

static void test_delete_services ( void  )
static

Definition at line 5191 of file action.c.

5192{
5193 UINT r;
5194 SC_HANDLE manager, service;
5195 DWORD error;
5196
5197 if (!is_process_elevated())
5198 {
5199 skip("process is limited\n");
5200 return;
5201 }
5202
5204 ok(manager != NULL, "can't open service manager %lu\n", GetLastError());
5205 if (!manager) return;
5206
5207 service = CreateServiceA(manager, "TestService3", "TestService3",
5209 SERVICE_ERROR_NORMAL, "C:\\doesnt_exist.exe", NULL, NULL, NULL, NULL, NULL);
5210 ok(service != NULL, "can't create service %lu\n", GetLastError());
5211 CloseServiceHandle(service);
5212 CloseServiceHandle(manager);
5213 if (!service) return;
5214
5217
5219
5222 {
5223 skip("Not enough rights to perform tests\n");
5224 goto error;
5225 }
5226 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5227
5229 ok(manager != NULL, "can't open service manager\n");
5230 if (!manager) goto error;
5231
5232 service = OpenServiceA(manager, "TestService3", GENERIC_ALL);
5233 error = GetLastError();
5234 ok(service == NULL, "TestService3 not deleted\n");
5235 ok(error == ERROR_SERVICE_DOES_NOT_EXIST, "wrong error %lu\n", error);
5236 CloseServiceHandle(manager);
5237
5238 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5239 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5240
5241 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5242 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
5243 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5244 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n");
5245 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5246 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n");
5247 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5248 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n");
5249 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5250 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5251 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5252 ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
5253 ok(delete_pf("msitest", FALSE), "Directory not created\n");
5254
5255error:
5256 delete_test_service("TestService");
5257 delete_test_service("TestService2");
5258 delete_test_service("TestService3");
5261}
static void delete_test_service(const char *name)
Definition: action.c:5172
static const msi_table sds_tables[]
Definition: action.c:2091
SC_HANDLE WINAPI CreateServiceA(SC_HANDLE hSCManager, LPCSTR lpServiceName, LPCSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCSTR lpBinaryPathName, LPCSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCSTR lpDependencies, LPCSTR lpServiceStartName, LPCSTR lpPassword)
Definition: scm.c:680
#define ERROR_SERVICE_DOES_NOT_EXIST
Definition: winerror.h:611
#define SERVICE_ALL_ACCESS
Definition: winsvc.h:62
#define SERVICE_DEMAND_START
Definition: cmtypes.h:978
#define SERVICE_WIN32_OWN_PROCESS
Definition: cmtypes.h:962
#define SERVICE_ERROR_NORMAL
Definition: cmtypes.h:982

Referenced by START_TEST().

◆ test_duplicate_files()

static void test_duplicate_files ( void  )
static

Definition at line 4695 of file action.c.

4696{
4697 UINT r;
4698
4699 if (!is_process_elevated())
4700 {
4701 skip("process is limited\n");
4702 return;
4703 }
4704
4705 CreateDirectoryA("msitest", NULL);
4706 create_file("msitest\\maximus", 500);
4708
4710
4711 /* fails if the destination folder is not a valid property */
4712
4715 {
4716 skip("Not enough rights to perform tests\n");
4717 goto error;
4718 }
4719 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4720 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
4721 ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n");
4722 ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n");
4723 ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "Directory not created\n");
4724 ok(delete_pf("msitest\\this\\doesnot", FALSE), "Directory not created\n");
4725 ok(delete_pf("msitest\\this", FALSE), "Directory not created\n");
4726 ok(delete_pf("msitest", FALSE), "Directory not created\n");
4727
4728error:
4729 DeleteFileA("msitest\\maximus");
4730 RemoveDirectoryA("msitest");
4732}
static const msi_table df_tables[]
Definition: action.c:2036

Referenced by START_TEST().

◆ test_envvar()

static void test_envvar ( void  )
static

Definition at line 4903 of file action.c.

4904{
4905 char buffer[16];
4906 UINT r, i;
4907 HKEY env, env2;
4908 LONG res;
4909
4910 if (!is_process_elevated())
4911 {
4912 skip("process is limited\n");
4913 return;
4914 }
4915
4917
4918 res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL);
4919 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4920
4921 res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\Environment",
4922 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env2, NULL);
4923 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4924
4925 res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2);
4926 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4927
4928 res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2);
4929 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4930
4931 res = RegSetValueExA(env, "MSITESTVAR21", 0, REG_SZ, (const BYTE *)"1", 2);
4932 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4933
4935
4938 {
4939 skip("Not enough rights to perform tests\n");
4940 goto error;
4941 }
4942 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4943
4944 CHECK_REG_STR(env, "MSITESTVAR1", "1");
4945 CHECK_REG_STR(env, "MSITESTVAR2", "1");
4946 CHECK_REG_STR(env, "MSITESTVAR3", "1");
4947 CHECK_REG_STR(env, "MSITESTVAR4", "1");
4948
4949 res = RegDeleteValueA(env, "MSITESTVAR5");
4950 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4951
4952 res = RegDeleteValueA(env, "MSITESTVAR6");
4953 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4954
4955 res = RegDeleteValueA(env, "MSITESTVAR7");
4956 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4957
4958 res = RegDeleteValueA(env, "MSITESTVAR8");
4959 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4960
4961 res = RegDeleteValueA(env, "MSITESTVAR9");
4962 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4963
4964 res = RegDeleteValueA(env, "MSITESTVAR10");
4965 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4966
4967 CHECK_REG_STR(env, "MSITESTVAR11", "1;2");
4968 CHECK_REG_STR(env, "MSITESTVAR12", "1");
4969 CHECK_REG_STR(env, "MSITESTVAR13", "1;2");
4970 CHECK_REG_STR(env, "MSITESTVAR14", ";1;");
4971 CHECK_REG_STR(env, "MSITESTVAR15", ";;1;;");
4972 CHECK_REG_STR(env, "MSITESTVAR16", " 1 ");
4973 CHECK_REG_STR(env, "MSITESTVAR17", ";;2;;1");
4974 CHECK_REG_STR(env, "MSITESTVAR18", "1;;2;;");
4975 CHECK_REG_STR(env, "MSITESTVAR19", "1");
4976 CHECK_REG_STR(env, "MSITESTVAR20", "1");
4977 CHECK_REG_STR(env, "MSITESTVAR21", "1");
4978 CHECK_REG_STR(env, "MSITESTVAR24", "TestService");
4979 CHECK_REG_STR(env2, "MSITESTVAR100", "1");
4980
4981 res = RegSetValueExA(env, "MSITESTVAR22", 0, REG_SZ, (const BYTE *)"1", 2);
4982 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4983
4984 res = RegSetValueExA(env, "MSITESTVAR23", 0, REG_SZ, (const BYTE *)"1", 2);
4985 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4986
4987 res = RegDeleteValueA(env, "MSITESTVAR25");
4988 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4989
4990 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4991 ok(!r, "got %u\n", r);
4992
4993 CHECK_DEL_REG_STR(env, "MSITESTVAR13", "1;2");
4994 CHECK_DEL_REG_STR(env, "MSITESTVAR14", ";1;");
4995 CHECK_DEL_REG_STR(env, "MSITESTVAR15", ";;1;;");
4996 CHECK_DEL_REG_STR(env, "MSITESTVAR16", " 1 ");
4997 CHECK_DEL_REG_STR_TODO(env, "MSITESTVAR17", "1");
4998 CHECK_DEL_REG_STR_TODO(env, "MSITESTVAR18", "1");
4999 CHECK_DEL_REG_STR(env, "MSITESTVAR23", "1");
5000
5001 for (i = 1; i <= 23; i++)
5002 {
5003 sprintf(buffer, "MSITESTVAR%i", i);
5005 ok(res == ERROR_FILE_NOT_FOUND, "[%d] got %ld\n", i, res);
5006 }
5007
5008 res = RegDeleteValueA(env2, "MSITESTVAR100");
5009 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
5010
5011error:
5012 RegDeleteValueA(env, "MSITESTVAR1");
5013 RegDeleteValueA(env, "MSITESTVAR2");
5014 RegDeleteValueA(env, "MSITESTVAR21");
5016 RegCloseKey(env2);
5017
5019}
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:170
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4799
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2287
LONG WINAPI RegCreateKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD Reserved, _In_ LPSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_ LPDWORD lpdwDisposition)
Definition: reg.c:1034
GLuint buffer
Definition: glext.h:5915
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define CHECK_REG_STR(prodkey, name, expected)
Definition: action.c:2490
static const msi_table env_tables[]
Definition: action.c:1969
#define CHECK_DEL_REG_STR_TODO(prodkey, name, expected)
Definition: action.c:2499
#define CHECK_DEL_REG_STR(prodkey, name, expected)
Definition: action.c:2493

Referenced by START_TEST().

◆ test_find_related_products()

static void test_find_related_products ( void  )
static

Definition at line 5809 of file action.c.

5810{
5811 UINT r;
5812
5813 if (!is_process_elevated())
5814 {
5815 skip("process is limited\n");
5816 return;
5817 }
5818
5820 create_file("msitest\\product.txt", 1000);
5822
5824
5827 {
5828 skip("Not enough rights to perform tests\n");
5829 goto error;
5830 }
5831 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5832
5833 /* install again, so it finds the upgrade code */
5835 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5836
5837 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5838 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5839
5840 ok(!delete_pf("msitest\\product.txt", TRUE), "file not removed\n");
5841 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5842
5843error:
5844 DeleteFileA("msitest\\product.txt");
5847}
static const msi_table frp_tables[]
Definition: action.c:2233

Referenced by START_TEST().

◆ test_ini_values()

static void test_ini_values ( void  )
static

Definition at line 5849 of file action.c.

5850{
5851 UINT r;
5852 DWORD len;
5853 char inifile[MAX_PATH], buf[0x10];
5854 HANDLE file;
5855 BOOL ret;
5856
5857 if (!is_process_elevated())
5858 {
5859 skip("process is limited\n");
5860 return;
5861 }
5862
5864 create_file("msitest\\inifile.txt", 1000);
5866
5867 lstrcpyA(inifile, PROG_FILES_DIR);
5868 lstrcatA(inifile, "\\msitest");
5869 ret = CreateDirectoryA(inifile, NULL);
5871 {
5872 skip("Not enough rights to perform tests\n");
5873 goto error;
5874 }
5875 lstrcatA(inifile, "\\test.ini");
5878
5879 ret = WritePrivateProfileStringA("sectionA", "keyA", "valueA", inifile);
5880 ok(ret, "failed to write profile string %lu\n", GetLastError());
5881
5883
5885 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5886
5887 len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile);
5888 ok(len == 6, "got %lu expected 6\n", len);
5889
5890 len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile);
5891 ok(!len, "got %lu expected 0\n", len);
5892
5893 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5894 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5895
5896 len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile);
5897 ok(!len, "got %lu expected 0\n", len);
5898
5899 len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile);
5900 ok(!len, "got %lu expected 0\n", len);
5901
5902 todo_wine ok(!delete_pf("msitest\\test.ini", TRUE), "file removed\n");
5903 ok(!delete_pf("msitest\\inifile.txt", TRUE), "file not removed\n");
5904 ok(delete_pf("msitest", FALSE), "directory removed\n");
5905
5906error:
5907 DeleteFileA("msitest\\inifile.txt");
5910}
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
INT WINAPI GetPrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR def_val, LPSTR buffer, UINT len, LPCSTR filename)
Definition: profile.c:1204
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static const msi_table ini_tables[]
Definition: action.c:2247

Referenced by START_TEST().

◆ test_install_remove_odbc()

static void test_install_remove_odbc ( void  )
static

Definition at line 5493 of file action.c.

5494{
5495 int gotdriver = 0, gotdriver2 = 0;
5496 char buffer[1000], *p;
5497 WORD len;
5498 UINT r;
5499
5500 if (!is_process_elevated())
5501 {
5502 skip("process is limited\n");
5503 return;
5504 }
5505
5507 create_file("msitest\\ODBCdriver.dll", 1000);
5508 create_file("msitest\\ODBCdriver2.dll", 1000);
5509 create_file("msitest\\ODBCtranslator.dll", 1000);
5510 create_file("msitest\\ODBCtranslator2.dll", 1000);
5511 create_file("msitest\\ODBCsetup.dll", 1000);
5513
5515
5518 {
5519 skip("Not enough rights to perform tests\n");
5520 goto error;
5521 }
5522 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5523
5524 ok(pf_exists("msitest\\ODBCdriver.dll"), "file not created\n");
5525 ok(pf_exists("msitest\\ODBCdriver2.dll"), "file not created\n");
5526 ok(pf_exists("msitest\\ODBCtranslator.dll"), "file not created\n");
5527 ok(pf_exists("msitest\\ODBCtranslator2.dll"), "file not created\n");
5528 ok(pf_exists("msitest\\ODBCsetup.dll"), "file not created\n");
5529
5531 ok(len < sizeof(buffer), "buffer too small\n");
5532 ok(r, "SQLGetInstalledDrivers failed\n");
5533 for (p = buffer; *p; p += strlen(p) + 1)
5534 {
5535 if (!strcmp(p, "ODBC test driver"))
5536 gotdriver = 1;
5537 if (!strcmp(p, "ODBC test driver2"))
5538 gotdriver2 = 1;
5539 }
5540 ok(gotdriver, "driver not installed\n");
5541 ok(gotdriver2, "driver 2 not installed\n");
5542
5543 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5544 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5545
5546 ok(!delete_pf("msitest\\ODBCdriver.dll", TRUE), "file not removed\n");
5547 ok(!delete_pf("msitest\\ODBCdriver2.dll", TRUE), "file not removed\n");
5548 ok(!delete_pf("msitest\\ODBCtranslator.dll", TRUE), "file not removed\n");
5549 ok(!delete_pf("msitest\\ODBCtranslator2.dll", TRUE), "file not removed\n");
5550 ok(!delete_pf("msitest\\ODBCsetup.dll", TRUE), "file not removed\n");
5551 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5552
5553 gotdriver = gotdriver2 = 0;
5555 ok(len < sizeof(buffer), "buffer too small\n");
5556 ok(r, "SQLGetInstalledDrivers failed\n");
5557 for (p = buffer; *p; p += strlen(p) + 1)
5558 {
5559 if (!strcmp(p, "ODBC test driver"))
5560 gotdriver = 1;
5561 if (!strcmp(p, "ODBC test driver2"))
5562 gotdriver2 = 1;
5563 }
5564 ok(!gotdriver, "driver not installed\n");
5565 ok(!gotdriver2, "driver 2 not installed\n");
5566
5567error:
5568 DeleteFileA("msitest\\ODBCdriver.dll");
5569 DeleteFileA("msitest\\ODBCdriver2.dll");
5570 DeleteFileA("msitest\\ODBCtranslator.dll");
5571 DeleteFileA("msitest\\ODBCtranslator2.dll");
5572 DeleteFileA("msitest\\ODBCsetup.dll");
5575}
unsigned short WORD
Definition: ntddk_ex.h:93
static const msi_table odbc_tables[]
Definition: action.c:2161
BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout)
Definition: odbccp32.c:561

Referenced by START_TEST().

◆ test_install_services()

static void test_install_services ( void  )
static

Definition at line 5263 of file action.c.

5264{
5265 UINT r;
5266 SC_HANDLE manager, service;
5267 LONG res;
5268 HKEY hKey;
5269 DWORD err_control, err_controlsize, err_controltype;
5270
5271 if (!is_process_elevated())
5272 {
5273 skip("process is limited\n");
5274 return;
5275 }
5276
5279
5281
5284 {
5285 skip("Not enough rights to perform tests\n");
5286 goto error;
5287 }
5288 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5289
5291 ok(manager != NULL, "can't open service manager\n");
5292 if (!manager) goto error;
5293
5294 service = OpenServiceA(manager, "TestService", GENERIC_ALL);
5295 ok(service != NULL, "TestService not installed\n");
5296 CloseServiceHandle(service);
5297
5298 service = OpenServiceA(manager, "TestService4", GENERIC_ALL);
5299 ok(service == NULL, "TestService4 installed\n");
5300
5301 res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\TestService", &hKey);
5302 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
5303
5304 if (res == ERROR_SUCCESS)
5305 {
5306 err_control = 0xBEEF;
5307 err_controltype = REG_DWORD;
5308 err_controlsize = sizeof(err_control);
5309 res = RegQueryValueExA(hKey, "ErrorControl", NULL, &err_controltype, (LPBYTE)&err_control, &err_controlsize);
5310 ok(err_control == 0, "TestService.ErrorControl wrong, expected 0, got %lu\n", err_control);
5312 }
5313
5314 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5315 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5316
5317 service = OpenServiceA(manager, "TestService", GENERIC_ALL);
5318 ok(service != NULL, "TestService deleted\n");
5319 CloseServiceHandle(service);
5320 CloseServiceHandle(manager);
5321
5322 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5323 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
5324 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5325 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n");
5326 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5327 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n");
5328 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5329 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n");
5330 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5331 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5332 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5333 ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
5334 ok(delete_pf("msitest", FALSE), "Directory not created\n");
5335
5336error:
5337 delete_test_service("TestService");
5340}
FxAutoRegKey hKey
static const msi_table sis_tables[]
Definition: action.c:2106

Referenced by START_TEST().

◆ test_move_files()

static void test_move_files ( void  )
static

Definition at line 4548 of file action.c.

4549{
4550 UINT r;
4551 char props[4 * MAX_PATH + 74];
4552
4553 if (!is_process_elevated())
4554 {
4555 skip("process is limited\n");
4556 return;
4557 }
4558
4559 CreateDirectoryA("msitest", NULL);
4560 create_file("msitest\\augustus", 100);
4561 create_file("cameroon", 100);
4562 create_file("djibouti", 100);
4563 create_file("egypt", 100);
4564 create_file("finland", 100);
4565 create_file("gambai", 100);
4566 create_file("honduras", 100);
4567 create_file("msitest\\india", 100);
4568 create_file("japan", 100);
4569 create_file("kenya", 100);
4570 CreateDirectoryA("latvia", NULL);
4571 create_file("nauru", 100);
4572 create_file("peru", 100);
4573 create_file("apple", 100);
4574 create_file("application", 100);
4575 create_file("ape", 100);
4576 create_file("foo", 100);
4577 create_file("fao", 100);
4578 create_file("fbod", 100);
4579 create_file("budding", 100);
4580 create_file("buddy", 100);
4581 create_file("bud", 100);
4582 create_file("bar", 100);
4583 create_file("bur", 100);
4584 create_file("bird", 100);
4585
4587
4589
4590 /* if the source or dest property is not a full path,
4591 * windows tries to access it as a network resource
4592 */
4593
4594 sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" "
4595 "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"",
4597
4600 {
4601 skip("Not enough rights to perform tests\n");
4602 goto error;
4603 }
4604 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4605 ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
4606 ok(!delete_pf("msitest\\dest", TRUE), "File copied\n");
4607 ok(delete_pf("msitest\\canada", TRUE), "File not copied\n");
4608 ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n");
4609 ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n");
4610 ok(!delete_pf("msitest\\france", TRUE), "File moved\n");
4611 ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n");
4612 ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n");
4613 ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n");
4614 ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n");
4615 ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n");
4616 ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n");
4617 ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n");
4618 ok(delete_pf("msitest\\poland", TRUE), "File not moved\n");
4619 /* either apple or application will be moved depending on directory order */
4620 if (!delete_pf("msitest\\apple", TRUE))
4621 ok(delete_pf("msitest\\application", TRUE), "File not moved\n");
4622 else
4623 ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n");
4624 ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n");
4625 ok(!delete_pf("msitest\\ape", TRUE), "File moved\n");
4626 /* either fao or foo will be moved depending on directory order */
4627 if (delete_pf("msitest\\foo", TRUE))
4628 ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n");
4629 else
4630 ok(delete_pf("msitest\\fao", TRUE), "File not moved\n");
4631 ok(delete_pf("msitest\\single", TRUE), "File not moved\n");
4632 ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n");
4633 ok(delete_pf("msitest\\budding", TRUE), "File not moved\n");
4634 ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n");
4635 ok(!delete_pf("msitest\\bud", TRUE), "File moved\n");
4636 ok(delete_pf("msitest\\bar", TRUE), "File not moved\n");
4637 ok(delete_pf("msitest\\bur", TRUE), "File not moved\n");
4638 ok(!delete_pf("msitest\\bird", TRUE), "File moved\n");
4639 ok(delete_pf("msitest", FALSE), "Directory not created\n");
4640 ok(DeleteFileA("cameroon"), "File moved\n");
4641 ok(!DeleteFileA("djibouti"), "File not moved\n");
4642 ok(DeleteFileA("egypt"), "File moved\n");
4643 ok(DeleteFileA("finland"), "File moved\n");
4644 ok(DeleteFileA("gambai"), "File moved\n");
4645 ok(!DeleteFileA("honduras"), "File not moved\n");
4646 ok(DeleteFileA("msitest\\india"), "File moved\n");
4647 ok(DeleteFileA("japan"), "File moved\n");
4648 ok(!DeleteFileA("kenya"), "File not moved\n");
4649 ok(RemoveDirectoryA("latvia"), "Directory moved\n");
4650 ok(!DeleteFileA("nauru"), "File not moved\n");
4651 ok(!DeleteFileA("peru"), "File not moved\n");
4652 ok(!DeleteFileA("apple"), "File not moved\n");
4653 ok(!DeleteFileA("application"), "File not moved\n");
4654 ok(DeleteFileA("ape"), "File moved\n");
4655 ok(!DeleteFileA("foo"), "File not moved\n");
4656 ok(!DeleteFileA("fao"), "File not moved\n");
4657 ok(DeleteFileA("fbod"), "File moved\n");
4658 ok(!DeleteFileA("budding"), "File not moved\n");
4659 ok(!DeleteFileA("buddy"), "File not moved\n");
4660 ok(DeleteFileA("bud"), "File moved\n");
4661 ok(!DeleteFileA("bar"), "File not moved\n");
4662 ok(!DeleteFileA("bur"), "File not moved\n");
4663 ok(DeleteFileA("bird"), "File moved\n");
4664
4665error:
4666 DeleteFileA("cameroon");
4667 DeleteFileA("djibouti");
4668 DeleteFileA("egypt");
4669 DeleteFileA("finland");
4670 DeleteFileA("gambai");
4671 DeleteFileA("honduras");
4672 DeleteFileA("japan");
4673 DeleteFileA("kenya");
4674 DeleteFileA("nauru");
4675 DeleteFileA("peru");
4676 DeleteFileA("apple");
4677 DeleteFileA("application");
4678 DeleteFileA("ape");
4679 DeleteFileA("foo");
4680 DeleteFileA("fao");
4681 DeleteFileA("fbod");
4682 DeleteFileA("budding");
4683 DeleteFileA("buddy");
4684 DeleteFileA("bud");
4685 DeleteFileA("bar");
4686 DeleteFileA("bur");
4687 DeleteFileA("bird");
4688 DeleteFileA("msitest\\india");
4689 DeleteFileA("msitest\\augustus");
4690 RemoveDirectoryA("latvia");
4691 RemoveDirectoryA("msitest");
4693}
static const msi_table mov_tables[]
Definition: action.c:2022
static const WCHAR props[]
Definition: wbemdisp.c:288

Referenced by START_TEST().

◆ test_process_components()

static void test_process_components ( void  )
static

Definition at line 3480 of file action.c.

3481{
3482 static const char keyfmt[] =
3483 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Components\\%s";
3484 static const char compkey[] =
3485 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
3486 UINT r;
3487 LONG res;
3488 DWORD size;
3489 HKEY comp, hkey;
3490 LPSTR usersid;
3491 CHAR val[MAX_PATH];
3492 CHAR keypath[MAX_PATH];
3493 CHAR program_files_maximus[MAX_PATH];
3495
3496 if (!is_process_elevated())
3497 {
3498 skip("process is limited\n");
3499 return;
3500 }
3501
3502 if (!(usersid = get_user_sid()))
3503 return;
3504
3505 CreateDirectoryA("msitest", NULL);
3506 create_file("msitest\\maximus", 500);
3507
3509
3510 if (is_wow64)
3512
3514
3515 /* ProcessComponents, per-user */
3516 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
3518 {
3519 skip("Not enough rights to perform tests\n");
3520 goto error;
3521 }
3522 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3523 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3524 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3525
3526 sprintf(keypath, keyfmt, usersid, "CBABC2FDCCB35E749A8944D8C1C098B5");
3527 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3528 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3529
3530 size = MAX_PATH;
3531 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3532 NULL, NULL, (LPBYTE)val, &size);
3533 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3534
3535 lstrcpyA(program_files_maximus,PROG_FILES_DIR);
3536 lstrcatA(program_files_maximus,"\\msitest\\maximus");
3537
3538 ok(!lstrcmpiA(val, program_files_maximus),
3539 "Expected \"%s\", got \"%s\"\n", program_files_maximus, val);
3540
3541 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3542 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3543
3544 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3545 RegDeleteKeyExA(comp, "", access, 0);
3546 RegCloseKey(comp);
3547
3548 sprintf(keypath, keyfmt, usersid, "241C3DA58FECD0945B9687D408766058");
3549 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3550 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3551
3552 size = MAX_PATH;
3553 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3554 NULL, NULL, (LPBYTE)val, &size);
3555 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3556 ok(!lstrcmpA(val, "01\\msitest\\augustus"),
3557 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val);
3558
3559 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3560 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3561
3562 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3563 RegDeleteKeyExA(comp, "", access, 0);
3564 RegCloseKey(comp);
3565
3566 /* ProcessComponents, machine */
3567 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
3568 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3569 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3570 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3571
3572 sprintf(keypath, keyfmt, "S-1-5-18", "CBABC2FDCCB35E749A8944D8C1C098B5");
3573 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3574 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3575
3576 size = MAX_PATH;
3577 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3578 NULL, NULL, (LPBYTE)val, &size);
3579 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3580 ok(!lstrcmpiA(val, program_files_maximus),
3581 "Expected \"%s\", got \"%s\"\n", program_files_maximus, val);
3582
3583 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3584 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3585
3586 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3587 RegDeleteKeyExA(comp, "", access, 0);
3588 RegCloseKey(comp);
3589
3590 sprintf(keypath, keyfmt, "S-1-5-18", "241C3DA58FECD0945B9687D408766058");
3591 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp);
3592 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3593
3594 size = MAX_PATH;
3595 res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
3596 NULL, NULL, (LPBYTE)val, &size);
3597 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3598 ok(!lstrcmpA(val, "01\\msitest\\augustus"),
3599 "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val);
3600
3601 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey);
3602 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3603
3604 RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
3605 RegDeleteKeyExA(comp, "", access, 0);
3606 RegCloseKey(comp);
3607
3608error:
3610 DeleteFileA("msitest\\maximus");
3611 RemoveDirectoryA("msitest");
3612 LocalFree(usersid);
3613}
LONG WINAPI RegDeleteKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ REGSAM samDesired, _In_ DWORD Reserved)
Definition: reg.c:1254
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4195
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4224
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static char * get_user_sid(void)
Definition: action.c:2360
static const msi_table ppc_tables[]
Definition: action.c:1996

Referenced by START_TEST().

◆ test_publish()

static void test_publish ( void  )
static

Definition at line 3615 of file action.c.

3616{
3617 static const char subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
3618 static const char subkey_32node[] = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
3619 UINT r;
3620 LONG res;
3621 HKEY uninstall, prodkey, uninstall_32node = NULL;
3623 char date[MAX_PATH], date2[MAX_PATH], temp[MAX_PATH], buf[MAX_PATH];
3624 const char prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
3626 DWORD error, type, size;
3627
3628 if (!is_process_elevated())
3629 {
3630 skip("process is limited\n");
3631 return;
3632 }
3633
3636
3637 if (is_wow64)
3639
3640 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_ALL_ACCESS, &uninstall);
3641 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3642
3643 if (is_64bit)
3644 {
3645 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey_32node, 0, KEY_ALL_ACCESS, &uninstall_32node);
3646 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3647 }
3648
3649 CreateDirectoryA("msitest", NULL);
3650 create_file("msitest\\maximus", 500);
3651
3653
3655
3656 state = MsiQueryProductStateA(prodcode);
3657 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3658
3659 state = MsiQueryFeatureStateA(prodcode, "feature");
3660 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3661
3662 state = 0xdead;
3663 SetLastError(0xdeadbeef);
3665 error = GetLastError();
3666 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3667 ok(state == 0xdead, "got %d\n", state);
3668 ok(error == 0xdeadbeef, "got %lu\n", error);
3669
3670 state = 0xdead;
3671 SetLastError(0xdeadbeef);
3673 error = GetLastError();
3674 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3675 ok(state == 0xdead, "got %d\n", state);
3676 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3677
3678 state = 0xdead;
3679 SetLastError(0xdeadbeef);
3681 error = GetLastError();
3682 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3683 ok(state == 0xdead, "got %d\n", state);
3684 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3685
3686 state = MsiQueryFeatureStateA(prodcode, "feature");
3687 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3688
3689 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3690 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3691
3693 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3694 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3695 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3696
3697 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3698 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3699
3700 /* nothing published */
3703 {
3704 skip("Not enough rights to perform tests\n");
3705 goto error;
3706 }
3707 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
3708 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3709 ok(pf_exists("msitest"), "File not installed\n");
3710
3711 state = MsiQueryProductStateA(prodcode);
3712 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3713
3714 state = MsiQueryFeatureStateA(prodcode, "feature");
3715 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3716
3717 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3718 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3719
3721 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3722 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3723 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3724
3725 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3726 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3727
3728 /* PublishProduct and RegisterProduct */
3729 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1");
3730 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3731 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3732 ok(pf_exists("msitest"), "File not installed\n");
3733
3734 state = MsiQueryProductStateA(prodcode);
3735 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3736
3737 state = MsiQueryFeatureStateA(prodcode, "feature");
3738 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3739
3740 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3741 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3742
3744 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3745 ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
3746 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3747
3748 if (is_64bit)
3749 {
3750 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3751 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3752 }
3753 else
3754 {
3755 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3756 if (is_wow64 && res == ERROR_FILE_NOT_FOUND) /* XP - Vista, Wow64 */
3757 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3758 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3759 }
3760
3761 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3762 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3763 CHECK_REG_STR(prodkey, "InstallDate", date);
3764 CHECK_REG_STR(prodkey, "InstallSource", temp);
3765 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3766 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3767 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3768 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
3769 CHECK_REG_STR(prodkey, "Comments", "");
3770 CHECK_REG_STR(prodkey, "Contact", "");
3771 CHECK_REG_STR(prodkey, "HelpLink", "");
3772 CHECK_REG_STR(prodkey, "HelpTelephone", "");
3773 CHECK_REG_STR(prodkey, "InstallLocation", "");
3774 CHECK_REG_DWORD(prodkey, "NoModify", 1);
3775 CHECK_REG_STR(prodkey, "Readme", "");
3776 CHECK_REG_STR(prodkey, "Size", "");
3777 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
3778 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
3779 CHECK_REG_DWORD(prodkey, "Language", 1033);
3780 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3781 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3782 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3783 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3784 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
3785
3786 RegCloseKey(prodkey);
3787
3788 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
3789 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3790 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3791 ok(pf_exists("msitest"), "File deleted\n");
3792
3793 state = MsiQueryProductStateA(prodcode);
3794 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3795
3796 state = MsiQueryFeatureStateA(prodcode, "feature");
3797 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3798
3799 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3800 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3801
3803 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3804 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3805 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3806
3807 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3808 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3809
3810 /* complete install */
3811 r = MsiInstallProductA(msifile, "FULL=1");
3812 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3813 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3814 ok(pf_exists("msitest"), "File not installed\n");
3815
3816 state = MsiQueryProductStateA(prodcode);
3817 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3818
3819 state = MsiQueryFeatureStateA(prodcode, "feature");
3820 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3821
3822 state = 0xdead;
3823 SetLastError(0xdeadbeef);
3825 error = GetLastError();
3826 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3827 ok(state == 0xdead, "got %d\n", state);
3828 ok(error == 0xdeadbeef, "got %lu\n", error);
3829
3830 state = 0xdead;
3831 SetLastError(0xdeadbeef);
3833 error = GetLastError();
3834 ok(r == ERROR_UNKNOWN_PRODUCT, "got %u\n", r);
3835 ok(state == 0xdead, "got %d\n", state);
3836 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3837
3838 state = 0xdead;
3839 SetLastError(0xdeadbeef);
3841 error = GetLastError();
3842 ok(r == ERROR_SUCCESS, "got %u\n", r);
3843 ok(state == INSTALLSTATE_LOCAL, "got %d\n", state);
3844 ok(error == ERROR_SUCCESS, "got %lu\n", error);
3845
3846 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3847 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3848
3850 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3851 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3852 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3853
3854 if (is_64bit)
3855 {
3856 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3857 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3858 }
3859 else
3860 {
3861 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3862 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3863 }
3864
3865 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3866 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3867 CHECK_REG_STR(prodkey, "InstallDate", date);
3868 CHECK_REG_STR(prodkey, "InstallSource", temp);
3869 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3870 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3871 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3872 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
3873 CHECK_REG_STR(prodkey, "Comments", "");
3874 CHECK_REG_STR(prodkey, "Contact", "");
3875 CHECK_REG_STR(prodkey, "HelpLink", "");
3876 CHECK_REG_STR(prodkey, "HelpTelephone", "");
3877 CHECK_REG_STR(prodkey, "InstallLocation", "");
3878 CHECK_REG_DWORD(prodkey, "NoModify", 1);
3879 CHECK_REG_STR(prodkey, "Readme", "");
3880 CHECK_REG_STR(prodkey, "Size", "");
3881 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
3882 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
3883 CHECK_REG_DWORD(prodkey, "Language", 1033);
3884 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3885 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3886 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3887 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3888 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
3889
3890 RegCloseKey(prodkey);
3891
3892 /* no UnpublishFeatures */
3893 r = MsiInstallProductA(msifile, "REMOVE=ALL");
3894 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3895 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
3896 ok(!pf_exists("msitest"), "Directory not deleted\n");
3897
3898 state = MsiQueryProductStateA(prodcode);
3899 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3900
3901 state = MsiQueryFeatureStateA(prodcode, "feature");
3902 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3903
3904 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3905 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3906
3908 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3909 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
3910 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
3911
3912 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
3913 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3914
3915 /* complete install */
3916 r = MsiInstallProductA(msifile, "FULL=1");
3917 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3918 ok(pf_exists("msitest\\maximus"), "File not installed\n");
3919 ok(pf_exists("msitest"), "File not installed\n");
3920
3921 state = MsiQueryProductStateA(prodcode);
3922 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3923
3924 state = MsiQueryFeatureStateA(prodcode, "feature");
3925 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3926
3927 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3928 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3929
3931 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3932 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3933 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3934
3935 if (is_64bit)
3936 {
3937 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3938 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3939 }
3940 else
3941 {
3942 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3943 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3944 }
3945
3946 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
3947 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
3948 CHECK_REG_STR(prodkey, "InstallDate", date);
3949 CHECK_REG_STR(prodkey, "InstallSource", temp);
3950 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3951 CHECK_REG_STR(prodkey, "Publisher", "Wine");
3952 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
3953 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
3954 CHECK_REG_STR(prodkey, "Comments", "");
3955 CHECK_REG_STR(prodkey, "Contact", "");
3956 CHECK_REG_STR(prodkey, "HelpLink", "");
3957 CHECK_REG_STR(prodkey, "HelpTelephone", "");
3958 CHECK_REG_STR(prodkey, "InstallLocation", "");
3959 CHECK_REG_DWORD(prodkey, "NoModify", 1);
3960 CHECK_REG_STR(prodkey, "Readme", "");
3961 CHECK_REG_STR(prodkey, "Size", "");
3962 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
3963 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
3964 CHECK_REG_DWORD(prodkey, "Language", 1033);
3965 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
3966 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
3967 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
3968 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
3969 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
3970
3971 RegCloseKey(prodkey);
3972
3973 /* UnpublishFeatures, only feature removed. Only works when entire product is removed */
3974 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
3975 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3976 ok(pf_exists("msitest\\maximus"), "File deleted\n");
3977 ok(pf_exists("msitest"), "Directory deleted\n");
3978
3979 state = MsiQueryProductStateA(prodcode);
3980 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
3981
3982 state = MsiQueryFeatureStateA(prodcode, "feature");
3983 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3984
3985 state = MsiQueryFeatureStateA(prodcode, "montecristo");
3986 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3987
3989 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
3990 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3991 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
3992
3993 if (is_64bit)
3994 {
3995 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
3996 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3997 }
3998 else
3999 {
4000 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
4001 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4002 }
4003
4004 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
4005 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
4006 CHECK_REG_STR(prodkey, "InstallDate", date);
4007 CHECK_REG_STR(prodkey, "InstallSource", temp);
4008 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4009 CHECK_REG_STR(prodkey, "Publisher", "Wine");
4010 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4011 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
4012 CHECK_REG_STR(prodkey, "Comments", "");
4013 CHECK_REG_STR(prodkey, "Contact", "");
4014 CHECK_REG_STR(prodkey, "HelpLink", "");
4015 CHECK_REG_STR(prodkey, "HelpTelephone", "");
4016 CHECK_REG_STR(prodkey, "InstallLocation", "");
4017 CHECK_REG_DWORD(prodkey, "NoModify", 1);
4018 CHECK_REG_STR(prodkey, "Readme", "");
4019 CHECK_REG_STR(prodkey, "Size", "");
4020 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
4021 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
4022 CHECK_REG_DWORD(prodkey, "Language", 1033);
4023 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
4024 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
4025 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
4026 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
4027 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
4028
4029 RegCloseKey(prodkey);
4030
4031 /* complete install */
4032 r = MsiInstallProductA(msifile, "FULL=1");
4033 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4034 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4035 ok(pf_exists("msitest"), "File not installed\n");
4036
4037 state = MsiQueryProductStateA(prodcode);
4038 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
4039
4040 state = MsiQueryFeatureStateA(prodcode, "feature");
4041 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4042
4043 state = MsiQueryFeatureStateA(prodcode, "montecristo");
4044 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4045
4047 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
4048 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4049 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4050
4051 if (is_64bit)
4052 {
4053 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
4054 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4055 }
4056 else
4057 {
4058 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
4059 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4060 }
4061
4062 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
4063 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
4064 CHECK_REG_STR(prodkey, "InstallDate", date);
4065 CHECK_REG_STR(prodkey, "InstallSource", temp);
4066 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4067 CHECK_REG_STR(prodkey, "Publisher", "Wine");
4068 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4069 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
4070 CHECK_REG_STR(prodkey, "Comments", "");
4071 CHECK_REG_STR(prodkey, "Contact", "");
4072 CHECK_REG_STR(prodkey, "HelpLink", "");
4073 CHECK_REG_STR(prodkey, "HelpTelephone", "");
4074 CHECK_REG_STR(prodkey, "InstallLocation", "");
4075 CHECK_REG_DWORD(prodkey, "NoModify", 1);
4076 CHECK_REG_STR(prodkey, "Readme", "");
4077 CHECK_REG_STR(prodkey, "Size", "");
4078 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
4079 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
4080 CHECK_REG_DWORD(prodkey, "Language", 1033);
4081 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
4082 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
4083 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
4084 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
4085 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
4086
4087 RegCloseKey(prodkey);
4088
4089 /* UnpublishFeatures, both features removed */
4090 r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
4091 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4092 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
4093 ok(!pf_exists("msitest"), "Directory not deleted\n");
4094
4095 state = MsiQueryProductStateA(prodcode);
4096 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4097
4098 state = MsiQueryFeatureStateA(prodcode, "feature");
4099 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4100
4101 state = MsiQueryFeatureStateA(prodcode, "montecristo");
4102 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4103
4105 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
4106 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4107 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4108
4109 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
4110 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4111
4112 /* complete install */
4113 r = MsiInstallProductA(msifile, "FULL=1");
4114 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4115 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4116 ok(pf_exists("msitest"), "File not installed\n");
4117
4118 state = MsiQueryProductStateA(prodcode);
4119 ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
4120
4121 state = MsiQueryFeatureStateA(prodcode, "feature");
4122 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4123
4124 state = MsiQueryFeatureStateA(prodcode, "montecristo");
4125 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4126
4128 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
4129 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4130 ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
4131
4132 if (is_64bit)
4133 {
4134 res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
4135 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4136 }
4137 else
4138 {
4139 res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey);
4140 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4141 }
4142
4143 CHECK_REG_STR(prodkey, "DisplayName", "MSITEST");
4144 CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1");
4145
4146 get_date_str(date2);
4147 size = ARRAY_SIZE(buf);
4148 buf[0] = '\0';
4149 res = RegQueryValueExA(prodkey, "InstallDate", NULL, &type, (BYTE *)buf, &size);
4150 ok(!res, "Failed to query value, error %ld\n", res);
4151 ok(type == REG_SZ, "Got wrong type %lu\n", type);
4152 ok(!strcmp(buf, date) || !strcmp(buf, date2), "got %s\n", debugstr_a(buf));
4153
4154 CHECK_REG_STR(prodkey, "InstallSource", temp);
4155 CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4156 CHECK_REG_STR(prodkey, "Publisher", "Wine");
4157 CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
4158 CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", "");
4159 CHECK_REG_STR(prodkey, "Comments", "");
4160 CHECK_REG_STR(prodkey, "Contact", "");
4161 CHECK_REG_STR(prodkey, "HelpLink", "");
4162 CHECK_REG_STR(prodkey, "HelpTelephone", "");
4163 CHECK_REG_STR(prodkey, "InstallLocation", "");
4164 CHECK_REG_DWORD(prodkey, "NoModify", 1);
4165 CHECK_REG_STR(prodkey, "Readme", "");
4166 CHECK_REG_STR(prodkey, "Size", "");
4167 CHECK_REG_STR(prodkey, "URLInfoAbout", "");
4168 CHECK_REG_STR(prodkey, "URLUpdateInfo", "");
4169 CHECK_REG_DWORD(prodkey, "Language", 1033);
4170 CHECK_REG_DWORD(prodkey, "Version", 0x1010001);
4171 CHECK_REG_DWORD(prodkey, "VersionMajor", 1);
4172 CHECK_REG_DWORD(prodkey, "VersionMinor", 1);
4173 CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1);
4174 CHECK_REG_DWORD_TODO(prodkey, "EstimatedSize", get_estimated_size());
4175
4176 RegCloseKey(prodkey);
4177
4178 /* complete uninstall */
4179 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
4180 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4181 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
4182 ok(!pf_exists("msitest"), "Directory not deleted\n");
4183
4184 state = MsiQueryProductStateA(prodcode);
4185 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4186
4187 state = MsiQueryFeatureStateA(prodcode, "feature");
4188 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4189
4190 state = MsiQueryFeatureStateA(prodcode, "montecristo");
4191 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4192
4194 "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state);
4195 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4196 ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
4197
4198 res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey);
4199 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
4200
4201 /* make sure 'Program Files\msitest' is removed */
4203
4204error:
4205 RegCloseKey(uninstall);
4206 RegCloseKey(uninstall_32node);
4208 DeleteFileA("msitest\\maximus");
4209 RemoveDirectoryA("msitest");
4210}
static int state
Definition: maze.c:121
#define SetLastError(x)
Definition: compat.h:752
INSTALLSTATE WINAPI MsiQueryProductStateA(LPCSTR szProduct)
Definition: msi.c:2207
UINT WINAPI MsiQueryComponentStateA(LPCSTR szProductCode, LPCSTR szUserSid, MSIINSTALLCONTEXT dwContext, LPCSTR szComponent, INSTALLSTATE *pdwState)
Definition: msi.c:2055
UINT WINAPI MsiQueryFeatureStateExA(LPCSTR product, LPCSTR usersid, MSIINSTALLCONTEXT ctx, LPCSTR feature, INSTALLSTATE *state)
Definition: msi.c:2987
INSTALLSTATE WINAPI MsiQueryFeatureStateA(LPCSTR szProduct, LPCSTR szFeature)
Definition: msi.c:3023
#define CHECK_REG_DWORD_TODO(prodkey, name, expected)
Definition: action.c:2526
#define CHECK_REG_ISTR(prodkey, name, expected)
Definition: action.c:2505
#define CHECK_REG_DWORD(prodkey, name, expected)
Definition: action.c:2523
static const msi_table pp_tables[]
Definition: action.c:1983
static DWORD get_estimated_size(void)
Definition: action.c:2551
static void delete_pfmsitest_files(void)
Definition: action.c:2415
static void get_date_str(LPSTR date)
Definition: action.c:2541
@ INSTALLSTATE_UNKNOWN
Definition: msi.h:42
@ INSTALLSTATE_LOCAL
Definition: msi.h:46
@ INSTALLSTATE_DEFAULT
Definition: msi.h:48
@ MSIINSTALLCONTEXT_MACHINE
Definition: msi.h:200
@ MSIINSTALLCONTEXT_USERUNMANAGED
Definition: msi.h:199
@ MSIINSTALLCONTEXT_USERMANAGED
Definition: msi.h:198
static const BOOL is_64bit
Definition: msipriv.h:44
static calc_node_t temp
Definition: rpn_ieee.c:38
int INSTALLSTATE
Definition: winemsi.idl:31
#define ERROR_UNKNOWN_PRODUCT
Definition: winerror.h:963
#define ERROR_UNKNOWN_COMPONENT
Definition: winerror.h:965

Referenced by START_TEST().

◆ test_publish_assemblies()

static void test_publish_assemblies ( void  )
static

Definition at line 6200 of file action.c.

6201{
6202 static const char manifest[] =
6203 "<assemblyIdentity type=\"win32\" name=\"Wine.Win32.Assembly\" "
6204 "version=\"1.0.0.0\" publicKeyToken=\"abcdef0123456789\" "
6205 "processorArchitecture=\"x86\"/>";
6206 static const char manifest_local[] =
6207 "<assemblyIdentity type=\"win32\" name=\"Wine.Win32.Local.Assembly\" "
6208 "version=\"1.0.0.0\" publicKeyToken=\"abcdef0123456789\" "
6209 "processorArchitecture=\"x86\"/>";
6210 static const char classes_path_dotnet[] =
6211 "Installer\\Assemblies\\Global";
6212 static const char classes_path_dotnet_local[] =
6213 "Installer\\Assemblies\\C:|Program Files|msitest|application_dotnet.txt";
6214 static const char classes_path_dotnet_local_wow64[] =
6215 "Installer\\Assemblies\\C:|Program Files (x86)|msitest|application_dotnet.txt";
6216 static const char classes_path_fake_local[] =
6217 "Installer\\Assemblies\\C:|Program Files|msitest|nonexistent.txt";
6218 static const char classes_path_fake_local_wow64[] =
6219 "Installer\\Assemblies\\C:|Program Files (x86)|msitest|nonexistent.txt";
6220 static const char classes_path_win32[] =
6221 "Installer\\Win32Assemblies\\Global";
6222 static const char classes_path_win32_local[] =
6223 "Installer\\Win32Assemblies\\C:|Program Files|msitest|application_win32.txt";
6224 static const char classes_path_win32_local_wow64[] =
6225 "Installer\\Win32Assemblies\\C:|Program Files (x86)|msitest|application_win32.txt";
6226 static const char path_dotnet[] =
6227 "Software\\Microsoft\\Installer\\Assemblies\\Global";
6228 static const char path_dotnet_local[] =
6229 "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files|msitest|application_dotnet.txt";
6230 static const char path_dotnet_local_wow64[] =
6231 "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files (x86)|msitest|application_dotnet.txt";
6232 static const char path_fake_local[] =
6233 "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files|msitest|nonexistent.txt";
6234 static const char path_fake_local_wow64[] =
6235 "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files (x86)|msitest|nonexistent.txt";
6236 static const char path_win32[] =
6237 "Software\\Microsoft\\Installer\\Win32Assemblies\\Global";
6238 static const char path_win32_local[] =
6239 "Software\\Microsoft\\Installer\\Win32Assemblies\\C:|Program Files|msitest|application_win32.txt";
6240 static const char path_win32_local_wow64[] =
6241 "Software\\Microsoft\\Installer\\Win32Assemblies\\C:|Program Files (x86)|msitest|application_win32.txt";
6242 static const char name_dotnet[] =
6243 "Wine.Dotnet.Assembly,processorArchitecture=\"MSIL\",publicKeyToken=\"abcdef0123456789\","
6244 "version=\"1.0.0.0\",culture=\"neutral\"";
6245 static const char name_dotnet_local[] =
6246 "Wine.Dotnet.Local.Assembly,processorArchitecture=\"MSIL\",publicKeyToken=\"abcdef0123456789\","
6247 "version=\"1.0.0.0\",culture=\"neutral\"";
6248 static const char name_win32[] =
6249 "Wine.Win32.Assembly,processorArchitecture=\"x86\",publicKeyToken=\"abcdef0123456789\","
6250 "type=\"win32\",version=\"1.0.0.0\"";
6251 static const char name_win32_local[] =
6252 "Wine.Win32.Local.Assembly,processorArchitecture=\"x86\",publicKeyToken=\"abcdef0123456789\","
6253 "type=\"win32\",version=\"1.0.0.0\"";
6254 UINT r;
6255 LONG res;
6256 HKEY hkey;
6257 const char *path;
6258 int access;
6259
6260 if (!is_process_elevated())
6261 {
6262 skip("process is limited\n");
6263 return;
6264 }
6265
6267 create_file("msitest\\win32.txt", 1000);
6268 create_file("msitest\\win32_local.txt", 1000);
6269 create_file("msitest\\dotnet.txt", 1000);
6270 create_file("msitest\\dotnet_local.txt", 1000);
6271 create_file_data("msitest\\manifest.txt", manifest, 0);
6272 create_file_data("msitest\\manifest_local.txt", manifest_local, 0);
6273 create_file("msitest\\application_win32.txt", 1000);
6274 create_file("msitest\\application_dotnet.txt", 1000);
6275 create_file("msitest\\fake_local.txt", 1000);
6277
6279
6282 {
6283 skip("Not enough rights to perform tests\n");
6284 goto done;
6285 }
6286 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6287
6289 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6290 CHECK_REG_MULTI(hkey, name_dotnet, "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]\0");
6291 RegCloseKey(hkey);
6292
6293 path = (is_wow64 || is_64bit) ? path_dotnet_local_wow64 : path_dotnet_local;
6295 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6296 CHECK_REG_MULTI(hkey, name_dotnet_local, "rcHQPHq?CA@Uv-XqMI1e>LF,8A?0d.AW@vcZ$Cgox\0");
6297 RegCloseKey(hkey);
6298
6299 res = RegOpenKeyA(HKEY_CURRENT_USER, path_win32, &hkey);
6300 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6301 CHECK_REG_MULTI(hkey, name_win32, "rcHQPHq?CA@Uv-XqMI1e>}NJjwR'%D9v1p!v{WV(%\0");
6302 RegCloseKey(hkey);
6303
6304 path = (is_wow64 || is_64bit) ? path_win32_local_wow64 : path_win32_local;
6306 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6307 CHECK_REG_MULTI(hkey, name_win32_local, "rcHQPHq?CA@Uv-XqMI1e>C)Uvlj*53A)u(QQ9=)X!\0");
6308 RegCloseKey(hkey);
6309
6310 /* No registration is done for a local assembly with no matching file */
6311 path = (is_wow64 || is_64bit) ? path_fake_local_wow64 : path_fake_local;
6313 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
6314
6315 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6316 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6317
6319 if (res == ERROR_SUCCESS)
6320 {
6322 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6323 RegCloseKey(hkey);
6324 }
6325
6326 path = (is_wow64 || is_64bit) ? path_dotnet_local_wow64 : path_dotnet_local;
6328 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6329
6330 res = RegOpenKeyA(HKEY_CURRENT_USER, path_win32, &hkey);
6331 if (res == ERROR_SUCCESS)
6332 {
6333 res = RegDeleteValueA(hkey, name_win32);
6334 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6335 RegCloseKey(hkey);
6336 }
6337
6338 path = (is_wow64 || is_64bit) ? path_win32_local_wow64 : path_win32_local;
6340 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6341
6342 r = MsiInstallProductA(msifile, "ALLUSERS=1");
6343 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6344
6346 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_dotnet, 0, access, &hkey);
6347 if (res == ERROR_FILE_NOT_FOUND && is_wow64) /* Vista WOW64 */
6348 {
6349 trace("Using 64-bit registry view for HKCR\\Installer\n");
6351 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_dotnet, 0, access, &hkey);
6352 }
6353 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6354 CHECK_REG_MULTI(hkey, name_dotnet, "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]\0");
6355 RegCloseKey(hkey);
6356
6357 path = (is_wow64 || is_64bit) ? classes_path_dotnet_local_wow64 : classes_path_dotnet_local;
6359 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6360 CHECK_REG_MULTI(hkey, name_dotnet_local, "rcHQPHq?CA@Uv-XqMI1e>LF,8A?0d.AW@vcZ$Cgox\0");
6361 RegCloseKey(hkey);
6362
6363 res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_win32, 0, access, &hkey);
6364 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6365 CHECK_REG_MULTI(hkey, name_win32, "rcHQPHq?CA@Uv-XqMI1e>}NJjwR'%D9v1p!v{WV(%\0");
6366 RegCloseKey(hkey);
6367
6368 path = (is_wow64 || is_64bit) ? classes_path_win32_local_wow64 : classes_path_win32_local;
6370 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
6371 CHECK_REG_MULTI(hkey, name_win32_local, "rcHQPHq?CA@Uv-XqMI1e>C)Uvlj*53A)u(QQ9=)X!\0");
6372 RegCloseKey(hkey);
6373
6374 /* No registration is done for a local assembly with no matching file */
6375 path = (is_wow64 || is_64bit) ? classes_path_fake_local_wow64 : classes_path_fake_local;
6377 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
6378
6379 r = MsiInstallProductA(msifile, "REMOVE=ALL ALLUSERS=1");
6380 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6381
6382 res = RegOpenKeyA(HKEY_CLASSES_ROOT, classes_path_dotnet, &hkey);
6383 if (res == ERROR_SUCCESS)
6384 {
6386 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6387 RegCloseKey(hkey);
6388 }
6389
6390 path = (is_wow64 || is_64bit) ? classes_path_dotnet_local_wow64 : classes_path_dotnet_local;
6392 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6393
6394 res = RegOpenKeyA(HKEY_CLASSES_ROOT, classes_path_win32, &hkey);
6395 if (res == ERROR_SUCCESS)
6396 {
6397 res = RegDeleteValueA(hkey, name_win32);
6398 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6399 RegCloseKey(hkey);
6400 }
6401
6402 path = (is_wow64 || is_64bit) ? classes_path_win32_local_wow64 : classes_path_win32_local;
6404 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
6405
6406done:
6407 DeleteFileA("msitest\\win32.txt");
6408 DeleteFileA("msitest\\win32_local.txt");
6409 DeleteFileA("msitest\\dotnet.txt");
6410 DeleteFileA("msitest\\dotnet_local.txt");
6411 DeleteFileA("msitest\\manifest.txt");
6412 DeleteFileA("msitest\\manifest_local.txt");
6413 DeleteFileA("msitest\\application_win32.txt");
6414 DeleteFileA("msitest\\application_dotnet.txt");
6415 DeleteFileA("msitest\\fake_local.txt");
6418}
static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
Definition: asmcache.c:795
#define CHECK_REG_MULTI(key, name, expect)
Definition: action.c:2514
static const msi_table pa_tables[]
Definition: action.c:2327
static const char name_dotnet[]
Definition: custom.c:1643
static const char path_dotnet[]
Definition: custom.c:1642
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
static const CHAR manifest[]
Definition: v6util.h:41
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by START_TEST().

◆ test_publish_components()

static void test_publish_components ( void  )
static

Definition at line 5669 of file action.c.

5670{
5671 static const char keypath[] =
5672 "Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
5673 static const char keypath2[] =
5674 "Software\\Classes\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
5675
5676 UINT r;
5677 LONG res;
5678 HKEY key;
5679 BYTE *data;
5680 DWORD size;
5681
5682 if (!is_process_elevated())
5683 {
5684 skip("process is limited\n");
5685 return;
5686 }
5687
5689 create_file("msitest\\english.txt", 1000);
5691
5693
5696 {
5697 skip("Not enough rights to perform tests\n");
5698 goto error;
5699 }
5700 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5701
5702 size = 0;
5703 r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
5704 "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
5705 ok(r == ERROR_SUCCESS, "MsiProvideQualifiedComponent returned %d\n", r);
5706
5707 res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key);
5708 ok(res == ERROR_SUCCESS, "components key not created %ld\n", res);
5709
5710 res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, &size);
5711 ok(res == ERROR_SUCCESS, "value not found %ld\n", res);
5712
5713 data = malloc(size);
5714 res = RegQueryValueExA(key, "english.txt", NULL, NULL, data, &size);
5715 ok(res == ERROR_SUCCESS, "value not found %ld\n", res);
5717
5719 ok(res == ERROR_SUCCESS, "RegDeleteKey failed %ld\n", res);
5720
5723 ok(res == ERROR_SUCCESS, "RegCreateKeyEx failed %ld\n", res);
5724 res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
5725 ok(res == ERROR_SUCCESS, "RegSetValueEx failed %ld\n", res);
5727
5728 size = 0;
5729 r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
5730 "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
5731 ok(r == ERROR_SUCCESS, "MsiProvideQualifiedComponent returned %d\n", r);
5732
5734 ok(res == ERROR_SUCCESS, "RegDeleteKey failed %ld\n", res);
5735
5736 res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key);
5737 ok(res == ERROR_SUCCESS, "RegCreateKey failed %ld\n", res);
5738
5739 res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
5740 ok(res == ERROR_SUCCESS, "RegSetValueEx failed %ld\n", res);
5741 free(data);
5743
5744 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5745 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5746
5747 res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key);
5748 ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %ld\n", res);
5749
5750 ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n");
5751 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5752
5753error:
5754 DeleteFileA("msitest\\english.txt");
5757}
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1179
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
UINT WINAPI MsiProvideQualifiedComponentA(LPCSTR szComponent, LPCSTR szQualifier, DWORD dwInstallMode, LPSTR lpPathBuf, LPDWORD pcchPathBuf)
Definition: msi.c:3496
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static const msi_table pub_tables[]
Definition: action.c:2205
@ INSTALLMODE_DEFAULT
Definition: msi.h:166
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83

Referenced by START_TEST().

◆ test_publish_features()

static void test_publish_features ( void  )
static

Definition at line 3195 of file action.c.

3196{
3197 static const char cupath[] =
3198 "Software\\Microsoft\\Installer\\Features\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3199 static const char udfeatpath[] =
3200 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
3201 "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features";
3202 static const char udpridpath[] =
3203 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
3204 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3205 static const char featkey[] =
3206 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Features";
3207 static const char classfeat[] =
3208 "Software\\Classes\\Installer\\Features\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3209 UINT r;
3210 LONG res;
3211 HKEY hkey;
3212 LPSTR usersid;
3213 CHAR keypath[MAX_PATH];
3215
3216 if (!is_process_elevated())
3217 {
3218 skip("process is limited\n");
3219 return;
3220 }
3221
3222 if (!(usersid = get_user_sid()))
3223 return;
3224
3225 CreateDirectoryA("msitest", NULL);
3226 create_file("msitest\\maximus", 500);
3227
3229
3230 if (is_wow64)
3232
3234
3235 /* PublishFeatures, current user */
3236 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
3238 {
3239 skip("Not enough rights to perform tests\n");
3240 goto error;
3241 }
3242 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3243 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3244 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3245
3246 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey);
3247 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3248
3249 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey);
3250 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3251
3252 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
3253 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3254
3255 CHECK_REG_STR(hkey, "feature", "");
3256 CHECK_REG_STR(hkey, "montecristo", "");
3257
3258 RegDeleteValueA(hkey, "feature");
3259 RegDeleteValueA(hkey, "montecristo");
3260 RegDeleteKeyExA(hkey, "", access, 0);
3261 RegCloseKey(hkey);
3262
3263 sprintf(keypath, udfeatpath, usersid);
3264 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3265 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3266
3267 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
3268 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
3269
3270 RegDeleteValueA(hkey, "feature");
3271 RegDeleteValueA(hkey, "montecristo");
3272 RegDeleteKeyExA(hkey, "", access, 0);
3273 RegCloseKey(hkey);
3274 sprintf(keypath, udpridpath, usersid);
3276
3277 /* PublishFeatures, machine */
3278 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1");
3279 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3280 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3281 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3282
3283 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey);
3284 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3285
3286 res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey);
3287 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3288 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey);
3289 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3290
3291 CHECK_REG_STR(hkey, "feature", "");
3292 CHECK_REG_STR(hkey, "montecristo", "");
3293
3294 RegDeleteValueA(hkey, "feature");
3295 RegDeleteValueA(hkey, "montecristo");
3296 RegDeleteKeyExA(hkey, "", access, 0);
3297 RegCloseKey(hkey);
3298
3299 sprintf(keypath, udfeatpath, "S-1-5-18");
3300 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3301 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3302
3303 CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE");
3304 CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE");
3305
3306 RegDeleteValueA(hkey, "feature");
3307 RegDeleteValueA(hkey, "montecristo");
3308 RegDeleteKeyExA(hkey, "", access, 0);
3309 RegCloseKey(hkey);
3310 sprintf(keypath, udpridpath, "S-1-5-18");
3312
3313error:
3315 DeleteFileA("msitest\\maximus");
3316 RemoveDirectoryA("msitest");
3317 LocalFree(usersid);
3318}
@ INSTALLUILEVEL_FULL
Definition: msi.h:69

Referenced by START_TEST().

◆ test_publish_product()

static void test_publish_product ( void  )
static

Definition at line 2958 of file action.c.

2959{
2960 static const char prodpath[] =
2961 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products"
2962 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2963 static const char cuprodpath[] =
2964 "Software\\Microsoft\\Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2965 static const char cuupgrades[] =
2966 "Software\\Microsoft\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2967 static const char badprod[] =
2968 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products"
2969 "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2970 static const char machprod[] =
2971 "Software\\Classes\\Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2972 static const char machup[] =
2973 "Software\\Classes\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2974 UINT r;
2975 LONG res;
2976 LPSTR usersid;
2977 HKEY sourcelist, net, props;
2978 HKEY hkey, patches, media;
2979 CHAR keypath[MAX_PATH];
2982 BOOL old_installer = FALSE;
2984
2985 if (!is_process_elevated())
2986 {
2987 skip("process is limited\n");
2988 return;
2989 }
2990
2991 if (!(usersid = get_user_sid()))
2992 return;
2993
2995
2996 CreateDirectoryA("msitest", NULL);
2997 create_file("msitest\\maximus", 500);
2998
3000
3001 if (is_wow64)
3003
3005
3006 /* PublishProduct, current user */
3007 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
3009 {
3010 skip("Not enough rights to perform tests\n");
3011 goto error;
3012 }
3013 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3014 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3015 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3016
3017 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey);
3018 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3019
3020 sprintf(keypath, prodpath, usersid);
3021 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3023 {
3024 res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey);
3025 if (res == ERROR_SUCCESS)
3026 {
3027 win_skip("Windows Installer < 3.0 detected\n");
3028 RegCloseKey(hkey);
3029 old_installer = TRUE;
3030 goto currentuser;
3031 }
3032 else
3033 {
3034 win_skip("Install failed, no need to continue\n");
3035 return;
3036 }
3037 }
3038 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3039
3040 res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props);
3041 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3042
3043 res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches);
3044 todo_wine ok(!res, "Expected ERROR_SUCCESS, got %ld\n", res);
3045 if (!res)
3046 CHECK_DEL_REG_STR(patches, "AllPatches", "");
3047
3048 RegDeleteKeyExA(patches, "", access, 0);
3049 RegCloseKey(patches);
3050 RegDeleteKeyExA(hkey, "", access, 0);
3051 RegCloseKey(hkey);
3052
3053currentuser:
3054 res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey);
3055 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3056
3057 CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST");
3058 CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052C94DA02821EECD05F2F");
3059 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
3060 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
3061 if (!old_installer)
3062 CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0);
3063 CHECK_DEL_REG_DWORD(hkey, "Assignment", 0);
3064 CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184);
3065 CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0);
3066 CHECK_DEL_REG_MULTI(hkey, "Clients", ":\0");
3067
3068 res = RegOpenKeyA(hkey, "SourceList", &sourcelist);
3069 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3070
3071 lstrcpyA(path, "n;1;");
3072 lstrcatA(path, temp);
3073 CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path);
3074 CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi");
3075
3076 res = RegOpenKeyA(sourcelist, "Net", &net);
3077 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3078
3079 CHECK_DEL_REG_STR(net, "1", temp);
3080
3081 RegDeleteKeyA(net, "");
3083
3084 res = RegOpenKeyA(sourcelist, "Media", &media);
3085 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3086
3087 CHECK_DEL_REG_STR(media, "1", "DISK1;");
3088
3089 RegDeleteKeyA(media, "");
3091 RegDeleteKeyA(sourcelist, "");
3092 RegCloseKey(sourcelist);
3093 RegDeleteKeyA(hkey, "");
3094 RegCloseKey(hkey);
3095
3096 res = RegOpenKeyA(HKEY_CURRENT_USER, cuupgrades, &hkey);
3097 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3098
3099 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
3100
3101 RegDeleteKeyA(hkey, "");
3102 RegCloseKey(hkey);
3103
3104 /* PublishProduct, machine */
3105 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1");
3106 if (old_installer)
3107 goto machprod;
3108 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3109 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3110 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3111
3112 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey);
3113 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3114
3115 sprintf(keypath, prodpath, "S-1-5-18");
3116 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey);
3117 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3118
3119 res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props);
3120 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
3121
3122 res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches);
3123 todo_wine ok(!res, "Expected ERROR_SUCCESS, got %ld\n", res);
3124 if (!res)
3125 CHECK_DEL_REG_STR(patches, "AllPatches", "");
3126
3127 RegDeleteKeyExA(patches, "", access, 0);
3128 RegCloseKey(patches);
3129 RegDeleteKeyExA(hkey, "", access, 0);
3130 RegCloseKey(hkey);
3131
3132machprod:
3133 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machprod, 0, access, &hkey);
3134 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3135
3136 CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST");
3137 CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052C94DA02821EECD05F2F");
3138 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
3139 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
3140 if (!old_installer)
3141 CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0);
3142 CHECK_DEL_REG_DWORD_TODO(hkey, "Assignment", 1);
3143 CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184);
3144 CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0);
3145 CHECK_DEL_REG_MULTI(hkey, "Clients", ":\0");
3146
3147 res = RegOpenKeyExA(hkey, "SourceList", 0, access, &sourcelist);
3148 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3149
3150 lstrcpyA(path, "n;1;");
3151 lstrcatA(path, temp);
3152 CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path);
3153 CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi");
3154
3155 res = RegOpenKeyExA(sourcelist, "Net", 0, access, &net);
3156 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3157
3158 CHECK_DEL_REG_STR(net, "1", temp);
3159
3160 res = RegDeleteKeyExA(net, "", access, 0);
3161 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3163
3164 res = RegOpenKeyExA(sourcelist, "Media", 0, access, &media);
3165 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3166
3167 CHECK_DEL_REG_STR(media, "1", "DISK1;");
3168
3169 res = RegDeleteKeyExA(media, "", access, 0);
3170 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3172 res = RegDeleteKeyExA(sourcelist, "", access, 0);
3173 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3174 RegCloseKey(sourcelist);
3175 res = RegDeleteKeyExA(hkey, "", access, 0);
3176 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3177 RegCloseKey(hkey);
3178
3179 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machup, 0, access, &hkey);
3180 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3181
3182 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
3183
3184 res = RegDeleteKeyExA(hkey, "", access, 0);
3185 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3186 RegCloseKey(hkey);
3187
3188error:
3190 DeleteFileA("msitest\\maximus");
3191 RemoveDirectoryA("msitest");
3192 LocalFree(usersid);
3193}
__u8 media
Definition: mkdosfs.c:9
#define CHECK_DEL_REG_DWORD_TODO(prodkey, name, expected)
Definition: action.c:2535
#define CHECK_DEL_REG_MULTI(key, name, expect)
Definition: action.c:2517
#define CHECK_DEL_REG_DWORD(prodkey, name, expected)
Definition: action.c:2529
#define win_skip
Definition: test.h:163
static TNetwork net
Definition: tncon.cpp:351

Referenced by START_TEST().

◆ test_publish_sourcelist()

static void test_publish_sourcelist ( void  )
static

Definition at line 4212 of file action.c.

4213{
4214 UINT r;
4215 DWORD size;
4218 CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
4219
4220 if (!is_process_elevated())
4221 {
4222 skip("process is limited\n");
4223 return;
4224 }
4225
4226 CreateDirectoryA("msitest", NULL);
4227 create_file("msitest\\maximus", 500);
4228
4230
4232
4235 {
4236 skip("Not enough rights to perform tests\n");
4237 goto error;
4238 }
4239 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4240 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4241 ok(pf_exists("msitest"), "File not installed\n");
4242
4243 /* nothing published */
4244 size = MAX_PATH;
4245 lstrcpyA(value, "aaa");
4248 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4249 ok(size == MAX_PATH, "got %lu\n", size);
4250 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4251
4252 size = MAX_PATH;
4253 lstrcpyA(value, "aaa");
4256 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4257 ok(size == MAX_PATH, "got %lu\n", size);
4258 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4259
4260 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
4261 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4262 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4263 ok(pf_exists("msitest"), "File not installed\n");
4264
4265 /* after RegisterProduct */
4266 size = MAX_PATH;
4267 lstrcpyA(value, "aaa");
4270 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4271 ok(size == MAX_PATH, "got %lu\n", size);
4272 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4273
4274 size = MAX_PATH;
4275 lstrcpyA(value, "aaa");
4278 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4279 ok(size == MAX_PATH, "got %lu\n", size);
4280 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4281
4282 r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1");
4283 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4284 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4285 ok(pf_exists("msitest"), "File not installed\n");
4286
4287 /* after ProcessComponents */
4288 size = MAX_PATH;
4289 lstrcpyA(value, "aaa");
4292 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4293 ok(size == MAX_PATH, "got %lu\n", size);
4294 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4295
4296 size = MAX_PATH;
4297 lstrcpyA(value, "aaa");
4300 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4301 ok(size == MAX_PATH, "got %lu\n", size);
4302 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4303
4304 r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1");
4305 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4306 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4307 ok(pf_exists("msitest"), "File not installed\n");
4308
4309 /* after PublishFeatures */
4310 size = MAX_PATH;
4311 lstrcpyA(value, "aaa");
4314 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4315 ok(size == MAX_PATH, "got %lu\n", size);
4316 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4317
4318 size = MAX_PATH;
4319 lstrcpyA(value, "aaa");
4322 ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
4323 ok(size == MAX_PATH, "got %lu\n", size);
4324 ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
4325
4326 r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1");
4327 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4328 ok(pf_exists("msitest\\maximus"), "File not installed\n");
4329 ok(pf_exists("msitest"), "File not installed\n");
4330
4331 /* after PublishProduct */
4332 size = MAX_PATH;
4333 lstrcpyA(value, "aaa");
4336 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4337 ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value);
4338 ok(size == 11, "Expected 11, got %lu\n", size);
4339
4340 size = MAX_PATH;
4341 lstrcpyA(value, "aaa");
4344 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4345 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
4346 ok(size == 0, "Expected 0, got %lu\n", size);
4347
4348 size = MAX_PATH;
4349 lstrcpyA(value, "aaa");
4352 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4353 ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
4354 ok(size == 0, "Expected 0, got %lu\n", size);
4355
4357 lstrcatA(path, "\\");
4358
4359 size = MAX_PATH;
4360 lstrcpyA(value, "aaa");
4363 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4364 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
4365 ok(size == lstrlenA(path), "Expected %d, got %lu\n", lstrlenA(path), size);
4366
4367 size = MAX_PATH;
4368 lstrcpyA(value, "aaa");
4371 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4372 ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value);
4373 ok(size == 1, "Expected 1, got %lu\n", size);
4374
4375 size = MAX_PATH;
4376 lstrcpyA(value, "aaa");
4379 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
4380 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
4381 ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
4382
4383 size = MAX_PATH;
4384 lstrcpyA(value, "aaa");
4387 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4388 ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
4389 ok(size == lstrlenA(path), "Expected %d, got %lu\n", lstrlenA(path), size);
4390
4391 size = MAX_PATH;
4392 lstrcpyA(value, "aaa");
4395 ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
4396 ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value);
4397 ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
4398
4399 /* complete uninstall */
4400 r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
4401 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
4402 ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
4403 ok(!pf_exists("msitest"), "Directory not deleted\n");
4404
4405 /* make sure 'Program Files\msitest' is removed */
4407
4408error:
4410 DeleteFileA("msitest\\maximus");
4411 RemoveDirectoryA("msitest");
4412}
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
UINT WINAPI MsiSourceListEnumSourcesA(const char *szProductCodeOrPatch, const char *szUserSid, MSIINSTALLCONTEXT dwContext, DWORD dwOptions, DWORD dwIndex, char *szSource, DWORD *pcchSource)
Definition: source.c:329
UINT WINAPI MsiSourceListGetInfoA(LPCSTR szProduct, LPCSTR szUserSid, MSIINSTALLCONTEXT dwContext, DWORD dwOptions, LPCSTR szProperty, LPSTR szValue, LPDWORD pcchValue)
Definition: source.c:470
#define INSTALLPROPERTY_LASTUSEDTYPEA
Definition: msi.h:408
#define INSTALLPROPERTY_MEDIAPACKAGEPATHA
Definition: msi.h:412
#define INSTALLPROPERTY_LASTUSEDSOURCEA
Definition: msi.h:404
@ MSICODE_PRODUCT
Definition: msi.h:215
#define INSTALLPROPERTY_DISKPROMPTA
Definition: msi.h:416
@ MSISOURCETYPE_URL
Definition: msi.h:209
@ MSISOURCETYPE_NETWORK
Definition: msi.h:208
#define INSTALLPROPERTY_PACKAGENAMEA
Definition: msi.h:264
Definition: pdh_main.c:94

Referenced by START_TEST().

◆ test_register_class_info()

static void test_register_class_info ( void  )
static

Definition at line 5912 of file action.c.

5913{
5914 UINT r;
5915 LONG res;
5916 HKEY hkey;
5917
5918 if (!is_process_elevated())
5919 {
5920 skip("process is limited\n");
5921 return;
5922 }
5923
5925 create_file("msitest\\class.txt", 1000);
5927
5929
5932 {
5933 skip("Not enough rights to perform tests\n");
5934 goto error;
5935 }
5936 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5937
5938 if (is_64bit)
5939 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5940 else
5941 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5942 ok(res == ERROR_SUCCESS, "key not created\n");
5943 RegCloseKey(hkey);
5944
5945 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5946 ok(res == ERROR_SUCCESS, "key not created\n");
5947 RegCloseKey(hkey);
5948
5949 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey);
5950 ok(res == ERROR_SUCCESS, "key not created\n");
5951 RegCloseKey(hkey);
5952
5953 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5954 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5955
5956 if (is_64bit)
5957 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5958 else
5959 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5960 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
5961
5962 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
5963 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
5964
5965 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey);
5966 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
5967
5968 ok(!delete_pf("msitest\\class.txt", TRUE), "file not removed\n");
5969 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5970
5971error:
5972 DeleteFileA("msitest\\class.txt");
5975}
static const msi_table rci_tables[]
Definition: action.c:2262

Referenced by START_TEST().

◆ test_register_extension_info()

static void test_register_extension_info ( void  )
static

Definition at line 5977 of file action.c.

5978{
5979 UINT r;
5980 LONG res;
5981 HKEY hkey;
5982
5983 if (!is_process_elevated())
5984 {
5985 skip("process is limited\n");
5986 return;
5987 }
5988
5990 create_file("msitest\\extension.txt", 1000);
5992
5994
5997 {
5998 skip("Not enough rights to perform tests\n");
5999 goto error;
6000 }
6001 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6002
6003 res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey);
6004 ok(res == ERROR_SUCCESS, "key not created\n");
6005 RegCloseKey(hkey);
6006
6007 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1\\shell\\Open\\command", &hkey);
6008 ok(res == ERROR_SUCCESS, "key not created\n");
6009 RegCloseKey(hkey);
6010
6011 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6012 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6013
6014 res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey);
6015 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6016
6017 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1", &hkey);
6018 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6019
6020 ok(!delete_pf("msitest\\extension.txt", TRUE), "file not removed\n");
6021 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6022
6023error:
6024 DeleteFileA("msitest\\extension.txt");
6027}
static const msi_table rei_tables[]
Definition: action.c:2277

Referenced by START_TEST().

◆ test_register_font()

static void test_register_font ( void  )
static

Definition at line 5386 of file action.c.

5387{
5388 static const char regfont1[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts";
5389 static const char regfont2[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Fonts";
5390 LONG ret;
5391 HKEY key;
5392 UINT r;
5394
5395 if (!is_process_elevated())
5396 {
5397 skip("process is limited\n");
5398 return;
5399 }
5400
5402 create_file("msitest\\font.ttf", 1000);
5404
5405 if (is_wow64)
5407
5409
5412 {
5413 skip("Not enough rights to perform tests\n");
5414 goto error;
5415 }
5416 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5417
5418 ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, regfont1, 0, access, &key);
5419 if (ret)
5420 RegOpenKeyExA(HKEY_LOCAL_MACHINE, regfont2, 0, access, &key);
5421
5422 ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL);
5423 ok(ret != ERROR_FILE_NOT_FOUND, "unexpected result %ld\n", ret);
5424
5425 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5426 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5427
5428 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5429
5430 ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL);
5431 ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %ld\n", ret);
5432
5433 RegDeleteValueA(key, "msi test font");
5435
5436error:
5437 DeleteFileA("msitest\\font.ttf");
5440}
static const msi_table font_tables[]
Definition: action.c:2134

Referenced by START_TEST().

◆ test_register_mime_info()

static void test_register_mime_info ( void  )
static

Definition at line 6155 of file action.c.

6156{
6157 UINT r;
6158 LONG res;
6159 HKEY hkey;
6160
6161 if (!is_process_elevated())
6162 {
6163 skip("process is limited\n");
6164 return;
6165 }
6166
6168 create_file("msitest\\mime.txt", 1000);
6170
6172
6175 {
6176 skip("Not enough rights to perform tests\n");
6177 goto error;
6178 }
6179 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6180
6181 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey);
6182 ok(res == ERROR_SUCCESS, "key not created\n");
6183 RegCloseKey(hkey);
6184
6185 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6186 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6187
6188 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey);
6189 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6190
6191 ok(!delete_pf("msitest\\mime.txt", TRUE), "file not removed\n");
6192 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6193
6194error:
6195 DeleteFileA("msitest\\mime.txt");
6198}
static const msi_table rmi_tables[]
Definition: action.c:2311

Referenced by START_TEST().

◆ test_register_product()

static void test_register_product ( void  )
static

Definition at line 2584 of file action.c.

2585{
2586 UINT r;
2587 LONG res;
2588 HKEY hkey, props, usage;
2589 LPSTR usersid;
2590 char date[MAX_PATH], temp[MAX_PATH], keypath[MAX_PATH], path[MAX_PATH];
2591 DWORD size, type;
2592
2593 static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion"
2594 "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}";
2595 static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2596 "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
2597 static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer"
2598 "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
2599 static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
2600 "\\51AAE0C44620A5E4788506E91F249BD2";
2601
2602 if (!is_process_elevated())
2603 {
2604 skip("process is limited\n");
2605 return;
2606 }
2607
2608 if (!(usersid = get_user_sid()))
2609 return;
2610
2613
2614 CreateDirectoryA("msitest", NULL);
2615 create_file("msitest\\maximus", 500);
2616
2618
2620
2621 /* RegisterProduct */
2622 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1");
2624 {
2625 skip("Not enough rights to perform tests\n");
2626 goto error;
2627 }
2628 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2629 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2630 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2631
2632 res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey);
2633 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2634
2635 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2636 ok(!res, "got %ld\n", res);
2637
2638 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2639 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2640 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2641 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2642 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2643 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2644 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2645 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2646 CHECK_DEL_REG_STR(hkey, "Comments", "");
2647 CHECK_DEL_REG_STR(hkey, "Contact", "");
2648 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2649 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2650 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2651 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2652 CHECK_DEL_REG_STR(hkey, "Readme", "");
2653 CHECK_DEL_REG_STR(hkey, "Size", "");
2654 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2655 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2656 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2657 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2658 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2659 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2660 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2661 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2662
2663 res = RegDeleteKeyA(hkey, "");
2664 ok(!res, "got %ld\n", res);
2665 RegCloseKey(hkey);
2666
2667 sprintf(keypath, userdata, usersid);
2669 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2670
2671 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2672 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2673
2674 size = sizeof(path);
2675 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2677 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2678
2679 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2680 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2681 CHECK_DEL_REG_STR(props, "InstallDate", date);
2682 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2683 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2684 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2685 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2686 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2687 CHECK_DEL_REG_STR(props, "Comments", "");
2688 CHECK_DEL_REG_STR(props, "Contact", "");
2689 CHECK_DEL_REG_STR(props, "HelpLink", "");
2690 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2691 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2692 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2693 CHECK_DEL_REG_STR(props, "Readme", "");
2694 CHECK_DEL_REG_STR(props, "Size", "");
2695 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2696 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2697 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2698 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2699 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2700 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2701 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2703
2704 res = RegDeleteKeyA(props, "");
2705 ok(!res, "got %ld\n", res);
2707
2708 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2709 todo_wine
2710 {
2711 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2712 }
2713
2714 res = RegDeleteKeyA(usage, "");
2715 todo_wine
2716 ok(!res, "got %ld\n", res);
2718 res = RegDeleteKeyA(hkey, "");
2719 ok(!res, "got %ld\n", res);
2720 RegCloseKey(hkey);
2721
2723 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2724
2725 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
2726
2727 res = RegDeleteKeyA(hkey, "");
2728 ok(!res, "got %ld\n", res);
2729 RegCloseKey(hkey);
2730
2731 /* RegisterProduct, machine */
2732 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1");
2733 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
2734 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2735 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2736
2737 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, userugkey, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2738 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2739
2740 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2741 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2742
2743 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2744 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2745 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2746 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2747 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2748 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2749 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2750 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2751 CHECK_DEL_REG_STR(hkey, "Comments", "");
2752 CHECK_DEL_REG_STR(hkey, "Contact", "");
2753 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2754 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2755 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2756 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2757 CHECK_DEL_REG_STR(hkey, "Readme", "");
2758 CHECK_DEL_REG_STR(hkey, "Size", "");
2759 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2760 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2761 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2762 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2763 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2764 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2765 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2766 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2767
2768 res = RegDeleteKeyA(hkey, "");
2769 ok(!res, "got %ld\n", res);
2770 RegCloseKey(hkey);
2771
2772 sprintf(keypath, userdata, "S-1-5-18");
2774 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2775
2776 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2777 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2778
2779 size = sizeof(path);
2780 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2782 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2783
2784 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2785 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2786 CHECK_DEL_REG_STR(props, "InstallDate", date);
2787 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2788 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2789 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2790 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2791 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2792 CHECK_DEL_REG_STR(props, "Comments", "");
2793 CHECK_DEL_REG_STR(props, "Contact", "");
2794 CHECK_DEL_REG_STR(props, "HelpLink", "");
2795 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2796 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2797 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2798 CHECK_DEL_REG_STR(props, "Readme", "");
2799 CHECK_DEL_REG_STR(props, "Size", "");
2800 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2801 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2802 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2803 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2804 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2805 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2806 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2808
2809 res = RegDeleteKeyA(props, "");
2810 ok(!res, "got %ld\n", res);
2812
2813 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2814 todo_wine
2815 {
2816 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2817 }
2818
2819 res = RegDeleteKeyA(usage, "");
2820 todo_wine
2821 ok(!res, "got %ld\n", res);
2823 res = RegDeleteKeyA(hkey, "");
2824 ok(!res, "got %ld\n", res);
2825 RegCloseKey(hkey);
2826
2828 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2829
2830 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
2831
2832 res = RegDeleteKeyA(hkey, "");
2833 ok(!res, "got %ld\n", res);
2834 RegCloseKey(hkey);
2835
2836 if (is_wow64 || is_64bit)
2837 {
2840
2841 r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1 RP_TEST64=1");
2842 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2843 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
2844 ok(delete_pf("msitest", FALSE), "Directory not created\n");
2845
2846 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, userugkey, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2847 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
2848
2849 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_32KEY, &hkey);
2850 ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_SUCCESS, got %ld\n", res);
2851
2852 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
2853 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2854
2855 CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST");
2856 CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1");
2857 CHECK_DEL_REG_STR(hkey, "InstallDate", date);
2858 CHECK_DEL_REG_STR(hkey, "InstallSource", temp);
2859 CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2860 CHECK_DEL_REG_STR(hkey, "Publisher", "Wine");
2861 CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2862 CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", "");
2863 CHECK_DEL_REG_STR(hkey, "Comments", "");
2864 CHECK_DEL_REG_STR(hkey, "Contact", "");
2865 CHECK_DEL_REG_STR(hkey, "HelpLink", "");
2866 CHECK_DEL_REG_STR(hkey, "HelpTelephone", "");
2867 CHECK_DEL_REG_STR(hkey, "InstallLocation", "");
2868 CHECK_DEL_REG_DWORD(hkey, "NoModify", 1);
2869 CHECK_DEL_REG_STR(hkey, "Readme", "");
2870 CHECK_DEL_REG_STR(hkey, "Size", "");
2871 CHECK_DEL_REG_STR(hkey, "URLInfoAbout", "");
2872 CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", "");
2873 CHECK_DEL_REG_DWORD(hkey, "Language", 1033);
2874 CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001);
2875 CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1);
2876 CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1);
2877 CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1);
2878 CHECK_DEL_REG_DWORD_TODO(hkey, "EstimatedSize", get_estimated_size());
2879
2880 res = RegDeleteKeyA(hkey, "");
2881 ok(!res, "got %ld\n", res);
2882 RegCloseKey(hkey);
2883
2884 sprintf(keypath, userdata, "S-1-5-18");
2886 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2887
2888 res = RegOpenKeyExA(hkey, "InstallProperties", 0, KEY_READ, &props);
2889 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2890
2891 size = sizeof(path);
2892 RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size);
2894 RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */
2895
2896 CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST");
2897 CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1");
2898 CHECK_DEL_REG_STR(props, "InstallDate", date);
2899 CHECK_DEL_REG_STR(props, "InstallSource", temp);
2900 CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2901 CHECK_DEL_REG_STR(props, "Publisher", "Wine");
2902 CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /X{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
2903 CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", "");
2904 CHECK_DEL_REG_STR(props, "Comments", "");
2905 CHECK_DEL_REG_STR(props, "Contact", "");
2906 CHECK_DEL_REG_STR(props, "HelpLink", "");
2907 CHECK_DEL_REG_STR(props, "HelpTelephone", "");
2908 CHECK_DEL_REG_STR(props, "InstallLocation", "");
2909 CHECK_DEL_REG_DWORD(props, "NoModify", 1);
2910 CHECK_DEL_REG_STR(props, "Readme", "");
2911 CHECK_DEL_REG_STR(props, "Size", "");
2912 CHECK_DEL_REG_STR(props, "URLInfoAbout", "");
2913 CHECK_DEL_REG_STR(props, "URLUpdateInfo", "");
2914 CHECK_DEL_REG_DWORD(props, "Language", 1033);
2915 CHECK_DEL_REG_DWORD(props, "Version", 0x1010001);
2916 CHECK_DEL_REG_DWORD(props, "VersionMajor", 1);
2917 CHECK_DEL_REG_DWORD(props, "VersionMinor", 1);
2918 CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1);
2920
2921 res = RegDeleteKeyA(props, "");
2922 ok(!res, "got %ld\n", res);
2924
2925 res = RegOpenKeyExA(hkey, "Usage", 0, KEY_READ, &usage);
2926 todo_wine
2927 {
2928 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2929 }
2930
2931 res = RegDeleteKeyA(usage, "");
2932 todo_wine
2933 ok(!res, "got %ld\n", res);
2935 res = RegDeleteKeyA(hkey, "");
2936 ok(!res, "got %ld\n", res);
2937 RegCloseKey(hkey);
2938
2940 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
2941
2942 CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", "");
2943
2944 res = RegDeleteKeyA(hkey, "");
2945 ok(!res, "got %ld\n", res);
2946 RegCloseKey(hkey);
2947 }
2948 else
2949 skip("64-bit RegisterProduct tests\n");
2950
2951error:
2953 DeleteFileA("msitest\\maximus");
2954 RemoveDirectoryA("msitest");
2955 LocalFree(usersid);
2956}
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
#define CHECK_DEL_REG_ISTR(prodkey, name, expected)
Definition: action.c:2508
#define create_database_template(name, tables, num_tables, version, template)
Definition: utils.h:46
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45

Referenced by START_TEST().

◆ test_register_progid_info()

static void test_register_progid_info ( void  )
static

Definition at line 6029 of file action.c.

6030{
6031 UINT r;
6032 LONG res;
6033 HKEY hkey;
6034
6035 if (!is_process_elevated())
6036 {
6037 skip("process is limited\n");
6038 return;
6039 }
6040
6042 create_file("msitest\\progid.txt", 1000);
6044
6045 res = RegCreateKeyExA(HKEY_CLASSES_ROOT, "Winetest.Orphaned", 0, NULL, 0,
6046 KEY_ALL_ACCESS, NULL, &hkey, NULL);
6047 ok(res == ERROR_SUCCESS, "key not created\n");
6048 RegCloseKey(hkey);
6049
6051
6054 {
6055 skip("Not enough rights to perform tests\n");
6056 goto error;
6057 }
6058 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6059
6060 if (is_64bit)
6061 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
6062 else
6063 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
6064 ok(res == ERROR_SUCCESS, "key not created\n");
6065 RegCloseKey(hkey);
6066
6067 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class.1", &hkey);
6068 ok(res == ERROR_SUCCESS, "key not created\n");
6069 RegCloseKey(hkey);
6070
6071 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class", &hkey);
6072 ok(res == ERROR_SUCCESS, "key not created\n");
6073 RegCloseKey(hkey);
6074
6075 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class.2", &hkey);
6076 ok(res == ERROR_SUCCESS, "key not created\n");
6077 RegCloseKey(hkey);
6078
6079 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.VerClass.1", &hkey);
6080 ok(res == ERROR_SUCCESS, "key not created\n");
6081 RegCloseKey(hkey);
6082
6083 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.VerClass", &hkey);
6084 ok(res == ERROR_SUCCESS, "key not created\n");
6085 RegCloseKey(hkey);
6086
6087 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.NoProgIdClass.1", &hkey);
6088 ok(res == ERROR_FILE_NOT_FOUND, "key created\n");
6089 if (res == ERROR_SUCCESS) RegCloseKey(hkey);
6090
6091 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.NoProgIdClass", &hkey);
6092 ok(res == ERROR_FILE_NOT_FOUND, "key created\n");
6093
6094 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Orphaned", &hkey);
6095 ok(res == ERROR_SUCCESS, "key deleted\n");
6096 if (res == ERROR_SUCCESS) RegCloseKey(hkey);
6097
6098 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Orphaned2", &hkey);
6099 ok(res == ERROR_FILE_NOT_FOUND, "key created\n");
6100
6101 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Extension", &hkey);
6102 ok(res == ERROR_SUCCESS, "key not created\n");
6103 RegCloseKey(hkey);
6104
6105 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6106 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6107
6108 if (is_64bit)
6109 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
6110 else
6111 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey);
6112 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6113
6114 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class.1", &hkey);
6115 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6116
6117 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class", &hkey);
6118 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6119
6120 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Class.2", &hkey);
6121 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6122
6123 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.VerClass.1", &hkey);
6124 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6125
6126 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.VerClass", &hkey);
6127 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6128
6129 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.NoProgIdClass.1", &hkey);
6130 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6131
6132 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.NoProgIdClass", &hkey);
6133 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6134
6135 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Orphaned", &hkey);
6136 ok(res == ERROR_SUCCESS, "key deleted\n");
6137 if (res == ERROR_SUCCESS) RegCloseKey(hkey);
6138
6139 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Orphaned2", &hkey);
6140 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6141
6142 res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Winetest.Extension", &hkey);
6143 ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
6144
6145 ok(!delete_pf("msitest\\progid.txt", TRUE), "file not removed\n");
6146 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6147
6148error:
6149 DeleteFileA("msitest\\progid.txt");
6152 RegDeleteKeyA(HKEY_CLASSES_ROOT, "Winetest.Orphaned");
6153}
static const msi_table rpi_tables[]
Definition: action.c:2293

Referenced by START_TEST().

◆ test_register_typelib()

static void test_register_typelib ( void  )
static

Definition at line 5577 of file action.c.

5578{
5579 ITypeLib *tlb;
5580 HRESULT hr;
5581 UINT r;
5582
5583 if (!is_process_elevated())
5584 {
5585 skip("process is limited\n");
5586 return;
5587 }
5588
5589 /* UnregisterTypeLibraries action fails in 64-bit Windows <= 7 */
5590 if (sizeof(void *) == 8 && strcmp( winetest_platform, "wine" ))
5591 {
5592 win_skip("broken on 64-bit Windows\n");
5593 return;
5594 }
5595
5597 extract_resource(MAKEINTRESOURCEA(1), "TYPELIB", "msitest\\typelib.dll");
5599
5601
5604 {
5605 skip("Not enough rights to perform tests\n");
5606 goto error;
5607 }
5608 ok(r == ERROR_SUCCESS, "got %u\n", r);
5609
5610 hr = LoadRegTypeLib(&LIBID_register_test, 7, 1, 0, &tlb);
5611 ok(hr == S_OK, "got %#lx\n", hr);
5612 ITypeLib_Release(tlb);
5613
5614 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5615 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5616
5617 hr = LoadRegTypeLib(&LIBID_register_test, 7, 1, 0, &tlb);
5618 ok(hr == TYPE_E_LIBNOTREGISTERED, "got %#lx\n", hr);
5619
5620 ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n");
5621 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5622
5623error:
5624 DeleteFileA("msitest\\typelib.dll");
5627}
HRESULT WINAPI LoadRegTypeLib(REFGUID rguid, WORD wVerMajor, WORD wVerMinor, LCID lcid, ITypeLib **ppTLib)
Definition: typelib.c:531
#define S_OK
Definition: intsafe.h:52
static const msi_table tl_tables[]
Definition: action.c:2177
static void extract_resource(const char *name, const char *type, const char *path)
Definition: action.c:2566
static const GUID LIBID_register_test
Definition: custom.c:2016
const char * winetest_platform
HRESULT hr
Definition: shlfolder.c:183
#define TYPE_E_LIBNOTREGISTERED
Definition: winerror.h:2534
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581

Referenced by START_TEST().

◆ test_register_user()

static void test_register_user ( void  )
static

Definition at line 3383 of file action.c.

3384{
3385 UINT r;
3386 LONG res;
3387 HKEY props;
3388 LPSTR usersid;
3389 LPSTR owner, company;
3390 CHAR keypath[MAX_PATH];
3392
3393 static const CHAR keypropsfmt[] =
3394 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3395 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
3396 static const CHAR keypridfmt[] =
3397 "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
3398 "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
3399
3400 if (!is_process_elevated())
3401 {
3402 skip("process is limited\n");
3403 return;
3404 }
3405
3406 if (!(usersid = get_user_sid()))
3407 return;
3408
3409 get_owner_company(&owner, &company);
3410
3411 CreateDirectoryA("msitest", NULL);
3412 create_file("msitest\\maximus", 500);
3413
3415
3416 if (is_wow64)
3418
3420
3421 /* RegisterUser, per-user */
3422 r = MsiInstallProductA(msifile, "REGISTER_USER=1");
3424 {
3425 skip("Not enough rights to perform tests\n");
3426 goto error;
3427 }
3428 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3429 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3430 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3431
3432 sprintf(keypath, keypropsfmt, usersid);
3434 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3435
3436 CHECK_REG_STR(props, "ProductID", "none");
3437 CHECK_REG_STR(props, "RegCompany", company);
3438 CHECK_REG_STR(props, "RegOwner", owner);
3439
3440 RegDeleteValueA(props, "ProductID");
3441 RegDeleteValueA(props, "RegCompany");
3442 RegDeleteValueA(props, "RegOwner");
3443 RegDeleteKeyExA(props, "", access, 0);
3445 sprintf(keypath, keypridfmt, usersid);
3447
3448 /* RegisterUser, machine */
3449 r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1");
3450 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
3451 ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
3452 ok(delete_pf("msitest", FALSE), "Directory not created\n");
3453
3454 sprintf(keypath, keypropsfmt, "S-1-5-18");
3456 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
3457
3458 CHECK_REG_STR(props, "ProductID", "none");
3459 CHECK_REG_STR(props, "RegCompany", company);
3460 CHECK_REG_STR(props, "RegOwner", owner);
3461
3462 RegDeleteValueA(props, "ProductID");
3463 RegDeleteValueA(props, "RegCompany");
3464 RegDeleteValueA(props, "RegOwner");
3465 RegDeleteKeyExA(props, "", access, 0);
3467 sprintf(keypath, keypridfmt, "S-1-5-18");
3469
3470error:
3471 free(company);
3472 free(owner);
3473
3475 DeleteFileA("msitest\\maximus");
3476 RemoveDirectoryA("msitest");
3477 LocalFree(usersid);
3478}
static void get_owner_company(LPSTR *owner, LPSTR *company)
Definition: action.c:3338

Referenced by START_TEST().

◆ test_remove_duplicate_files()

static void test_remove_duplicate_files ( void  )
static

Definition at line 5759 of file action.c.

5760{
5761 UINT r;
5762
5763 if (!is_process_elevated())
5764 {
5765 skip("process is limited\n");
5766 return;
5767 }
5768
5770 create_file("msitest\\original.txt", 1000);
5771 create_file("msitest\\original2.txt", 1000);
5772 create_file("msitest\\original3.txt", 1000);
5774
5776
5779 {
5780 skip("Not enough rights to perform tests\n");
5781 goto error;
5782 }
5783 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5784
5785 ok(pf_exists("msitest\\original.txt"), "file not created\n");
5786 ok(pf_exists("msitest\\original2.txt"), "file not created\n");
5787 ok(!pf_exists("msitest\\original3.txt"), "file created\n");
5788 ok(pf_exists("msitest\\duplicate.txt"), "file not created\n");
5789 ok(!pf_exists("msitest\\duplicate2.txt"), "file created\n");
5790
5791 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5792 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5793
5794 ok(delete_pf("msitest\\original.txt", TRUE), "file removed\n");
5795 ok(!delete_pf("msitest\\original2.txt", TRUE), "file not removed\n");
5796 ok(!delete_pf("msitest\\original3.txt", TRUE), "file not removed\n");
5797 ok(!delete_pf("msitest\\duplicate.txt", TRUE), "file not removed\n");
5798 ok(!delete_pf("msitest\\duplicate2.txt", TRUE), "file not removed\n");
5799 ok(delete_pf("msitest", FALSE), "directory removed\n");
5800
5801error:
5802 DeleteFileA("msitest\\original.txt");
5803 DeleteFileA("msitest\\original2.txt");
5804 DeleteFileA("msitest\\original3.txt");
5807}
static const msi_table rd_tables[]
Definition: action.c:2219

Referenced by START_TEST().

◆ test_remove_existing_products()

static void test_remove_existing_products ( void  )
static

Definition at line 6420 of file action.c.

6421{
6422 UINT r;
6423
6424 if (!is_process_elevated())
6425 {
6426 skip("process is limited\n");
6427 return;
6428 }
6429
6431 create_file("msitest\\rep.txt", 1000);
6433
6435
6438 {
6439 skip("Not enough rights to perform tests\n");
6440 goto error;
6441 }
6442 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6443
6444 r = MsiInstallProductA(msifile, "REMOVE=ALL");
6445 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
6446
6447 ok(!delete_pf("msitest\\rep.txt", TRUE), "file not removed\n");
6448 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
6449
6450error:
6451 DeleteFileA("msitest\\rep.txt");
6454}
static const msi_table rep_tables[]
Definition: action.c:2342

Referenced by START_TEST().

◆ test_remove_files()

static void test_remove_files ( void  )
static

Definition at line 4414 of file action.c.

4415{
4416 UINT r;
4417
4418 if (!is_process_elevated())
4419 {
4420 skip("process is limited\n");
4421 return;
4422 }
4423
4424 CreateDirectoryA("msitest", NULL);
4425 create_file("msitest\\hydrogen", 500);
4426 create_file("msitest\\helium", 500);
4427 create_file("msitest\\lithium", 500);
4428
4430
4432
4435 {
4436 skip("Not enough rights to perform tests\n");
4437 goto error;
4438 }
4439 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4440 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4441 ok(!pf_exists("msitest\\helium"), "File installed\n");
4442 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4443 ok(pf_exists("msitest"), "File not installed\n");
4444
4445 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4446 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4447 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4448 ok(!pf_exists("msitest\\helium"), "File not deleted\n");
4449 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4450 ok(delete_pf("msitest", FALSE), "Directory deleted\n");
4451
4452 create_pf("msitest", FALSE);
4453 create_pf("msitest\\hydrogen", TRUE);
4454 create_pf("msitest\\helium", TRUE);
4455 create_pf("msitest\\lithium", TRUE);
4456
4458 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4459 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4460 ok(pf_exists("msitest\\helium"), "File not installed\n");
4461 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4462 ok(pf_exists("msitest"), "File not installed\n");
4463
4464 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4465 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4466 ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n");
4467 ok(delete_pf("msitest\\helium", TRUE), "File deleted\n");
4468 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4469 ok(delete_pf("msitest", FALSE), "Directory deleted\n");
4470
4471 create_pf("msitest", FALSE);
4472 create_pf("msitest\\furlong", TRUE);
4473 create_pf("msitest\\firkin", TRUE);
4474 create_pf("msitest\\fortnight", TRUE);
4475 create_pf("msitest\\becquerel", TRUE);
4476 create_pf("msitest\\dioptre", TRUE);
4477 create_pf("msitest\\attoparsec", TRUE);
4478 create_pf("msitest\\storeys", TRUE);
4479 create_pf("msitest\\block", TRUE);
4480 create_pf("msitest\\siriometer", TRUE);
4481 create_pf("msitest\\cabout", FALSE);
4482 create_pf("msitest\\cabout\\blocker", TRUE);
4483
4485 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4486 ok(pf_exists("msitest\\hydrogen"), "File not installed\n");
4487 ok(!pf_exists("msitest\\helium"), "File installed\n");
4488 ok(pf_exists("msitest\\lithium"), "File not installed\n");
4489 ok(!pf_exists("msitest\\furlong"), "File not deleted\n");
4490 ok(!pf_exists("msitest\\firkin"), "File not deleted\n");
4491 ok(!pf_exists("msitest\\fortnight"), "File not deleted\n");
4492 ok(pf_exists("msitest\\becquerel"), "File not installed\n");
4493 ok(pf_exists("msitest\\dioptre"), "File not installed\n");
4494 ok(pf_exists("msitest\\attoparsec"), "File not installed\n");
4495 ok(!pf_exists("msitest\\storeys"), "File not deleted\n");
4496 ok(!pf_exists("msitest\\block"), "File not deleted\n");
4497 ok(!pf_exists("msitest\\siriometer"), "File not deleted\n");
4498 ok(pf_exists("msitest\\cabout"), "Directory removed\n");
4499 ok(pf_exists("msitest"), "File not installed\n");
4500
4501 create_pf("msitest\\furlong", TRUE);
4502 create_pf("msitest\\firkin", TRUE);
4503 create_pf("msitest\\fortnight", TRUE);
4504 create_pf("msitest\\storeys", TRUE);
4505 create_pf("msitest\\block", TRUE);
4506 create_pf("msitest\\siriometer", TRUE);
4507
4508 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4509 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4510 ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n");
4511 ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n");
4512 ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n");
4513 ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n");
4514 ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n");
4515 ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n");
4516 ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n");
4517 ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n");
4518 ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n");
4519 ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n");
4520 ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n");
4521 ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n");
4522 ok(pf_exists("msitest\\cabout"), "Directory deleted\n");
4523 ok(pf_exists("msitest"), "Directory deleted\n");
4524
4526 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4527 ok(delete_pf("msitest\\hydrogen", TRUE), "File not installed\n");
4528 ok(!delete_pf("msitest\\helium", TRUE), "File installed\n");
4529 ok(delete_pf("msitest\\lithium", TRUE), "File not installed\n");
4530 ok(pf_exists("msitest\\cabout"), "Directory deleted\n");
4531 ok(pf_exists("msitest"), "Directory deleted\n");
4532
4533 delete_pf("msitest\\cabout\\blocker", TRUE);
4534
4535 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4536 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4537 ok(!delete_pf("msitest\\cabout", FALSE), "Directory not deleted\n");
4538 delete_pf("msitest", FALSE);
4539
4540error:
4542 DeleteFileA("msitest\\hydrogen");
4543 DeleteFileA("msitest\\helium");
4544 DeleteFileA("msitest\\lithium");
4545 RemoveDirectoryA("msitest");
4546}
static const msi_table rem_tables[]
Definition: action.c:2009
#define create_pf(file, is_file)
Definition: install.c:3969

Referenced by START_TEST().

◆ test_self_registration()

static void test_self_registration ( void  )
static

Definition at line 5342 of file action.c.

5343{
5344 HKEY key;
5345 UINT r;
5346
5347 if (!is_process_elevated())
5348 {
5349 skip("process is limited\n");
5350 return;
5351 }
5352
5354 extract_resource("selfreg.dll", "TESTDLL", "msitest\\selfreg.dll");
5356
5358
5361 {
5362 skip("Not enough rights to perform tests\n");
5363 goto error;
5364 }
5365 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5366
5367 r = RegOpenKeyA(HKEY_CLASSES_ROOT, "selfreg_test", &key);
5368 ok(!r, "got %u\n", r);
5370
5371 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5372 ok(!r, "got %u\n", r);
5373
5374 r = RegOpenKeyA(HKEY_CLASSES_ROOT, "selfreg_test", &key);
5375 ok(r == ERROR_FILE_NOT_FOUND, "got %u\n", r);
5376
5377 ok(!delete_pf("msitest\\selfreg.dll", TRUE), "file not removed\n");
5378 ok(!delete_pf("msitest", FALSE), "directory not removed\n");
5379
5380error:
5381 DeleteFileA("msitest\\selfreg.dll");
5384}
static const msi_table sr_tables[]
Definition: action.c:2120

Referenced by START_TEST().

◆ test_start_stop_services()

static void test_start_stop_services ( void  )
static

Definition at line 5074 of file action.c.

5075{
5076 UINT r;
5077 SC_HANDLE scm, service;
5078 BOOL ret;
5080
5082 if (!scm && GetLastError() == ERROR_ACCESS_DENIED)
5083 {
5084 skip("Not enough rights to perform tests\n");
5085 return;
5086 }
5087 ok(scm != NULL, "Failed to open the SC Manager\n");
5088 if (!scm) return;
5089
5090 service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS);
5091 if (!service && GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
5092 {
5093 win_skip("The 'Spooler' service does not exist\n");
5094 CloseServiceHandle(scm);
5095 return;
5096 }
5097 ok(service != NULL, "Failed to open Spooler, error %lu\n", GetLastError());
5098 if (!service) {
5099 CloseServiceHandle(scm);
5100 return;
5101 }
5102
5103 ret = StartServiceA(service, 0, NULL);
5105 {
5106 skip("Spooler service not available, skipping test\n");
5107 CloseServiceHandle(service);
5108 CloseServiceHandle(scm);
5109 return;
5110 }
5111
5112 CloseServiceHandle(service);
5113 CloseServiceHandle(scm);
5114
5117
5119
5121 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5122
5123 if (error == ERROR_SUCCESS)
5124 {
5126
5128 service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS);
5129
5131 ok(ret, "ControlService failed %lu\n", GetLastError());
5132
5133 CloseServiceHandle(service);
5134 CloseServiceHandle(scm);
5135 }
5136
5137 r = MsiInstallProductA(msifile, "REMOVE=ALL");
5138 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5139
5140 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5141 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
5142 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5143 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n");
5144 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5145 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n");
5146 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5147 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n");
5148 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5149 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5150 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5151 ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
5152 ok(delete_pf("msitest", FALSE), "Directory not created\n");
5153
5154 if (error == ERROR_SUCCESS)
5155 {
5157
5159 service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS);
5160
5162 ok(ret, "ControlService failed %lu\n", GetLastError());
5163
5164 CloseServiceHandle(service);
5165 CloseServiceHandle(scm);
5166 }
5167
5170}
static const msi_table sss_tables[]
Definition: action.c:2077
BOOL WINAPI StartServiceA(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCSTR *lpServiceArgVectors)
Definition: scm.c:2942
BOOL WINAPI ControlService(SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus)
Definition: scm.c:622
Definition: ps.c:97
#define ERROR_SERVICE_ALREADY_RUNNING
Definition: winerror.h:607
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36

Referenced by START_TEST().

◆ test_validate_product_id()

static void test_validate_product_id ( void  )
static

Definition at line 5442 of file action.c.

5443{
5444 UINT r;
5445
5446 if (!is_process_elevated())
5447 {
5448 skip("process is limited\n");
5449 return;
5450 }
5451
5454
5456
5459 {
5460 skip("Not enough rights to perform tests\n");
5461 goto error;
5462 }
5463 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5464
5465 r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=1");
5466 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
5467
5468 r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=2");
5469 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
5470
5471 r = MsiInstallProductA(msifile, "PIDKEY=123-1234567");
5472 ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
5473
5474 ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
5475 ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
5476 ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
5477 ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n");
5478 ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
5479 ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n");
5480 ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
5481 ok(delete_pf("msitest\\first", FALSE), "Directory not created\n");
5482 ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
5483 ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n");
5484 ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
5485 ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
5486 ok(delete_pf("msitest", FALSE), "Directory not created\n");
5487
5488error:
5491}
static const msi_table vp_tables[]
Definition: action.c:2148
#define ERROR_INSTALL_FAILURE
Definition: winerror.h:961

Referenced by START_TEST().

◆ test_write_registry_values()

static void test_write_registry_values ( void  )
static

Definition at line 4734 of file action.c.

4735{
4736 HKEY hkey, subkey;
4737 DWORD type, size;
4738 char buf[20];
4739 LONG res;
4740 UINT r;
4741
4742 if (!is_process_elevated())
4743 {
4744 skip("process is limited\n");
4745 return;
4746 }
4747
4748 CreateDirectoryA("msitest", NULL);
4749
4751
4753
4754 res = RegCreateKeyA(HKEY_CURRENT_USER, "msitest", &hkey);
4755 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4756
4757 res = RegSetValueExA(hkey, "Value1", 0, REG_MULTI_SZ, (const BYTE *)"two\0", 5);
4758 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4759 res = RegSetValueExA(hkey, "Value2", 0, REG_MULTI_SZ, (const BYTE *)"one\0", 5);
4760 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4761 res = RegSetValueExA(hkey, "Value3", 0, REG_MULTI_SZ, (const BYTE *)"two\0", 5);
4762 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4763 res = RegSetValueExA(hkey, "Value4", 0, REG_MULTI_SZ, (const BYTE *)"one\0", 5);
4764 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4765 res = RegSetValueExA(hkey, "Value5", 0, REG_MULTI_SZ, (const BYTE *)"one\0two\0", 9);
4766 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4767 res = RegSetValueExA(hkey, "Value6", 0, REG_MULTI_SZ, (const BYTE *)"one\0", 5);
4768 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4769 res = RegSetValueExA(hkey, "Value7", 0, REG_SZ, (const BYTE *)"one", 4);
4770 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4771
4772 res = RegSetValueExA(hkey, "instremove", 0, REG_SZ, (const BYTE *)"val", 3);
4773 ok(!res, "got %ld\n", res);
4774
4775 res = RegCreateKeyA(hkey, "instremove", &subkey);
4776 ok(!res, "got %ld\n", res);
4777 RegCloseKey(subkey);
4778
4781 {
4782 skip("Not enough rights to perform tests\n");
4783 goto error;
4784 }
4785 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
4786
4787 CHECK_REG_STR(hkey, "sz", "string");
4788 CHECK_REG_MULTI(hkey, "multisz", "one\0two\0three\0");
4789 CHECK_REG_DWORD(hkey, "dword", 123);
4790
4791 size = sizeof(buf);
4792 res = RegQueryValueExA(hkey, "expandsz", NULL, &type, (BYTE *)buf, &size);
4793 ok(!res, "got %ld\n", res);
4794 ok(type == REG_EXPAND_SZ, "got %ld\n", type);
4795 ok(!strcmp(buf, "string"), "got %s\n", buf);
4796
4797 size = sizeof(buf);
4798 res = RegQueryValueExA(hkey, "binary", NULL, &type, (BYTE *)buf, &size);
4799 ok(!res, "got %ld\n", res);
4800 ok(type == REG_BINARY, "got %ld\n", type);
4801 ok(size == 4, "got size %lu\n", size);
4802 ok(!memcmp(buf, "\x01\x23\x45\x67", 4), "wrong data\n");
4803
4804 CHECK_REG_STR(hkey, "", "default");
4805
4806 res = RegOpenKeyA(hkey, "VisualStudio", &subkey);
4807 ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
4808 RegCloseKey(subkey);
4809
4810 CHECK_REG_MULTI(hkey, "Value1", "one\0");
4811 CHECK_REG_MULTI(hkey, "Value2", "one\0two\0");
4812 CHECK_REG_MULTI(hkey, "Value3", "one\0two\0");
4813 CHECK_REG_MULTI(hkey, "Value4", "one\0two\0");
4814 CHECK_REG_MULTI(hkey, "Value5", "one\0two\0three\0");
4815 CHECK_REG_MULTI(hkey, "Value6", "");
4816 CHECK_REG_MULTI(hkey, "Value7", "two\0");
4817
4818 CHECK_REG_DWORD(hkey, "format", 1);
4819 CHECK_REG_DWORD(hkey, "source", 1);
4820
4821 res = RegOpenKeyA(hkey, "subkey", &subkey);
4822 ok(!res, "got %ld\n", res);
4823 res = RegQueryValueExA(subkey, "", NULL, NULL, NULL, NULL);
4824 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4825 RegCloseKey(subkey);
4826
4827 res = RegOpenKeyA(hkey, "create", &subkey);
4828 ok(!res, "got %ld\n", res);
4829 RegCloseKey(subkey);
4830
4831 res = RegOpenKeyA(hkey, "delete", &subkey);
4832 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4833 res = RegCreateKeyA(hkey, "delete", &subkey);
4834 ok(!res, "got %ld\n", res);
4835 RegCloseKey(subkey);
4836
4837 res = RegQueryValueExA(hkey, "instremove", NULL, NULL, NULL, NULL);
4838 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4839 res = RegOpenKeyA(hkey, "instremove", &subkey);
4840 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4841
4842 r = MsiInstallProductA(msifile, "REMOVE=ALL");
4843 ok(!r, "got %u\n", r);
4844
4845 res = RegQueryValueExA(hkey, "sz", NULL, NULL, NULL, NULL);
4846 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4847 res = RegQueryValueExA(hkey, "multisz", NULL, NULL, NULL, NULL);
4848 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4849 res = RegQueryValueExA(hkey, "dword", NULL, NULL, NULL, NULL);
4850 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4851 res = RegQueryValueExA(hkey, "expandsz", NULL, NULL, NULL, NULL);
4852 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4853 res = RegQueryValueExA(hkey, "binary", NULL, NULL, NULL, NULL);
4854 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4855 res = RegQueryValueExA(hkey, "", NULL, NULL, NULL, NULL);
4856 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4857
4858 res = RegOpenKeyA(hkey, "VisualStudio", &subkey);
4859 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4860
4861 res = RegQueryValueExA(hkey, "Value1", NULL, NULL, NULL, NULL);
4862 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4863 res = RegQueryValueExA(hkey, "Value4", NULL, NULL, NULL, NULL);
4864 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4865 res = RegQueryValueExA(hkey, "Value5", NULL, NULL, NULL, NULL);
4866 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4867 res = RegQueryValueExA(hkey, "Value6", NULL, NULL, NULL, NULL);
4868 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4869 res = RegQueryValueExA(hkey, "Value7", NULL, NULL, NULL, NULL);
4870 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4871
4872todo_wine {
4873 CHECK_REG_MULTI(hkey, "Value2", "one\0");
4874 CHECK_REG_MULTI(hkey, "Value3", "two\0");
4875}
4876
4877 res = RegQueryValueExA(hkey, "format", NULL, NULL, NULL, NULL);
4878 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4879 res = RegQueryValueExA(hkey, "source", NULL, NULL, NULL, NULL);
4880 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4881
4882 res = RegOpenKeyA(hkey, "subkey", &subkey);
4883 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4884
4885 res = RegOpenKeyA(hkey, "create", &subkey);
4886 ok(!res, "got %ld\n", res);
4887 RegCloseKey(subkey);
4888 res = RegDeleteKeyA(hkey, "create");
4889 ok(!res, "got %ld\n", res);
4890
4891 res = RegOpenKeyA(hkey, "delete", &subkey);
4892 ok(res == ERROR_FILE_NOT_FOUND, "got %ld\n", res);
4893
4894 RegCloseKey(hkey);
4895 res = RegDeleteKeyA(HKEY_CURRENT_USER, "msitest");
4896 ok(!res, "got %ld\n", res);
4897
4898error:
4900 RemoveDirectoryA("msitest");
4901}
static const msi_table wrv_tables[]
Definition: action.c:2049
#define REG_BINARY
Definition: nt_native.h:1496

Referenced by START_TEST().

Variable Documentation

◆ cf_component_dat

const char cf_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"One\t{F8CD42AC-9C38-48FE-8664-B35FD121012A}\tFIRSTDIR\t0\t\tone.txt\n"
"Two\t{DE2DB02E-2DDF-4E34-8CF6-DCA13E29DF52}\tSECONDDIR\t0\t\ttwo.txt\n"

Definition at line 721 of file action.c.

◆ cf_create_folders_dat

const char cf_create_folders_dat[]
static
Initial value:
=
"Directory_\tComponent_\n"
"s72\ts72\n"
"CreateFolder\tDirectory_\tComponent_\n"
"FIRSTDIR\tOne\n"
"SECONDDIR\tTwo\n"
"THIRDDIR\tTwo\n"

Definition at line 749 of file action.c.

◆ cf_custom_action_dat

const char cf_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"ifi_immediate\t1\tcustom.dll\tfile_absent\n"
"ifi_deferred\t1025\tcustom.dll\tfile_present\n"
"rfi_immediate\t1\tcustom.dll\tfile_present\n"
"rfi_deferred\t1025\tcustom.dll\tfile_absent\n"
"cf_immediate\t1\tcustom.dll\tcf_absent\n"
"cf_deferred\t1025\tcustom.dll\tcf_present\n"
"rf_immediate\t1\tcustom.dll\tcf_present\n"
"rf_deferred\t1025\tcustom.dll\tcf_absent\n"

Definition at line 788 of file action.c.

◆ cf_directory_dat

const char cf_directory_dat[]
static
Initial value:
=
"Directory\tDirectory_Parent\tDefaultDir\n"
"s72\tS72\tl255\n"
"Directory\tDirectory\n"
"FIRSTDIR\tMSITESTDIR\tfirst\n"
"SECONDDIR\tMSITESTDIR\tsecond\n"
"THIRDDIR\tMSITESTDIR\tthird\n"
"MSITESTDIR\tProgramFilesFolder\tmsitest\n"
"ProgramFilesFolder\tTARGETDIR\t.\n"
"TARGETDIR\t\tSourceDir"

Definition at line 710 of file action.c.

◆ cf_feature_comp_dat

const char cf_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"One\tOne\n"
"Two\tTwo\n"

Definition at line 735 of file action.c.

◆ cf_feature_dat

const char cf_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"One\t\tOne\tThe One Feature\t1\t3\tFIRSTDIR\t0\n"
"Two\t\tTwo\tThe Two Feature\t1\t3\tSECONDDIR\t0\n"

Definition at line 728 of file action.c.

◆ cf_file_dat

const char cf_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"one.txt\tOne\tone.txt\t0\t\t\t0\t1\n"
"two.txt\tTwo\ttwo.txt\t0\t\t\t0\t2\n"

Definition at line 742 of file action.c.

◆ cf_install_exec_seq_dat

const char cf_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostFinalize\t\t1000\n"
"ValidateProductID\t\t700\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"RemoveFiles\t\t3500\n"
"rfi_immediate\tREMOVE\t3501\n"
"rfi_deferred\tREMOVE\t3502\n"
"CreateFolders\t\t3700\n"
"cf_immediate\tNOT REMOVE\t3701\n"
"cf_deferred\tNOT REMOVE\t3702\n"
"RemoveFolders\t\t3800\n"
"rf_immediate\tREMOVE\t3801\n"
"rf_deferred\tREMOVE\t3802\n"
"InstallFiles\t\t4000\n"
"ifi_immediate\tNOT REMOVE\t4001\n"
"ifi_deferred\tNOT REMOVE\t4002\n"
"RegisterUser\t\t6000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6300\n"
"PublishProduct\t\t6400\n"
"InstallFinalize\t\t6600\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"UnpublishFeatures\t\t1800\n"
"InstallValidate\t\t1400\n"
"LaunchConditions\t\t100\n"

Definition at line 757 of file action.c.

◆ cf_tables

const msi_table cf_tables[]
static
Initial value:
=
{
ADD_TABLE(cf_component),
ADD_TABLE(cf_directory),
ADD_TABLE(cf_feature),
ADD_TABLE(cf_feature_comp),
ADD_TABLE(cf_file),
ADD_TABLE(cf_create_folders),
ADD_TABLE(cf_install_exec_seq),
ADD_TABLE(cf_custom_action),
}
#define ADD_TABLE(x)
Definition: automation.c:156

Definition at line 2063 of file action.c.

Referenced by test_create_remove_folder().

◆ ci2_feature_comp_dat

const char ci2_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"feature\taugustus"

Definition at line 401 of file action.c.

◆ ci2_file_dat

const char ci2_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"augustus\taugustus\taugustus\t500\t\t\t8192\t1"

Definition at line 407 of file action.c.

◆ component_dat

const char component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n"
"Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n"
"One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n"
"Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n"
"Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n"
"dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n"
"component\t\tMSITESTDIR\t0\t1\tfile\n"
"service_comp\t{935A0A91-22A3-4F87-BCA8-928FFDFE2353}\tMSITESTDIR\t0\t\tservice_file\n"
"service_comp2\t{3F7B04A4-9521-4649-BDC9-0C8722740A49}\tMSITESTDIR\t0\t\tservice_file2\n"
"service_comp3\t{DBCD1502-20E3-423F-B53E-F37E263CDC7E}\tMSITESTDIR\t0\t\t\n"

Definition at line 52 of file action.c.

◆ crs_component_dat

const char crs_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t0\t\ttarget.txt\n"

Definition at line 1154 of file action.c.

◆ crs_custom_action_dat

const char crs_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"cs_immediate\t1\tcustom.dll\tcrs_absent\n"
"cs_deferred\t1025\tcustom.dll\tcrs_present\n"
"rs_immediate\t1\tcustom.dll\tcrs_present\n"
"rs_deferred\t1025\tcustom.dll\tcrs_absent\n"

Definition at line 1191 of file action.c.

◆ crs_feature_comp_dat

const char crs_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"shortcut\tshortcut\n"

Definition at line 1148 of file action.c.

◆ crs_feature_dat

const char crs_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1142 of file action.c.

◆ crs_file_dat

const char crs_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n"

Definition at line 1136 of file action.c.

◆ crs_install_exec_seq_dat

const char crs_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"RemoveShortcuts\t\t3000\n"
"rs_immediate\tREMOVE\t3001\n"
"rs_deferred\tREMOVE\t3002\n"
"CreateShortcuts\t\t3100\n"
"cs_immediate\tNOT REMOVE\t3101\n"
"cs_deferred\tNOT REMOVE\t3102\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1166 of file action.c.

◆ crs_shortcut_dat

const char crs_shortcut_dat[]
static
Initial value:
=
"Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
"s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n"
"Shortcut\tShortcut\n"
"shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n"

Definition at line 1160 of file action.c.

◆ crs_tables

const msi_table crs_tables[]
static
Initial value:
=
{
ADD_TABLE(crs_component),
ADD_TABLE(crs_feature),
ADD_TABLE(crs_feature_comp),
ADD_TABLE(crs_file),
ADD_TABLE(crs_shortcut),
ADD_TABLE(crs_install_exec_seq),
ADD_TABLE(crs_custom_action),
}

Definition at line 2191 of file action.c.

Referenced by test_create_remove_shortcut().

◆ cwd_component_dat

const char cwd_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"augustus\t\tMSITESTDIR\t0\t\taugustus\n"

Definition at line 496 of file action.c.

◆ df_directory_dat

const char df_directory_dat[]
static
Initial value:
=
"Directory\tDirectory_Parent\tDefaultDir\n"
"s72\tS72\tl255\n"
"Directory\tDirectory\n"
"THIS\tMSITESTDIR\tthis\n"
"DOESNOT\tTHIS\tdoesnot\n"
"NONEXISTENT\tDOESNOT\texist\n"
"MSITESTDIR\tProgramFilesFolder\tmsitest\n"
"ProgramFilesFolder\tTARGETDIR\t.\n"
"TARGETDIR\t\tSourceDir"

Definition at line 606 of file action.c.

◆ df_duplicate_file_dat

const char df_duplicate_file_dat[]
static
Initial value:
=
"FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
"s72\ts72\ts72\tS255\tS72\n"
"DuplicateFile\tFileKey\n"
"maximus\tmaximus\tmaximus\taugustus\t\n"
"caesar\tmaximus\tmaximus\t\tNONEXISTENT\n"
"augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n"

Definition at line 617 of file action.c.

◆ df_tables

const msi_table df_tables[]
static
Initial value:
=
{
ADD_TABLE(rof_component),
ADD_TABLE(df_directory),
ADD_TABLE(rof_feature),
ADD_TABLE(rof_feature_comp),
ADD_TABLE(rof_file),
ADD_TABLE(install_exec_seq),
ADD_TABLE(rof_media),
ADD_TABLE(df_duplicate_file),
}

Definition at line 2036 of file action.c.

Referenced by test_duplicate_files().

◆ directory_dat

const char directory_dat[]
static
Initial value:
=
"Directory\tDirectory_Parent\tDefaultDir\n"
"s72\tS72\tl255\n"
"Directory\tDirectory\n"
"CABOUTDIR\tMSITESTDIR\tcabout\n"
"CHANGEDDIR\tMSITESTDIR\tchanged:second\n"
"FIRSTDIR\tMSITESTDIR\tfirst\n"
"MSITESTDIR\tProgramFilesFolder\tmsitest\n"
"NEWDIR\tCABOUTDIR\tnew\n"
"ProgramFilesFolder\tTARGETDIR\t.\n"
"TARGETDIR\t\tSourceDir"

Definition at line 67 of file action.c.

◆ env_custom_action_dat

const char env_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"wes_immediate\t1\tcustom.dll\tenv_absent\n"
"wes_deferred\t1025\tcustom.dll\tenv_present\n"
"res_immediate\t1\tcustom.dll\tenv_present\n"
"res_deferred\t1025\tcustom.dll\tenv_absent\n"

Definition at line 195 of file action.c.

◆ env_environment_dat

const char env_environment_dat[]
static

Definition at line 204 of file action.c.

◆ env_install_exec_seq_dat

const char env_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t100\n"
"FileCost\t\t200\n"
"CostFinalize\t\t300\n"
"InstallValidate\t\t400\n"
"InstallInitialize\t\t500\n"
"ProcessComponents\t\t600\n"
"WriteEnvironmentStrings\t\t700\n"
"wes_immediate\tNOT REMOVE\t701\n"
"wes_deferred\tNOT REMOVE\t702\n"
"RemoveEnvironmentStrings\t\t800\n"
"res_immediate\tREMOVE\t801\n"
"res_deferred\tREMOVE\t802\n"
"RegisterProduct\t\t900\n"
"PublishFeatures\t\t1000\n"
"PublishProduct\t\t1100\n"
"UnpublishFeatures\t\t1150\n"
"InstallFinalize\t\t1200\n"

Definition at line 173 of file action.c.

◆ env_tables

const msi_table env_tables[]
static
Initial value:
=
{
ADD_TABLE(component),
ADD_TABLE(feature_comp),
ADD_TABLE(env_install_exec_seq),
ADD_TABLE(env_custom_action),
}
INTERNETFEATURELIST feature
Definition: misc.c:1719

Definition at line 1969 of file action.c.

Referenced by test_envvar().

◆ feature_comp_dat

const char feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"Five\tFive\n"
"Four\tFour\n"
"One\tOne\n"
"Three\tThree\n"
"Two\tTwo\n"
"feature\tcomponent\n"
"service_feature\tservice_comp\n"
"service_feature\tservice_comp2\n"
"service_feature\tservice_comp3"

Definition at line 91 of file action.c.

◆ feature_dat

const char feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n"
"Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n"
"One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n"
"Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n"
"Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n"
"feature\t\t\t\t2\t1\tTARGETDIR\t0\n"
"service_feature\t\t\t\t2\t1\tTARGETDIR\t0"

Definition at line 79 of file action.c.

◆ file_dat

const char file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n"
"four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n"
"one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n"
"three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n"
"two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n"
"file\tcomponent\tfilename\t100\t\t\t8192\t1\n"
"service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t6\n"
"service_file2\tservice_comp2\tservice2.exe\t100\t\t\t8192\t7"

Definition at line 105 of file action.c.

◆ font_component_dat

const char font_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t0\t\tfont.ttf\n"

Definition at line 883 of file action.c.

◆ font_custom_action_dat

const char font_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rf_immediate\t1\tcustom.dll\tfont_absent\n"
"rf_deferred\t1025\tcustom.dll\tfont_present\n"
"uf_immediate\t1\tcustom.dll\tfont_present\n"
"uf_deferred\t1025\tcustom.dll\tfont_absent\n"

Definition at line 927 of file action.c.

◆ font_dat

const char font_dat[]
static
Initial value:
=
"File_\tFontTitle\n"
"s72\tS128\n"
"Font\tFile_\n"
"font.ttf\tmsi test font\n"

Definition at line 895 of file action.c.

◆ font_feature_comp_dat

const char font_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"fonts\tfonts\n"

Definition at line 889 of file action.c.

◆ font_feature_dat

const char font_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 877 of file action.c.

◆ font_file_dat

const char font_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n"

Definition at line 871 of file action.c.

◆ font_install_exec_seq_dat

const char font_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"ValidateProductID\t\t700\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t3500\n"
"InstallFiles\t\t4000\n"
"RegisterFonts\t\t4100\n"
"rf_immediate\tNOT REMOVE\t4101\n"
"rf_deferred\tNOT REMOVE\t4102\n"
"UnregisterFonts\t\t4200\n"
"uf_immediate\tREMOVE\t4201\n"
"uf_deferred\tREMOVE\t4202\n"
"RegisterUser\t\t6000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6300\n"
"PublishProduct\t\t6400\n"
"UnpublishFeatures\t\t6500\n"
"InstallFinalize\t\t6600"

Definition at line 901 of file action.c.

◆ font_media_dat

const char font_media_dat[]
static
Initial value:
=
"DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
"i2\ti4\tL64\tS255\tS32\tS72\n"
"Media\tDiskId\n"
"1\t3\t\t\tDISK1\t\n"

Definition at line 865 of file action.c.

◆ font_tables

const msi_table font_tables[]
static
Initial value:
=
{
ADD_TABLE(font_component),
ADD_TABLE(font_feature),
ADD_TABLE(font_feature_comp),
ADD_TABLE(font_file),
ADD_TABLE(font_install_exec_seq),
ADD_TABLE(font_custom_action),
ADD_TABLE(font_media),
}
Definition: mk_font.cpp:20

Definition at line 2134 of file action.c.

Referenced by test_register_font().

◆ frp_component_dat

const char frp_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n"

Definition at line 1350 of file action.c.

◆ frp_custom_action_dat

const char frp_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\tISComments\n"
"s72\ti2\tS64\tS0\tS255\n"
"CustomAction\tAction\n"
"TestProp\t19\t\t\tPROP set\n"

Definition at line 1356 of file action.c.

◆ frp_feature_comp_dat

const char frp_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"product\tproduct\n"

Definition at line 1344 of file action.c.

◆ frp_feature_dat

const char frp_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1338 of file action.c.

◆ frp_file_dat

const char frp_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n"

Definition at line 1332 of file action.c.

◆ frp_install_exec_seq_dat

const char frp_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"FindRelatedProducts\t\t50\n"
"TestProp\tPROP AND NOT REMOVE\t51\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1368 of file action.c.

◆ frp_tables

const msi_table frp_tables[]
static
Initial value:
=
{
ADD_TABLE(frp_component),
ADD_TABLE(frp_feature),
ADD_TABLE(frp_feature_comp),
ADD_TABLE(frp_file),
ADD_TABLE(frp_upgrade),
ADD_TABLE(frp_custom_action),
ADD_TABLE(frp_install_exec_seq),
}

Definition at line 2233 of file action.c.

Referenced by test_find_related_products().

◆ frp_upgrade_dat

const char frp_upgrade_dat[]
static
Initial value:
=
"UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
"s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
"Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
"{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n"

Definition at line 1362 of file action.c.

◆ ini_component_dat

const char ini_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n"

Definition at line 1407 of file action.c.

◆ ini_custom_action_dat

const char ini_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"wiv_immediate\t1\tcustom.dll\tini_absent\n"
"wiv_deferred\t1025\tcustom.dll\tini_present\n"
"riv_immediate\t1\tcustom.dll\tini_present\n"
"riv_deferred\t1025\tcustom.dll\tini_absent\n"

Definition at line 1450 of file action.c.

◆ ini_feature_comp_dat

const char ini_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"inifile\tinifile\n"

Definition at line 1401 of file action.c.

◆ ini_feature_dat

const char ini_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1395 of file action.c.

◆ ini_file_dat

const char ini_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n"

Definition at line 1389 of file action.c.

◆ ini_ini_file_dat

const char ini_ini_file_dat[]
static
Initial value:
=
"IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
"s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"
"IniFile\tIniFile\n"
"inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n"

Definition at line 1413 of file action.c.

◆ ini_install_exec_seq_dat

const char ini_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"RemoveIniValues\t\t3000\n"
"riv_immediate\tREMOVE\t3001\n"
"riv_deferred\tREMOVE\t3002\n"
"WriteIniValues\t\t3100\n"
"wiv_immediate\tNOT REMOVE\t3101\n"
"wiv_deferred\tNOT REMOVE\t3102\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1425 of file action.c.

◆ ini_remove_ini_file_dat

const char ini_remove_ini_file_dat[]
static
Initial value:
=
"RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"
"s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n"
"RemoveIniFile\tRemoveIniFile\n"
"inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n"

Definition at line 1419 of file action.c.

◆ ini_tables

const msi_table ini_tables[]
static
Initial value:
=
{
ADD_TABLE(ini_component),
ADD_TABLE(ini_feature),
ADD_TABLE(ini_feature_comp),
ADD_TABLE(ini_file),
ADD_TABLE(ini_ini_file),
ADD_TABLE(ini_remove_ini_file),
ADD_TABLE(ini_install_exec_seq),
ADD_TABLE(ini_custom_action),
}

Definition at line 2247 of file action.c.

Referenced by test_ini_values().

◆ install_exec_seq_dat

const char install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"AllocateRegistrySpace\tNOT Installed\t1550\n"
"CostFinalize\t\t1000\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"ResolveSource\t\t950\n"
"MoveFiles\t\t1700\n"
"InstallFiles\t\t4000\n"
"DuplicateFiles\t\t4500\n"
"CreateShortcuts\t\t4600\n"
"InstallServices\t\t5000\n"
"InstallFinalize\t\t6600\n"
"InstallInitialize\t\t1500\n"
"InstallValidate\t\t1400\n"
"LaunchConditions\t\t100\n"
"WriteRegistryValues\tSourceDir And SOURCEDIR\t5000"

Definition at line 118 of file action.c.

◆ is_64bit

const BOOL is_64bit = sizeof(void *) > sizeof(int)
static

Definition at line 46 of file action.c.

◆ is_wow64

BOOL is_wow64
static

Definition at line 45 of file action.c.

◆ media_dat

const char media_dat[]
static
Initial value:
=
"DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
"i2\ti4\tL64\tS255\tS32\tS72\n"
"Media\tDiskId\n"
"1\t3\t\t\tDISK1\t\n"
"2\t7\t\tmsitest.cab\tDISK2\t\n"

Definition at line 138 of file action.c.

◆ mov_custom_action_dat

const char mov_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"mov_immediate\t1\tcustom.dll\tmov_absent\n"
"mov_deferred\t1025\tcustom.dll\tmov_present\n"

Definition at line 599 of file action.c.

◆ mov_install_exec_seq_dat

const char mov_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t100\n"
"FileCost\t\t200\n"
"ResolveSource\t\t300\n"
"CostFinalize\t\t400\n"
"InstallValidate\t\t500\n"
"InstallInitialize\t\t600\n"
"MoveFiles\t\t700\n"
"mov_immediate\t\t701\n"
"mov_deferred\t\t702\n"
"InstallFiles\t\t800\n"
"InstallFinalize\t\t900\n"

Definition at line 583 of file action.c.

◆ mov_move_file_dat

const char mov_move_file_dat[]
static
Initial value:
=
"FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n"
"s72\ts72\tS255\tS255\tS72\ts72\ti2\n"
"MoveFile\tFileKey\n"
"abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n"
"bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n"
"cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n"
"denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n"
"ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n"
"fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n"
"gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n"
"haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n"
"iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n"
"jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n"
"kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n"
"laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n"
"namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n"
"pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n"
"wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n"
"single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n"
"wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n"
"singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n"

Definition at line 560 of file action.c.

◆ mov_tables

const msi_table mov_tables[]
static
Initial value:
=
{
ADD_TABLE(cwd_component),
ADD_TABLE(rof_feature),
ADD_TABLE(ci2_feature_comp),
ADD_TABLE(ci2_file),
ADD_TABLE(mov_install_exec_seq),
ADD_TABLE(mov_custom_action),
ADD_TABLE(rof_media),
ADD_TABLE(mov_move_file),
}

Definition at line 2022 of file action.c.

Referenced by test_move_files().

◆ msifile

◆ odbc_component_dat

const char odbc_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"odbc64\t{B6F3E4AF-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t256\tMsix64\tODBCdriver.dll\n"
"odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t0\t\tODBCdriver.dll\n"

Definition at line 1003 of file action.c.

◆ odbc_custom_action_dat

const char odbc_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"io_immediate\t1\tcustom.dll\todbc_absent\n"
"io_deferred\t1025\tcustom.dll\todbc_present\n"
"ro_immediate\t1\tcustom.dll\todbc_present\n"
"ro_deferred\t1025\tcustom.dll\todbc_absent\n"

Definition at line 1057 of file action.c.

◆ odbc_datasource_dat

const char odbc_datasource_dat[]
static
Initial value:
=
"DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n"
"s72\ts72\ts255\ts255\ti2\n"
"ODBCDataSource\tDataSource\n"
"ODBC data source\todbc\tODBC data source\tODBC driver\t0\n"

Definition at line 1026 of file action.c.

◆ odbc_driver_dat

const char odbc_driver_dat[]
static
Initial value:
=
"Driver\tComponent_\tDescription\tFile_\tFile_Setup\n"
"s72\ts72\ts255\ts72\tS72\n"
"ODBCDriver\tDriver\n"
"64-bit driver\todbc64\tODBC test driver\tODBCdriver.dll\t\n"
"64-bit driver2\todbc64\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n"
"ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n"
"ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n"

Definition at line 1010 of file action.c.

◆ odbc_feature_comp_dat

const char odbc_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"odbc\todbc64\n"
"odbc\todbc\n"

Definition at line 996 of file action.c.

◆ odbc_feature_dat

const char odbc_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 990 of file action.c.

◆ odbc_file_dat

const char odbc_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n"
"ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n"
"ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n"
"ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n"
"ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n"

Definition at line 980 of file action.c.

◆ odbc_install_exec_seq_dat

const char odbc_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"InstallODBC\t\t3000\n"
"io_immediate\tNOT REMOVE\t3001\n"
"io_deferred\tNOT REMOVE\t3002\n"
"RemoveODBC\t\t3100\n"
"ro_immediate\tREMOVE\t3101\n"
"ro_deferred\tREMOVE\t3102\n"
"RemoveFiles\t\t3900\n"
"InstallFiles\t\t4000\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1032 of file action.c.

◆ odbc_media_dat

const char odbc_media_dat[]
static
Initial value:
=
"DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
"i2\ti4\tL64\tS255\tS32\tS72\n"
"Media\tDiskId\n"
"1\t5\t\t\tDISK1\t\n"

Definition at line 1066 of file action.c.

◆ odbc_tables

const msi_table odbc_tables[]
static
Initial value:
=
{
ADD_TABLE(odbc_component),
ADD_TABLE(odbc_feature),
ADD_TABLE(odbc_feature_comp),
ADD_TABLE(odbc_file),
ADD_TABLE(odbc_driver),
ADD_TABLE(odbc_translator),
ADD_TABLE(odbc_datasource),
ADD_TABLE(odbc_install_exec_seq),
ADD_TABLE(odbc_custom_action),
ADD_TABLE(odbc_media),
}

Definition at line 2161 of file action.c.

Referenced by test_install_remove_odbc().

◆ odbc_translator_dat

const char odbc_translator_dat[]
static
Initial value:
=
"Translator\tComponent_\tDescription\tFile_\tFile_Setup\n"
"s72\ts72\ts255\ts72\tS72\n"
"ODBCTranslator\tTranslator\n"
"ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n"
"ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n"

Definition at line 1019 of file action.c.

◆ pa_component_dat

const char pa_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"fake_local\t{F515549D-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\tfake_local.txt\n"
"win32\t{F515549E-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\twin32.txt\n"
"win32_local\t{D34D3FBA-6789-4E57-AD1A-1281297DC201}\tMSITESTDIR\t0\t\twin32_local.txt\n"
"dotnet\t{8943164F-2B31-4C09-A894-493A8CBDE0A4}\tMSITESTDIR\t0\t\tdotnet.txt\n"
"dotnet_local\t{4E8567E8-8EAE-4E36-90F1-B99D33C663F8}\tMSITESTDIR\t0\t\tdotnet_local.txt\n"

Definition at line 1816 of file action.c.

◆ pa_custom_action_dat

const char pa_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"pa_immediate\t1\tcustom.dll\tpa_absent\n"
"pa_deferred\t1025\tcustom.dll\tpa_present\n"
"ua_immediate\t1\tcustom.dll\tpa_present\n"
"ua_deferred\t1025\tcustom.dll\tpa_absent\n"

Definition at line 1889 of file action.c.

◆ pa_feature_comp_dat

const char pa_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"assembly\tfake_local\n"
"assembly\twin32\n"
"assembly\twin32_local\n"
"assembly\tdotnet\n"
"assembly\tdotnet_local\n"

Definition at line 1806 of file action.c.

◆ pa_feature_dat

const char pa_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"assembly\t\t\tassembly feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1800 of file action.c.

◆ pa_file_dat

const char pa_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"fake_local.txt\tfake_local\tfake_local.txt\t1000\t\t\t8192\t1\n"
"win32.txt\twin32\twin32.txt\t1000\t\t\t8192\t1\n"
"manifest.txt\twin32\tmanifest.txt\t1000\t\t\t8192\t1\n"
"win32_local.txt\twin32_local\twin32_local.txt\t1000\t\t\t8192\t1\n"
"manifest_local.txt\twin32_local\tmanifest_local.txt\t1000\t\t\t8192\t1\n"
"dotnet.txt\tdotnet\tdotnet.txt\t1000\t\t\t8192\t1\n"
"dotnet_local.txt\tdotnet_local\tdotnet_local.txt\t1000\t\t\t8192\t1\n"
"application_win32.txt\twin32_local\tapplication_win32.txt\t1000\t\t\t8192\t1\n"
"application_dotnet.txt\tdotnet_local\tapplication_dotnet.txt\t1000\t\t\t8192\t1\n"

Definition at line 1786 of file action.c.

◆ pa_install_exec_seq_dat

const char pa_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"MsiPublishAssemblies\t\t3000\n"
"pa_immediate\tNOT REMOVE AND NOT ALLUSERS\t3001\n"
"pa_deferred\tNOT REMOVE AND NOT ALLUSERS\t3002\n"
"MsiUnpublishAssemblies\t\t4000\n"
"ua_immediate\tREMOVE AND NOT ALLUSERS\t4001\n"
"ua_deferred\tREMOVE AND NOT ALLUSERS\t4002\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1866 of file action.c.

◆ pa_msi_assembly_dat

const char pa_msi_assembly_dat[]
static
Initial value:
=
"Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"
"s72\ts38\tS72\tS72\tI2\n"
"MsiAssembly\tComponent_\n"
"fake_local\tassembly\t\tnonexistent.txt\t0\n"
"win32\tassembly\tmanifest.txt\t\t1\n"
"win32_local\tassembly\tmanifest_local.txt\tapplication_win32.txt\t1\n"
"dotnet\tassembly\t\t\t0\n"
"dotnet_local\tassembly\t\tapplication_dotnet.txt\t0\n"

Definition at line 1826 of file action.c.

◆ pa_msi_assembly_name_dat

const char pa_msi_assembly_name_dat[]
static
Initial value:
=
"Component_\tName\tValue\n"
"s72\ts255\ts255\n"
"MsiAssemblyName\tComponent_\tName\n"
"fake_local\tName\tWine.Fake.Application.Assembly\n"
"fake_local\tprocessorArchitecture\tx86\n"
"fake_local\tpublicKeyToken\tabcdef0123456789\n"
"fake_local\ttype\twin32\n"
"fake_local\tversion\t1.0.0.0\n"
"win32\tName\tWine.Win32.Assembly\n"
"win32\tprocessorArchitecture\tx86\n"
"win32\tpublicKeyToken\tabcdef0123456789\n"
"win32\ttype\twin32\n"
"win32\tversion\t1.0.0.0\n"
"win32_local\tName\tWine.Win32.Local.Assembly\n"
"win32_local\tprocessorArchitecture\tx86\n"
"win32_local\tpublicKeyToken\tabcdef0123456789\n"
"win32_local\ttype\twin32\n"
"win32_local\tversion\t1.0.0.0\n"
"dotnet\tName\tWine.Dotnet.Assembly\n"
"dotnet\tprocessorArchitecture\tMSIL\n"
"dotnet\tpublicKeyToken\tabcdef0123456789\n"
"dotnet\tculture\tneutral\n"
"dotnet\tversion\t1.0.0.0\n"
"dotnet_local\tName\tWine.Dotnet.Local.Assembly\n"
"dotnet_local\tprocessorArchitecture\tMSIL\n"
"dotnet_local\tpublicKeyToken\tabcdef0123456789\n"
"dotnet_local\tculture\tneutral\n"
"dotnet_local\tversion\t1.0.0.0\n"

Definition at line 1836 of file action.c.

◆ pa_tables

const msi_table pa_tables[]
static
Initial value:
=
{
ADD_TABLE(pa_component),
ADD_TABLE(pa_feature),
ADD_TABLE(pa_feature_comp),
ADD_TABLE(pa_file),
ADD_TABLE(pa_msi_assembly),
ADD_TABLE(pa_msi_assembly_name),
ADD_TABLE(pa_install_exec_seq),
ADD_TABLE(pa_custom_action),
}

Definition at line 2327 of file action.c.

Referenced by test_publish_assemblies().

◆ pp_component_dat

const char pp_component_dat[]
static
Initial value:
=
"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\t\tmaximus\n"

Definition at line 462 of file action.c.

◆ pp_custom_action_dat

const char pp_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"pf_immediate\t1\tcustom.dll\tpf_absent\n"
"pf_deferred\t1025\tcustom.dll\tpf_present\n"
"uf_immediate\t1\tcustom.dll\tpf_present\n"
"uf_deferred\t1025\tcustom.dll\tpf_absent\n"
"pp_immediate\t1\tcustom.dll\tpp_absent\n"
"pp_deferred\t1025\tcustom.dll\tpp_present\n"
"rp_immediate\t1\tcustom.dll\trp_absent\n"
"rp_deferred\t1025\tcustom.dll\trp_present\n"
"ru_immediate\t1\tcustom.dll\tru_absent\n"
"ru_deferred\t1025\tcustom.dll\tru_present\n"
"ppc_immediate\t1\tcustom.dll\tppc_absent\n"
"ppc_deferred\t1025\tcustom.dll\tppc_present\n"

Definition at line 445 of file action.c.

◆ pp_install_exec_seq_dat

const char pp_install_exec_seq_dat[]
static

Definition at line 413 of file action.c.

◆ pp_tables

const msi_table pp_tables[]
static
Initial value:
=
{
ADD_TABLE(pp_component),
ADD_TABLE(rof_feature),
ADD_TABLE(rof_feature_comp),
ADD_TABLE(rof_file),
ADD_TABLE(pp_install_exec_seq),
ADD_TABLE(pp_custom_action),
ADD_TABLE(rof_media),
}

Definition at line 1983 of file action.c.

Referenced by test_publish(), test_publish_features(), test_publish_product(), test_publish_sourcelist(), test_register_product(), and test_register_user().

◆ ppc_component_dat

const char ppc_component_dat[]
static
Initial value:
=
"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\t\tmaximus\n"
"augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n"

Definition at line 468 of file action.c.

◆ ppc_feature_comp_dat

const char ppc_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"feature\tmaximus\n"
"feature\taugustus\n"
"montecristo\tmaximus"

Definition at line 488 of file action.c.

◆ ppc_file_dat

const char ppc_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n"
"augustus\taugustus\taugustus\t500\t\t\t8192\t2"

Definition at line 475 of file action.c.

◆ ppc_media_dat

const char ppc_media_dat[]
static
Initial value:
=
"DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
"i2\ti4\tL64\tS255\tS32\tS72\n"
"Media\tDiskId\n"
"1\t2\t\t\tDISK1\t\n"

Definition at line 482 of file action.c.

◆ ppc_tables

const msi_table ppc_tables[]
static
Initial value:
=
{
ADD_TABLE(ppc_component),
ADD_TABLE(rof_feature),
ADD_TABLE(ppc_feature_comp),
ADD_TABLE(ppc_file),
ADD_TABLE(pp_install_exec_seq),
ADD_TABLE(pp_custom_action),
ADD_TABLE(ppc_media),
}

Definition at line 1996 of file action.c.

Referenced by test_process_components().

◆ property_dat

const char property_dat[]
static
Initial value:
=
"Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"DefaultUIFont\tDlgFont8\n"
"HASUIRUN\t0\n"
"INSTALLLEVEL\t3\n"
"InstallMode\tTypical\n"
"Manufacturer\tWine\n"
"PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
"ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
"ProductID\tnone\n"
"ProductLanguage\t1033\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"PROMPTROLLBACKCOST\tP\n"
"Setup\tSetup\n"
"UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
"AdminProperties\tPOSTADMIN\n"
"ROOTDRIVE\tC:\\\n"
"SERVNAME\tTestService\n"
"SERVNAME2\tTestService2\n"
"SERVDISP\tTestServiceDisp\n"
"SERVDISP2\tTestServiceDisp2\n"
"MSIFASTINSTALL\t1\n"
"ARPNOMODIFY\t1\n"
"regdata17\t#1\n"

Definition at line 145 of file action.c.

◆ pub_component_dat

const char pub_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t0\t\tenglish.txt\n"

Definition at line 1218 of file action.c.

◆ pub_custom_action_dat

const char pub_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"pub_immediate\t1\tcustom.dll\tpub_absent\n"
"pub_deferred\t1025\tcustom.dll\tpub_present\n"
"unp_immediate\t1\tcustom.dll\tpub_present\n"
"unp_deferred\t1025\tcustom.dll\tpub_absent\n"

Definition at line 1255 of file action.c.

◆ pub_feature_comp_dat

const char pub_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"publish\tpublish\n"

Definition at line 1212 of file action.c.

◆ pub_feature_dat

const char pub_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1206 of file action.c.

◆ pub_file_dat

const char pub_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n"

Definition at line 1200 of file action.c.

◆ pub_install_exec_seq_dat

const char pub_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"PublishComponents\t\t3000\n"
"pub_immediate\tNOT REMOVE\t3001\n"
"pub_deferred\tNOT REMOVE\t3002\n"
"UnpublishComponents\t\t3100\n"
"unp_immediate\tREMOVE\t3101\n"
"unp_deferred\tREMOVE\t3102\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1230 of file action.c.

◆ pub_publish_component_dat

const char pub_publish_component_dat[]
static
Initial value:
=
"ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n"
"s38\ts255\ts72\tL255\ts38\n"
"PublishComponent\tComponentId\tQualifier\tComponent_\n"
"{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n"

Definition at line 1224 of file action.c.

◆ pub_tables

const msi_table pub_tables[]
static
Initial value:
=
{
ADD_TABLE(pub_component),
ADD_TABLE(pub_feature),
ADD_TABLE(pub_feature_comp),
ADD_TABLE(pub_file),
ADD_TABLE(pub_publish_component),
ADD_TABLE(pub_install_exec_seq),
ADD_TABLE(pub_custom_action),
}

Definition at line 2205 of file action.c.

Referenced by test_publish_components().

◆ rci_appid_dat

const char rci_appid_dat[]
static
Initial value:
=
"AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n"
"s38\tS255\tS255\tS255\tS255\tI2\tI2\n"
"AppId\tAppId\n"
"{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n"

Definition at line 1483 of file action.c.

◆ rci_class_dat

const char rci_class_dat[]
static
Initial value:
=
"CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n"
"s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n"
"Class\tCLSID\tContext\tComponent_\n"
"{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n"

Definition at line 1489 of file action.c.

◆ rci_component_dat

const char rci_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n"

Definition at line 1477 of file action.c.

◆ rci_custom_action_dat

const char rci_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rci_immediate\t1\tcustom.dll\trci_absent\n"
"rci_deferred\t1025\tcustom.dll\trci_present\n"
"uci_immediate\t1\tcustom.dll\trci_present\n"
"uci_deferred\t1025\tcustom.dll\trci_absent\n"

Definition at line 1520 of file action.c.

◆ rci_feature_comp_dat

const char rci_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"class\tclass\n"

Definition at line 1471 of file action.c.

◆ rci_feature_dat

const char rci_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1465 of file action.c.

◆ rci_file_dat

const char rci_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n"

Definition at line 1459 of file action.c.

◆ rci_install_exec_seq_dat

const char rci_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"UnregisterClassInfo\t\t3000\n"
"uci_immediate\tREMOVE\t3001\n"
"uci_deferred\tREMOVE\t3002\n"
"RegisterClassInfo\t\t4000\n"
"rci_immediate\tNOT REMOVE\t4001\n"
"rci_deferred\tNOT REMOVE\t4002\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1495 of file action.c.

◆ rci_tables

const msi_table rci_tables[]
static
Initial value:
=
{
ADD_TABLE(rci_component),
ADD_TABLE(rci_feature),
ADD_TABLE(rci_feature_comp),
ADD_TABLE(rci_file),
ADD_TABLE(rci_appid),
ADD_TABLE(rci_class),
ADD_TABLE(rci_install_exec_seq),
ADD_TABLE(rci_custom_action),
}

Definition at line 2262 of file action.c.

Referenced by test_register_class_info().

◆ rd_component_dat

const char rd_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n"
"duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n"

Definition at line 1284 of file action.c.

◆ rd_custom_action_dat

const char rd_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"df_immediate\t1\tcustom.dll\trd_absent\n"
"df_deferred\t1025\tcustom.dll\trd_present\n"
"rd_immediate\t1\tcustom.dll\trd_present\n"
"rd_deferred\t1025\tcustom.dll\trd_absent\n"

Definition at line 1323 of file action.c.

◆ rd_duplicate_file_dat

const char rd_duplicate_file_dat[]
static
Initial value:
=
"FileKey\tComponent_\tFile_\tDestName\tDestFolder\n"
"s72\ts72\ts72\tS255\tS72\n"
"DuplicateFile\tFileKey\n"
"duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n"
"duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n"
"duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n"

Definition at line 1291 of file action.c.

◆ rd_feature_comp_dat

const char rd_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"duplicate\tduplicate\n"

Definition at line 1278 of file action.c.

◆ rd_feature_dat

const char rd_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1272 of file action.c.

◆ rd_file_dat

const char rd_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n"
"original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n"
"original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n"

Definition at line 1264 of file action.c.

◆ rd_install_exec_seq_dat

const char rd_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveDuplicateFiles\t\t1900\n"
"rd_immediate\tREMOVE\t1901\n"
"rd_deferred\tREMOVE\t1902\n"
"InstallFiles\t\t2000\n"
"DuplicateFiles\t\t2100\n"
"df_immediate\tNOT REMOVE\t2101\n"
"df_deferred\tNOT REMOVE\t2102\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1299 of file action.c.

◆ rd_tables

const msi_table rd_tables[]
static
Initial value:
=
{
ADD_TABLE(rd_component),
ADD_TABLE(rd_feature),
ADD_TABLE(rd_feature_comp),
ADD_TABLE(rd_file),
ADD_TABLE(rd_duplicate_file),
ADD_TABLE(rd_install_exec_seq),
ADD_TABLE(rd_custom_action),
}

Definition at line 2219 of file action.c.

Referenced by test_remove_duplicate_files().

◆ rei_component_dat

const char rei_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n"

Definition at line 1547 of file action.c.

◆ rei_custom_action_dat

const char rei_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rei_immediate\t1\tcustom.dll\trei_absent\n"
"rei_deferred\t1025\tcustom.dll\trei_present\n"
"uei_immediate\t1\tcustom.dll\trei_present\n"
"uei_deferred\t1025\tcustom.dll\trei_absent\n"

Definition at line 1596 of file action.c.

◆ rei_extension_dat

const char rei_extension_dat[]
static
Initial value:
=
"Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
"s255\ts72\tS255\tS64\ts38\n"
"Extension\tExtension\tComponent_\n"
"extension\textension\tProg.Id.1\t\textension\n"

Definition at line 1553 of file action.c.

◆ rei_feature_comp_dat

const char rei_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"extension\textension\n"

Definition at line 1541 of file action.c.

◆ rei_feature_dat

const char rei_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1535 of file action.c.

◆ rei_file_dat

const char rei_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n"

Definition at line 1529 of file action.c.

◆ rei_install_exec_seq_dat

const char rei_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"UnregisterExtensionInfo\t\t3000\n"
"uei_immediate\tREMOVE\t3001\n"
"uei_deferred\tREMOVE\t3002\n"
"RegisterExtensionInfo\t\t4000\n"
"rei_immediate\tNOT REMOVE\t4001\n"
"rei_deferred\tNOT REMOVE\t4002\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1571 of file action.c.

◆ rei_progid_dat

const char rei_progid_dat[]
static
Initial value:
=
"ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n"
"s255\tS255\tS38\tL255\tS72\tI2\n"
"ProgId\tProgId\n"
"Prog.Id.1\t\t\tdescription\t\t\n"

Definition at line 1565 of file action.c.

◆ rei_tables

const msi_table rei_tables[]
static
Initial value:
=
{
ADD_TABLE(rei_component),
ADD_TABLE(rei_feature),
ADD_TABLE(rei_feature_comp),
ADD_TABLE(rei_file),
ADD_TABLE(rei_extension),
ADD_TABLE(rei_verb),
ADD_TABLE(rei_progid),
ADD_TABLE(rei_install_exec_seq),
ADD_TABLE(rei_custom_action),
}

Definition at line 2277 of file action.c.

Referenced by test_register_extension_info().

◆ rei_verb_dat

const char rei_verb_dat[]
static
Initial value:
=
"Extension_\tVerb\tSequence\tCommand\tArgument\n"
"s255\ts32\tI2\tL255\tL255\n"
"Verb\tExtension_\tVerb\n"
"extension\tOpen\t1\t&Open\t/argument\n"

Definition at line 1559 of file action.c.

◆ rem_component_dat

const char rem_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n"
"helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n"
"lithium\t\tMSITESTDIR\t2\t\tlithium\n"

Definition at line 502 of file action.c.

◆ rem_feature_comp_dat

const char rem_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"feature\thydrogen\n"
"feature\thelium\n"
"feature\tlithium"

Definition at line 510 of file action.c.

◆ rem_file_dat

const char rem_file_dat[]
static
Initial value:
=
"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"

Definition at line 518 of file action.c.

◆ rem_install_exec_seq_dat

const char rem_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"ValidateProductID\t\t700\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t3500\n"
"InstallFiles\t\t4000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6300\n"
"PublishProduct\t\t6400\n"
"UnpublishFeatures\t\t6500\n"
"InstallFinalize\t\t6600"

Definition at line 526 of file action.c.

◆ rem_remove_files_dat

const char rem_remove_files_dat[]
static
Initial value:
=
"FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"
"s72\ts72\tS255\ts72\tI2\n"
"RemoveFile\tFileKey\n"
"furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n"
"firkin\thelium\tfirkin\tMSITESTDIR\t1\n"
"fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n"
"becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n"
"dioptre\thelium\tdioptre\tMSITESTDIR\t2\n"
"attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n"
"storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n"
"block\thelium\tblock\tMSITESTDIR\t3\n"
"siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n"
"nanoacre\thydrogen\t\tCABOUTDIR\t3\n"

Definition at line 545 of file action.c.

◆ rem_tables

const msi_table rem_tables[]
static
Initial value:
=
{
ADD_TABLE(rem_component),
ADD_TABLE(rof_feature),
ADD_TABLE(rem_feature_comp),
ADD_TABLE(rem_file),
ADD_TABLE(rem_install_exec_seq),
ADD_TABLE(rof_media),
ADD_TABLE(rem_remove_files),
}

Definition at line 2009 of file action.c.

Referenced by test_remove_files().

◆ rep_component_dat

const char rep_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"rep\t{A24FAF2A-3B2E-41EF-AA78-331542E1A29D}\tMSITESTDIR\t0\t\trep.txt\n"

Definition at line 1916 of file action.c.

◆ rep_feature_comp_dat

const char rep_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"rep\trep\n"

Definition at line 1910 of file action.c.

◆ rep_feature_dat

const char rep_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"rep\t\t\trep feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1904 of file action.c.

◆ rep_file_dat

const char rep_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"rep.txt\trep\trep.txt\t1000\t\t\t8192\t1\n"

Definition at line 1898 of file action.c.

◆ rep_install_exec_seq_dat

const char rep_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"FindRelatedProducts\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"RemoveExistingProducts\t\t1499\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"UnregisterExtensionInfo\t\t3000\n"
"UnregisterMIMEInfo\t\t3500\n"
"RegisterExtensionInfo\t\t4000\n"
"RegisterMIMEInfo\t\t4500\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1945 of file action.c.

◆ rep_property_dat

const char rep_property_dat[]
static
Initial value:
=
"Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"HASUIRUN\t0\n"
"INSTALLLEVEL\t3\n"
"InstallMode\tTypical\n"
"Manufacturer\tWine\n"
"PIDTemplate\t###-#######\n"
"ProductCode\t{1699F0BB-0B61-4A89-AFE4-CFD60DFD76F3}\n"
"ProductLanguage\t1033\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"UpgradeCode\t{2967C1CC-34D4-42EE-8D96-CD6836F192BF}\n"
"PRODUCT\t2F41860D-7B4C-4DA7-BED9-B64F26594C56\n"
"MSIFASTINSTALL\t1\n"

Definition at line 1928 of file action.c.

◆ rep_tables

const msi_table rep_tables[]
static
Initial value:
=
{
ADD_TABLE(rep_component),
ADD_TABLE(rep_feature),
ADD_TABLE(rep_feature_comp),
ADD_TABLE(rep_file),
ADD_TABLE(rep_upgrade),
ADD_TABLE(rep_property),
ADD_TABLE(rep_install_exec_seq),
}

Definition at line 2342 of file action.c.

Referenced by test_remove_existing_products().

◆ rep_upgrade_dat

const char rep_upgrade_dat[]
static
Initial value:
=
"UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"
"s38\tS20\tS20\tS255\ti4\tS255\ts72\n"
"Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"
"{2967C1CC-34D4-42EE-8D96-CD6836F192BF}\t\t\t\t256\t\tPRODUCT\n"

Definition at line 1922 of file action.c.

◆ rmi_component_dat

const char rmi_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n"

Definition at line 1726 of file action.c.

◆ rmi_custom_action_dat

const char rmi_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rmi_immediate\t1\tcustom.dll\trmi_absent\n"
"rmi_deferred\t1025\tcustom.dll\trmi_present\n"
"umi_immediate\t1\tcustom.dll\trmi_present\n"
"umi_deferred\t1025\tcustom.dll\trmi_absent\n"

Definition at line 1777 of file action.c.

◆ rmi_extension_dat

const char rmi_extension_dat[]
static
Initial value:
=
"Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
"s255\ts72\tS255\tS64\ts38\n"
"Extension\tExtension\tComponent_\n"
"mime\tmime\t\tmime/type\tmime\n"

Definition at line 1732 of file action.c.

◆ rmi_feature_comp_dat

const char rmi_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"mime\tmime\n"

Definition at line 1720 of file action.c.

◆ rmi_feature_dat

const char rmi_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1714 of file action.c.

◆ rmi_file_dat

const char rmi_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n"

Definition at line 1708 of file action.c.

◆ rmi_install_exec_seq_dat

const char rmi_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"UnregisterExtensionInfo\t\t3000\n"
"UnregisterMIMEInfo\t\t3500\n"
"umi_immediate\tREMOVE\t3501\n"
"umi_deferred\tREMOVE\t3502\n"
"RegisterExtensionInfo\t\t4000\n"
"RegisterMIMEInfo\t\t4500\n"
"rmi_immediate\tNOT REMOVE\t4501\n"
"rmi_deferred\tNOT REMOVE\t4502\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1750 of file action.c.

◆ rmi_mime_dat

const char rmi_mime_dat[]
static
Initial value:
=
"ContentType\tExtension_\tCLSID\n"
"s64\ts255\tS38\n"
"MIME\tContentType\n"
"mime/type\tmime\t\n"

Definition at line 1744 of file action.c.

◆ rmi_tables

const msi_table rmi_tables[]
static
Initial value:
=
{
ADD_TABLE(rmi_component),
ADD_TABLE(rmi_feature),
ADD_TABLE(rmi_feature_comp),
ADD_TABLE(rmi_file),
ADD_TABLE(rmi_extension),
ADD_TABLE(rmi_verb),
ADD_TABLE(rmi_mime),
ADD_TABLE(rmi_install_exec_seq),
ADD_TABLE(rmi_custom_action),
}

Definition at line 2311 of file action.c.

Referenced by test_register_mime_info().

◆ rmi_verb_dat

const char rmi_verb_dat[]
static
Initial value:
=
"Extension_\tVerb\tSequence\tCommand\tArgument\n"
"s255\ts32\tI2\tL255\tL255\n"
"Verb\tExtension_\tVerb\n"
"mime\tOpen\t1\t&Open\t/argument\n"

Definition at line 1738 of file action.c.

◆ rof_component_dat

const char rof_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"

Definition at line 369 of file action.c.

◆ rof_feature_comp_dat

const char rof_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"feature\tmaximus\n"
"montecristo\tmaximus"

Definition at line 382 of file action.c.

◆ rof_feature_dat

const char rof_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
"montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0"

Definition at line 375 of file action.c.

◆ rof_file_dat

const char rof_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"maximus\tmaximus\tmaximus\t500\t\t\t8192\t1"

Definition at line 389 of file action.c.

◆ rof_media_dat

const char rof_media_dat[]
static
Initial value:
=
"DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"
"i2\ti4\tL64\tS255\tS32\tS72\n"
"Media\tDiskId\n"
"1\t1\t\t\tDISK1\t\n"

Definition at line 395 of file action.c.

◆ rpi_appid_dat

const char rpi_appid_dat[]
static
Initial value:
=
"AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n"
"s38\tS255\tS255\tS255\tS255\tI2\tI2\n"
"AppId\tAppId\n"
"{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n"

Definition at line 1629 of file action.c.

◆ rpi_class_dat

const char rpi_class_dat[]
static
Initial value:
=
"CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n"
"s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n"
"Class\tCLSID\tContext\tComponent_\n"
"{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tprogid\tWinetest.Class.1\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n"
"{904E6BC9-F57F-4412-B460-D40DE2F256E2}\tLocalServer\tprogid\tWinetest.VerClass\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n"
"{57C413FB-CA02-498A-81F6-7E769BDB7C97}\tLocalServer\tprogid\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tprogid\t\n"

Definition at line 1635 of file action.c.

◆ rpi_component_dat

const char rpi_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"progid\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tprogid.txt\n"

Definition at line 1623 of file action.c.

◆ rpi_custom_action_dat

const char rpi_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rpi_immediate\t1\tcustom.dll\trpi_absent\n"
"rpi_deferred\t1025\tcustom.dll\trpi_present\n"
"upi_immediate\t1\tcustom.dll\trpi_present\n"
"upi_deferred\t1025\tcustom.dll\trpi_absent\n"

Definition at line 1699 of file action.c.

◆ rpi_extension_dat

const char rpi_extension_dat[]
static
Initial value:
=
"Extension\tComponent_\tProgId_\tMIME_\tFeature_\n"
"s255\ts72\tS255\tS64\ts38\n"
"Extension\tExtension\tComponent_\n"
"winetest\tprogid\tWinetest.Extension\t\tprogid\n"

Definition at line 1643 of file action.c.

◆ rpi_feature_comp_dat

const char rpi_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"progid\tprogid\n"

Definition at line 1617 of file action.c.

◆ rpi_feature_dat

const char rpi_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"progid\t\t\tprogid feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1611 of file action.c.

◆ rpi_file_dat

const char rpi_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"progid.txt\tprogid\tprogid.txt\t1000\t\t\t8192\t1\n"

Definition at line 1605 of file action.c.

◆ rpi_install_exec_seq_dat

const char rpi_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"UnregisterClassInfo\t\t3000\n"
"UnregisterExtensionInfo\t\t3200\n"
"UnregisterProgIdInfo\t\t3400\n"
"upi_immediate\tREMOVE\t3401\n"
"upi_deferred\tREMOVE\t3402\n"
"InstallFiles\t\t3600\n"
"RegisterClassInfo\t\t4000\n"
"RegisterExtensionInfo\t\t4200\n"
"RegisterProgIdInfo\t\t4400\n"
"rpi_immediate\tNOT REMOVE\t4401\n"
"rpi_deferred\tNOT REMOVE\t4402\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"UnpublishFeatures\t\t5300\n"
"InstallFinalize\t\t6000\n"

Definition at line 1670 of file action.c.

◆ rpi_progid_dat

const char rpi_progid_dat[]
static
Initial value:
=
"ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n"
"s255\tS255\tS38\tL255\tS72\tI2\n"
"ProgId\tProgId\n"
"Winetest.Class.1\t\t{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tdescription\t\t\n"
"Winetest.Class\tWinetest.Class.1\t\tdescription\t\t\n"
"Winetest.Class.2\t\t{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tdescription\t\t\n"
"Winetest.VerClass.1\t\t{904E6BC9-F57F-4412-B460-D40DE2F256E2}\tdescription\t\t\n"
"Winetest.VerClass\tWinetest.VerClass.1\t\tdescription\t\t\n"
"Winetest.NoProgIdClass.1\t\t{57C413FB-CA02-498A-81F6-7E769BDB7C97}\tdescription\t\t\n"
"Winetest.NoProgIdClass\tWinetest.NoProgIdClass.1\t\tdescription\t\t\n"
"Winetest.Orphaned\t\t\tdescription\t\t\n"
"Winetest.Orphaned2\t\t\tdescription\t\t\n"
"Winetest.Extension\t\t\tdescription\t\t\n"

Definition at line 1655 of file action.c.

◆ rpi_tables

const msi_table rpi_tables[]
static
Initial value:
=
{
ADD_TABLE(rpi_component),
ADD_TABLE(rpi_feature),
ADD_TABLE(rpi_feature_comp),
ADD_TABLE(rpi_file),
ADD_TABLE(rpi_appid),
ADD_TABLE(rpi_class),
ADD_TABLE(rpi_extension),
ADD_TABLE(rpi_verb),
ADD_TABLE(rpi_progid),
ADD_TABLE(rpi_install_exec_seq),
ADD_TABLE(rpi_custom_action),
}

Definition at line 2293 of file action.c.

Referenced by test_register_progid_info().

◆ rpi_verb_dat

const char rpi_verb_dat[]
static
Initial value:
=
"Extension_\tVerb\tSequence\tCommand\tArgument\n"
"s255\ts32\tI2\tL255\tL255\n"
"Verb\tExtension_\tVerb\n"
"winetest\tOpen\t1\t&Open\t/argument\n"

Definition at line 1649 of file action.c.

◆ sds_custom_action_dat

const char sds_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"sds_immediate\t1\tcustom.dll\tsds_present\n"
"sds_deferred\t1025\tcustom.dll\tsds_absent\n"

Definition at line 333 of file action.c.

◆ sds_install_exec_seq_dat

const char sds_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"ResolveSource\t\t950\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"StopServices\t\t5000\n"
"DeleteServices\t\t5050\n"
"sds_immediate\tNOT REMOVE\t5051\n"
"sds_deferred\tNOT REMOVE\t5052\n"
"MoveFiles\t\t5100\n"
"InstallFiles\t\t5200\n"
"DuplicateFiles\t\t5300\n"
"InstallServices\t\t5400\n"
"StartServices\t\t5450\n"
"RegisterProduct\t\t5500\n"
"PublishFeatures\t\t5600\n"
"PublishProduct\t\t5700\n"
"UnpublishFeatures\t\t5800\n"
"InstallFinalize\t\t6000\n"

Definition at line 307 of file action.c.

◆ sds_tables

const msi_table sds_tables[]
static
Initial value:
=
{
ADD_TABLE(component),
ADD_TABLE(feature_comp),
ADD_TABLE(sds_install_exec_seq),
ADD_TABLE(sds_custom_action),
ADD_TABLE(service_control),
ADD_TABLE(service_install),
}

Definition at line 2091 of file action.c.

Referenced by test_delete_services().

◆ service_control_dat

const char service_control_dat[]
static
Initial value:
=
"ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
"s72\tl255\ti2\tL255\tI2\ts72\n"
"ServiceControl\tServiceControl\n"
"ServiceControl\tTestService3\t8\t\t0\tservice_comp\n"
"ServiceControl2\tTestService3\t128\t\t0\tservice_comp2"

Definition at line 257 of file action.c.

◆ service_install2_dat

const char service_install2_dat[]
static
Initial value:
=
"ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
"LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
"s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
"ServiceInstall\tServiceInstall\n"
"TestService\tTestService\tTestService\t2\t3\t32768\t\t\tTestService\t\t\tservice_comp\t\n"
"TestService4\tTestService4\tTestService4\t2\t3\t0\t\t\tTestService4\t\t\tservice_comp3\t\n"

Definition at line 249 of file action.c.

◆ service_install_dat

const char service_install_dat[]
static
Initial value:
=
"ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
"LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n"
"s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n"
"ServiceInstall\tServiceInstall\n"
"TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService\t\t-a arg\tservice_comp\tdescription\n"
"TestService2\t[SERVNAME2]\t[SERVDISP2]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService2\t\t-a arg\tservice_comp2\tdescription\n"

Definition at line 241 of file action.c.

◆ sis_custom_action_dat

const char sis_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"sis_immediate\t1\tcustom.dll\tsis_absent\n"
"sis_deferred\t1025\tcustom.dll\tsis_present\n"

Definition at line 362 of file action.c.

◆ sis_install_exec_seq_dat

const char sis_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"StopServices\t\t5000\n"
"DeleteServices\t\t5050\n"
"InstallFiles\t\t5200\n"
"InstallServices\t\t5400\n"
"sis_immediate\tNOT REMOVE\t5401\n"
"sis_deferred\tNOT REMOVE\t5402\n"
"StartServices\t\t5450\n"
"RegisterProduct\t\t5500\n"
"PublishFeatures\t\t5600\n"
"PublishProduct\t\t5700\n"
"UnpublishFeatures\t\t5800\n"
"InstallFinalize\t\t6000\n"

Definition at line 340 of file action.c.

◆ sis_tables

const msi_table sis_tables[]
static
Initial value:
=
{
ADD_TABLE(component),
ADD_TABLE(feature_comp),
ADD_TABLE(sis_install_exec_seq),
ADD_TABLE(sis_custom_action),
ADD_TABLE(service_install2),
}

Definition at line 2106 of file action.c.

Referenced by test_install_services().

◆ sr_component_dat

const char sr_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"selfreg\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\tselfreg.dll\n"

Definition at line 819 of file action.c.

◆ sr_custom_action_dat

const char sr_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"sr_immediate\t1\tcustom.dll\tsr_absent\n"
"sr_deferred\t1025\tcustom.dll\tsr_present\n"
"su_immediate\t1\tcustom.dll\tsr_present\n"
"su_deferred\t1025\tcustom.dll\tsr_absent\n"

Definition at line 856 of file action.c.

◆ sr_feature_comp_dat

const char sr_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"selfreg\tselfreg\n"

Definition at line 813 of file action.c.

◆ sr_feature_dat

const char sr_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"selfreg\t\t\tselfreg feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 807 of file action.c.

◆ sr_file_dat

const char sr_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"selfreg.dll\tselfreg\tselfreg.dll\t1000\t\t\t8192\t1\n"

Definition at line 801 of file action.c.

◆ sr_install_exec_seq_dat

const char sr_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"SelfUnregModules\t\t3800\n"
"su_immediate\tREMOVE\t3801\n"
"su_deferred\tREMOVE\t3802\n"
"RemoveFiles\t\t3900\n"
"InstallFiles\t\t4000\n"
"SelfRegModules\t\t4100\n"
"sr_immediate\tNOT REMOVE\t4101\n"
"sr_deferred\tNOT REMOVE\t4102\n"
"CreateShortcuts\t\t4600\n"
"RegisterProduct\t\t5100\n"
"PublishFeatures\t\t5200\n"
"PublishProduct\t\t5300\n"
"UnpublishFeatures\t\t5400\n"
"InstallFinalize\t\t6600\n"

Definition at line 831 of file action.c.

◆ sr_selfreg_dat

const char sr_selfreg_dat[]
static
Initial value:
=
"File_\tCost\n"
"s72\tI2\n"
"SelfReg\tFile_\n"
"selfreg.dll\t\n"

Definition at line 825 of file action.c.

◆ sr_tables

const msi_table sr_tables[]
static
Initial value:
=
{
ADD_TABLE(sr_component),
ADD_TABLE(sr_feature),
ADD_TABLE(sr_feature_comp),
ADD_TABLE(sr_file),
ADD_TABLE(sr_selfreg),
ADD_TABLE(sr_install_exec_seq),
ADD_TABLE(sr_custom_action),
}

Definition at line 2120 of file action.c.

Referenced by test_self_registration().

◆ sss_custom_action_dat

const char sss_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"stop_immediate\t1\tcustom.dll\tsss_started\n"
"stop_deferred\t1025\tcustom.dll\tsss_stopped\n"
"start_deferred\t1025\tcustom.dll\tsss_started\n"

Definition at line 299 of file action.c.

◆ sss_install_exec_seq_dat

const char sss_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"ResolveSource\t\t950\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"StopServices\t\t4000\n"
"stop_immediate\tNOT REMOVE\t4001\n"
"stop_deferred\tNOT REMOVE\t4002\n"
"DeleteServices\t\t5000\n"
"MoveFiles\t\t5100\n"
"InstallFiles\t\t5200\n"
"DuplicateFiles\t\t5300\n"
"StartServices\t\t5400\n"
"start_deferred\tNOT REMOVE\t5401\n"
"RegisterProduct\t\t5500\n"
"PublishFeatures\t\t5600\n"
"PublishProduct\t\t5700\n"
"UnpublishFeatures\t\t5800\n"
"InstallFinalize\t\t6000\n"

Definition at line 273 of file action.c.

◆ sss_service_control_dat

const char sss_service_control_dat[]
static
Initial value:
=
"ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n"
"s72\tl255\ti2\tL255\tI2\ts72\n"
"ServiceControl\tServiceControl\n"
"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"

Definition at line 264 of file action.c.

◆ sss_tables

const msi_table sss_tables[]
static
Initial value:
=
{
ADD_TABLE(component),
ADD_TABLE(feature_comp),
ADD_TABLE(sss_install_exec_seq),
ADD_TABLE(sss_service_control),
ADD_TABLE(sss_custom_action),
}

Definition at line 2077 of file action.c.

Referenced by test_start_stop_services().

◆ tl_component_dat

const char tl_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\ttypelib.dll\n"

Definition at line 1090 of file action.c.

◆ tl_custom_action_dat

const char tl_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"rt_immediate\t1\tcustom.dll\ttl_absent\n"
"rt_deferred\t1025\tcustom.dll\ttl_present\n"
"ut_immediate\t1\tcustom.dll\ttl_present\n"
"ut_deferred\t1025\tcustom.dll\ttl_absent\n"

Definition at line 1127 of file action.c.

◆ tl_feature_comp_dat

const char tl_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"typelib\ttypelib\n"

Definition at line 1084 of file action.c.

◆ tl_feature_dat

const char tl_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t0\n"

Definition at line 1078 of file action.c.

◆ tl_file_dat

const char tl_file_dat[]
static
Initial value:
=
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n"

Definition at line 1072 of file action.c.

◆ tl_install_exec_seq_dat

const char tl_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"UnregisterTypeLibraries\t\t3100\n"
"ut_immediate\tREMOVE\t3101\n"
"ut_deferred\tREMOVE\t3102\n"
"RemoveFiles\t\t3200\n"
"InstallFiles\t\t3300\n"
"RegisterTypeLibraries\t\t3400\n"
"rt_immediate\tNOT REMOVE\t3401\n"
"rt_deferred\tNOT REMOVE\t3402\n"
"RegisterProduct\t\t5100\n"
"PublishFeatures\t\t5200\n"
"PublishProduct\t\t5300\n"
"UnpublishFeatures\t\t5400\n"
"InstallFinalize\t\t6000\n"

Definition at line 1102 of file action.c.

◆ tl_tables

const msi_table tl_tables[]
static
Initial value:
=
{
ADD_TABLE(tl_component),
ADD_TABLE(tl_feature),
ADD_TABLE(tl_feature_comp),
ADD_TABLE(tl_file),
ADD_TABLE(tl_typelib),
ADD_TABLE(tl_install_exec_seq),
ADD_TABLE(tl_custom_action),
}

Definition at line 2177 of file action.c.

Referenced by test_register_typelib().

◆ tl_typelib_dat

const char tl_typelib_dat[]
static
Initial value:
=
"LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n"
"s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n"
"TypeLib\tLibID\tLanguage\tComponent_\n"
"{EAC5166A-9734-4D91-878F-1DD02304C66C}\t0\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n"

Definition at line 1096 of file action.c.

◆ vp_custom_action_dat

const char vp_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\tISComments\n"
"s72\ti2\tS64\tS0\tS255\n"
"CustomAction\tAction\n"
"SetProductID1\t51\tProductID\t1\t\n"
"SetProductID2\t51\tProductID\t2\t\n"
"TestProductID1\t19\t\t\tHalts installation\n"
"TestProductID2\t19\t\t\tHalts installation\n"

Definition at line 952 of file action.c.

◆ vp_install_exec_seq_dat

const char vp_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"SetProductID1\tSET_PRODUCT_ID=1\t3000\n"
"SetProductID2\tSET_PRODUCT_ID=2\t3100\n"
"ValidateProductID\t\t3200\n"
"InstallExecute\t\t3300\n"
"TestProductID1\tProductID=1\t3400\n"
"TestProductID2\tProductID=\"123-1234567\"\t3500\n"
"InstallFiles\t\t4000\n"
"InstallFinalize\t\t6000\n"

Definition at line 961 of file action.c.

◆ vp_property_dat

const char vp_property_dat[]
static
Initial value:
=
"Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"HASUIRUN\t0\n"
"INSTALLLEVEL\t3\n"
"InstallMode\tTypical\n"
"Manufacturer\tWine\n"
"PIDTemplate\t###-#######\n"
"ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
"ProductLanguage\t1033\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
"MSIFASTINSTALL\t1\n"

Definition at line 936 of file action.c.

◆ vp_tables

const msi_table vp_tables[]
static
Initial value:
=
{
ADD_TABLE(component),
ADD_TABLE(feature_comp),
ADD_TABLE(vp_custom_action),
ADD_TABLE(vp_install_exec_seq),
}

Definition at line 2148 of file action.c.

Referenced by test_validate_product_id().

◆ wrv_component_dat

const char wrv_component_dat[]
static
Initial value:
=
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"augustus\t{bafe0297-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t0\t\t\n"
"caesar\t{bafe0298-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t1\t\t\n"

Definition at line 625 of file action.c.

◆ wrv_custom_action_dat

const char wrv_custom_action_dat[]
static
Initial value:
=
"Action\tType\tSource\tTarget\n"
"s72\ti2\tS64\tS0\n"
"CustomAction\tAction\n"
"wrv_immediate\t1\tcustom.dll\twrv_absent\n"
"wrv_deferred\t1025\tcustom.dll\twrv_present\n"
"rrv_immediate\t1\tcustom.dll\twrv_present\n"
"rrv_deferred\t1025\tcustom.dll\twrv_absent\n"

Definition at line 701 of file action.c.

◆ wrv_feature_comp_dat

const char wrv_feature_comp_dat[]
static
Initial value:
=
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"feature\taugustus\n"
"feature2\tcaesar"

Definition at line 639 of file action.c.

◆ wrv_feature_dat

const char wrv_feature_dat[]
static
Initial value:
=
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n"
"feature2\t\tFeature2\tFeature2\t2\t1\tTARGETDIR\t1"

Definition at line 632 of file action.c.

◆ wrv_install_exec_seq_dat

const char wrv_install_exec_seq_dat[]
static
Initial value:
=
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveRegistryValues\t\t4900\n"
"rrv_immediate\tREMOVE\t4901\n"
"rrv_deferred\tREMOVE\t4902\n"
"WriteRegistryValues\t\t5000\n"
"wrv_immediate\tNOT REMOVE\t5001\n"
"wrv_deferred\tNOT REMOVE\t5002\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6200\n"
"PublishProduct\t\t6300\n"
"UnpublishFeatures\t\t6400\n"
"InstallFinalize\t\t6600\n"

Definition at line 679 of file action.c.

◆ wrv_registry_dat

const char wrv_registry_dat[]
static
Initial value:
=
"Registry\tRoot\tKey\tName\tValue\tComponent_\n"
"s72\ti2\tl255\tL255\tL0\ts72\n"
"Registry\tRegistry\n"
"regdata0\t1\tmsitest\tsz\tstring\taugustus\n"
"regdata1\t1\tmsitest\tmultisz\tone[~]two[~]three\taugustus\n"
"regdata2\t1\tmsitest\texpandsz\t#%string\taugustus\n"
"regdata3\t1\tmsitest\tdword\t#123\taugustus\n"
"regdata4\t1\tmsitest\tbinary\t#x01234567\taugustus\n"
"regdata5\t1\tmsitest\t\tdefault\taugustus\n"
"regdata6\t1\tmsitest\\subkey\t*\t\taugustus\n"
"regdata7\t1\tmsitest\\subkey\t*\t#%\taugustus\n"
"regdata8\t1\tmsitest\\subkey\t*\t#x\taugustus\n"
"regdata9\t1\tmsitest\\VisualStudio\\10.0\\AD7Metrics\\Exception\\{049EC4CC-30D2-4032-9256-EE18EB41B62B}\\Common Language Runtime Exceptions\\System.Workflow.ComponentModel.Serialization\\System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException\tlong\tkey\taugustus\n"
"regdata10\t1\tmsitest\tValue1\t[~]one[~]\taugustus\n"
"regdata11\t1\tmsitest\tValue2\t[~]two\taugustus\n"
"regdata12\t1\tmsitest\tValue3\tone[~]\taugustus\n"
"regdata13\t1\tmsitest\tValue4\tone[~]two\taugustus\n"
"regdata14\t1\tmsitest\tValue5\t[~]one[~]two[~]three\taugustus\n"
"regdata15\t1\tmsitest\tValue6\t[~]\taugustus\n"
"regdata16\t1\tmsitest\tValue7\t[~]two\taugustus\n"
"regdata17\t1\tmsitest\tformat\t[regdata17]\taugustus\n"
"regdata18\t1\tmsitest\tsource\t#1\tcaesar\n"
"regdata19\t1\tmsitest\\create\t+\t\taugustus\n"
"regdata20\t1\tmsitest\\delete\t-\t\taugustus\n"

Definition at line 646 of file action.c.

◆ wrv_remove_registry_dat

const char wrv_remove_registry_dat[]
static
Initial value:
=
"RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
"s72\ti2\tl255\tL255\ts72\n"
"RemoveRegistry\tRemoveRegistry\n"
"regdata0\t1\tmsitest\tinstremove\taugustus\n"
"regdata1\t1\tmsitest\\instremove\t-\taugustus\n"

Definition at line 672 of file action.c.

◆ wrv_tables

const msi_table wrv_tables[]
static
Initial value:
=
{
ADD_TABLE(wrv_component),
ADD_TABLE(wrv_feature),
ADD_TABLE(wrv_feature_comp),
ADD_TABLE(wrv_install_exec_seq),
ADD_TABLE(wrv_custom_action),
ADD_TABLE(wrv_registry),
ADD_TABLE(wrv_remove_registry),
}

Definition at line 2049 of file action.c.

Referenced by test_write_registry_values().