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)
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)
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)
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