Jacek Caban : appwiz.cpl: Added support for installing packages from MSI files.

Alexandre Julliard julliard at winehq.org
Thu Feb 10 11:42:11 CST 2011


Module: wine
Branch: master
Commit: e1e83bc58d2193b9e5db3564f53756b89d9596dc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e1e83bc58d2193b9e5db3564f53756b89d9596dc

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 10 16:42:49 2011 +0100

appwiz.cpl: Added support for installing packages from MSI files.

---

 dlls/appwiz.cpl/Makefile.in |    1 +
 dlls/appwiz.cpl/addons.c    |   45 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/dlls/appwiz.cpl/Makefile.in b/dlls/appwiz.cpl/Makefile.in
index ace85bb..4d67b57 100644
--- a/dlls/appwiz.cpl/Makefile.in
+++ b/dlls/appwiz.cpl/Makefile.in
@@ -1,5 +1,6 @@
 MODULE    = appwiz.cpl
 IMPORTS   = uuid urlmon advpack comctl32 advapi32 shell32 user32 comdlg32
+DELAYIMPORTS = msi
 EXTRADEFS = -DINSTALL_DATADIR="\"$(datadir)\""
 
 C_SRCS = \
diff --git a/dlls/appwiz.cpl/addons.c b/dlls/appwiz.cpl/addons.c
index d19af66..c55806f 100644
--- a/dlls/appwiz.cpl/addons.c
+++ b/dlls/appwiz.cpl/addons.c
@@ -40,6 +40,7 @@
 #include "wininet.h"
 #include "shellapi.h"
 #include "urlmon.h"
+#include "msi.h"
 
 #include "appwiz.h"
 #include "res.h"
@@ -242,6 +243,46 @@ static BOOL install_cab(LPCWSTR file_name)
     return TRUE;
 }
 
+static BOOL install_msi_file(const WCHAR *file_name)
+{
+    ULONG res;
+
+    res = MsiInstallProductW(file_name, NULL);
+    if(res != ERROR_SUCCESS) {
+        ERR("MsiInstallProduct failed: %u\n", res);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static BOOL install_file(const WCHAR *file_name)
+{
+    BYTE magic[4];
+    HANDLE file;
+    DWORD size;
+    BOOL res;
+
+    static const BYTE msi_magic[] = {0xd0,0xcf,0x11,0xe0};
+
+    file = CreateFileW(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
+    if(file == INVALID_HANDLE_VALUE)
+        return FALSE;
+
+    res = ReadFile(file, magic, sizeof(magic), &size, NULL);
+    CloseHandle(file);
+    if(!res || size != sizeof(magic))
+        return INET_E_DOWNLOAD_FAILURE;
+
+    if(!memcmp(magic, "MSCF", sizeof(magic)))
+        return install_cab(file_name);
+    else if(!memcmp(magic, msi_magic, sizeof(magic)))
+        return install_msi_file(file_name);
+
+    ERR("Unknown file magic\n");
+    return FALSE;
+}
+
 static BOOL install_from_unix_file(const char *file_name)
 {
     LPWSTR dos_file_name;
@@ -276,7 +317,7 @@ static BOOL install_from_unix_file(const char *file_name)
 	MultiByteToWideChar( CP_ACP, 0, file_name, -1, dos_file_name, res);
     }
 
-    ret = install_cab(dos_file_name);
+    ret = install_file(dos_file_name);
 
     heap_free(dos_file_name);
     return ret;
@@ -513,7 +554,7 @@ static DWORD WINAPI download_proc(PVOID arg)
     }
 
     if(sha_check(tmp_file))
-        install_cab(tmp_file);
+        install_file(tmp_file);
     DeleteFileW(tmp_file);
     EndDialog(install_dialog, 0);
     return 0;




More information about the wine-cvs mailing list