221 new_path[
len - 1] = 0;
233 if (!(slash =
wcsrchr( new_path,
'\\' )))
238 len = slash - new_path;
245 new_path[
len] =
'\\';
291 hash.dwFileHashInfoSize =
sizeof(
hash);
329 TRACE(
"overwriting %s (new version %s old version %u.%u.%u.%u)\n",
337 TRACE(
"keeping %s (new version %s old version %u.%u.%u.%u)\n",
343 free( file_version );
350 TRACE(
"overwriting %s (new version %s old version %s)\n",
356 TRACE(
"keeping %s (new version %s old version %s)\n",
360 free( font_version );
369 if (
file->hash.dwFileHashInfoSize)
428 TRACE(
"overwriting existing file\n");
436 TRACE(
"Overwriting existing file: %d\n", gle);
440 WCHAR *tmpfileW, *pathW, *
p;
443 TRACE(
"file in use, scheduling rename operation\n");
466 WARN(
"failed to schedule rename operation: %d)\n", gle);
478 const WCHAR *install_path;
498 if (
file->disk_id == disk_id &&
525 *attrs =
file->Attributes;
542 if (
file->IsCompressed)
return NULL;
604 if (
file->Sequence >
mi->last_sequence ||
mi->is_continuous ||
605 (
file->IsCompressed && !
mi->is_extracted))
611 data.package = package;
623 if (!
file->IsCompressed)
629 if (!is_global_assembly)
686 TRACE(
"file %s component %s not installed or disabled\n",
735 while ((IAssemblyEnum_GetNextAssembly( iter,
NULL, &
name, 0 ) ==
S_OK))
745 hr = IAssemblyName_GetDisplayName(
name, displayname, &
len, 0 );
760 IAssemblyName_Release(
name );
768 IAssemblyName_Release(
name );
772 IAssemblyEnum_Release( iter );
782 TRACE(
"%p\n", package);
789 TRACE(
"extracting files\n");
818 data.package = package;
831 TRACE(
"applying patches\n");
852#define is_dot_dir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0))))
870 WARN(
"Source or dest is directory, not moving\n");
902 DWORD dirlen, pathlen;
905 dirlen =
ptr - wildcard + 1;
940 new =
calloc(1,
sizeof(*
new));
953 new->destname =
new->sourcename;
1064 LPCWSTR sourcename, component;
1078 TRACE(
"component not scheduled for installation %s\n",
debugstr_w(component));
1123 destname =
wcsdup(sourcename);
1124 else if ((
p =
wcsrchr(sourcedir,
'\\')))
1127 destname =
wcsdup(sourcedir);
1239 FIXME(
"Unable to get destination folder, try AppSearch properties\n");
1271 TRACE(
"component not scheduled for installation %s\n",
debugstr_w(component));
1278 ERR(
"Unable to get file key\n");
1292 WARN(
"Unable to get duplicate filename\n");
1299 WARN(
"failed to copy file %s -> %s (%lu)\n",
1302 FIXME(
"We should track these duplicate files as well\n");
1349 TRACE(
"component not scheduled for removal %s\n",
debugstr_w(component));
1356 ERR(
"Unable to get file key\n");
1370 WARN(
"Unable to get duplicate filename\n");
1453 TRACE(
"Skipping removal due to install mode\n");
1456 if (comp->assembly && !comp->assembly->application)
1462 TRACE(
"permanent component, not removing file\n");
1469 WARN(
"directory property has no value\n");
1552 comp =
file->Component;
1564 TRACE(
"permanent component, not removing file\n");
1573 TRACE(
"newer version detected, not removing file\n");
1606 TRACE(
"permanent component, not removing directory\n");
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void user(int argc, const char *argv[])
static void list_remove(struct list_entry *entry)
static int list_empty(struct list_entry *head)
static void list_add_head(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
#define INVALID_HANDLE_VALUE
#define FILE_ATTRIBUTE_NORMAL
#define ERROR_ACCESS_DENIED
static const WCHAR version[]
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI FindClose(HANDLE hFindFile)
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI MoveFileExW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName OPTIONAL, IN DWORD dwFlags)
BOOL WINAPI GetFileVersionInfoW(LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data)
BOOL WINAPI VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen)
DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR filename, LPDWORD handle)
INSTALLSTATE msi_get_component_action(MSIPACKAGE *package, MSICOMPONENT *comp)
int msi_compare_file_versions(VS_FIXEDFILEINFO *fi, const WCHAR *version)
BOOL msi_is_global_assembly(MSICOMPONENT *comp)
UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
MSIFOLDER * msi_get_loaded_folder(MSIPACKAGE *package, const WCHAR *dir)
int msi_compare_font_versions(const WCHAR *ver1, const WCHAR *ver2)
void msi_ui_progress(MSIPACKAGE *package, int a, int b, int c, int d)
MSICOMPONENT * msi_get_loaded_component(MSIPACKAGE *package, const WCHAR *Component)
WCHAR *WINAPIV msi_build_directory_name(DWORD count,...)
MSIFILE * msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *key)
UINT msi_schedule_action(MSIPACKAGE *package, UINT script, const WCHAR *action)
WCHAR * msi_create_temp_file(MSIDATABASE *db)
static BOOL is_registered_patch_media(MSIPACKAGE *package, UINT disk_id)
BOOL msi_set_file_attributes(MSIPACKAGE *package, const WCHAR *filename, DWORD attrs)
static BOOL apply_filepatch(MSIPACKAGE *package, const WCHAR *patch, const WCHAR *old, const WCHAR *new)
BOOL msi_create_full_path(MSIPACKAGE *package, const WCHAR *path)
static BOOL copy_file(MSIPACKAGE *package, const WCHAR *src, const WCHAR *dst, BOOL fail_if_exists)
BOOL msi_remove_directory(MSIPACKAGE *package, const WCHAR *path)
HANDLE msi_create_file(MSIPACKAGE *package, const WCHAR *filename, DWORD access, DWORD sharing, DWORD creation, DWORD flags)
static WCHAR * get_duplicate_filename(MSIPACKAGE *package, MSIRECORD *row, const WCHAR *file_key, const WCHAR *src)
DWORD msi_get_file_version_info(MSIPACKAGE *package, const WCHAR *path, DWORD buflen, BYTE *buffer)
UINT ACTION_InstallFiles(MSIPACKAGE *package)
UINT ACTION_RemoveFiles(MSIPACKAGE *package)
static MSIFILE * find_file(MSIPACKAGE *package, UINT disk_id, const WCHAR *filename)
UINT msi_patch_assembly(MSIPACKAGE *package, MSIASSEMBLY *assembly, MSIFILEPATCH *patch)
static UINT ITERATE_MoveFiles(MSIRECORD *rec, LPVOID param)
BOOL msi_delete_file(MSIPACKAGE *package, const WCHAR *filename)
HANDLE msi_find_first_file(MSIPACKAGE *package, const WCHAR *filename, WIN32_FIND_DATAW *data)
static UINT ITERATE_RemoveDuplicateFiles(MSIRECORD *row, LPVOID param)
WCHAR * msi_resolve_file_source(MSIPACKAGE *package, MSIFILE *file)
static UINT copy_file_attributes(MSIPACKAGE *package, MSIFILE *file, WCHAR *source)
void msi_reduce_to_long_filename(WCHAR *filename)
static BOOL create_directory(MSIPACKAGE *package, const WCHAR *path)
static UINT patch_file(MSIPACKAGE *package, MSIFILEPATCH *patch)
static BOOL move_files_wildcard(MSIPACKAGE *package, const WCHAR *source, WCHAR *dest, int options)
static BOOL verify_comp_for_removal(MSICOMPONENT *comp, UINT install_mode)
static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param)
static BOOL add_wildcard(struct file_list *files, const WCHAR *source, WCHAR *dest)
static void free_file_entry(struct file_list *file)
BOOL msi_move_file(MSIPACKAGE *package, const WCHAR *from, const WCHAR *to, DWORD flags)
static WCHAR * wildcard_to_file(const WCHAR *wildcard, const WCHAR *filename)
VS_FIXEDFILEINFO * msi_get_disk_file_version(MSIPACKAGE *package, const WCHAR *filename)
static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
static MSIFILEPATCH * find_filepatch(MSIPACKAGE *package, UINT disk_id, const WCHAR *key)
UINT ACTION_PatchFiles(MSIPACKAGE *package)
static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR filename, DWORD action, LPWSTR *path, DWORD *attrs, PVOID user)
DWORD msi_get_file_attributes(MSIPACKAGE *package, const WCHAR *path)
BOOL msi_find_next_file(MSIPACKAGE *package, HANDLE handle, WIN32_FIND_DATAW *data)
static void schedule_install_files(MSIPACKAGE *package)
static BOOL file_hash_matches(MSIPACKAGE *package, MSIFILE *file)
UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
static BOOL is_obsoleted_by_patch(MSIPACKAGE *package, MSIFILE *file)
static void free_list(struct file_list *list)
DWORD msi_get_disk_file_size(MSIPACKAGE *package, const WCHAR *filename)
UINT ACTION_MoveFiles(MSIPACKAGE *package)
BOOL msi_get_temp_file_name(MSIPACKAGE *package, const WCHAR *tmp_path, const WCHAR *prefix, WCHAR *tmp_filename)
static BOOL patchfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action, LPWSTR *path, DWORD *attrs, PVOID user)
static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
static void remove_folder(MSIFOLDER *folder)
static void file_update_ui(MSIPACKAGE *package, MSIFILE *f, const WCHAR *action)
static msi_file_state calculate_install_state(MSIPACKAGE *package, MSIFILE *file)
static BOOL move_file(MSIPACKAGE *package, const WCHAR *source, const WCHAR *dest, int options)
static UINT create_folder(MSIPACKAGE *package, const WCHAR *dir)
UINT ACTION_RemoveDuplicateFiles(MSIPACKAGE *package)
WCHAR * msi_get_font_file_version(MSIPACKAGE *package, const WCHAR *filename)
int msiobj_release(MSIOBJECTHDR *info)
WCHAR * msi_resolve_source_folder(MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder)
const WCHAR * msi_get_target_folder(MSIPACKAGE *package, const WCHAR *name)
UINT msi_get_filehash(MSIPACKAGE *package, const WCHAR *path, MSIFILEHASHINFO *hash)
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
#define MOVEFILE_REPLACE_EXISTING
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLuint GLint GLboolean GLint GLenum access
_Check_return_ _CRTIMP FILE *__cdecl tmpfile(void)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
#define ERROR_ALREADY_EXISTS
static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
UINT msi_uninstall_assembly(MSIPACKAGE *package, MSICOMPONENT *comp)
IAssemblyEnum * msi_create_assembly_enum(MSIPACKAGE *package, const WCHAR *displayname)
WCHAR * msi_get_assembly_path(MSIPACKAGE *package, const WCHAR *displayname)
@ INSTALLMESSAGE_ACTIONDATA
@ msidbComponentAttributesNeverOverwrite
@ msidbComponentAttributesPermanent
@ msidbComponentAttributesSourceOnly
@ msidbMoveFileOptionsMove
@ msidbPatchAttributesNonVital
@ msidbFileAttributesPatchAdded
@ msidbRemoveFileInstallModeOnBoth
@ msidbRemoveFileInstallModeOnInstall
@ msidbRemoveFileInstallModeOnRemove
int MSI_RecordGetInteger(MSIRECORD *, UINT)
#define MSI_INITIAL_MEDIA_TRANSFORM_DISKID
UINT MSI_RecordSetInteger(MSIRECORD *, UINT, int)
int msi_get_property_int(MSIDATABASE *package, LPCWSTR prop, int def)
UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY **)
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT)
#define MSICABEXTRACT_BEGINEXTRACT
@ FOLDER_STATE_UNINITIALIZED
static void msi_revert_fs_redirection(MSIPACKAGE *package)
BOOL MSI_RecordIsNull(MSIRECORD *, UINT)
WCHAR * msi_dup_property(MSIDATABASE *db, const WCHAR *prop)
static void msi_disable_fs_redirection(MSIPACKAGE *package)
INT MSI_ProcessMessage(MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD *)
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR)
MSIRECORD * MSI_CreateRecord(UINT)
#define MSICABEXTRACT_FILEEXTRACTED
enum _msi_file_state msi_file_state
UINT MSI_IterateRecords(MSIQUERY *, LPDWORD, record_func, LPVOID)
UINT MSI_RecordGetStringW(MSIRECORD *, UINT, LPWSTR, LPDWORD)
BOOL WINAPI ApplyPatchToFileW(LPCWSTR patch_file, LPCWSTR old_file, LPCWSTR new_file, ULONG apply_flags)
#define FILE_ATTRIBUTE_DIRECTORY
#define PathAddBackslashW
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP wchar_t *__cdecl wcsdup(_In_z_ const wchar_t *_Str)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
__WINE_SERVER_LIST_INLINE void list_add_before(struct list *elem, struct list *to_add)
__WINE_SERVER_LIST_INLINE void list_add_after(struct list *elem, struct list *to_add)
unsigned char need_reboot_at_end
Character const *const prefix
#define new(TYPE, numElems)
#define INVALID_FILE_ATTRIBUTES
DWORD WINAPI GetLastError(void)
#define INVALID_FILE_SIZE
#define MOVEFILE_DELAY_UNTIL_REBOOT
#define ERROR_INSTALL_FAILURE
#define ERROR_SHARING_VIOLATION
#define E_NOT_SUFFICIENT_BUFFER
#define ERROR_PATH_NOT_FOUND
#define ERROR_FUNCTION_FAILED
#define ERROR_USER_MAPPED_FILE