[SETUPAPI] add support for LZ compressed files. fixes ATI Radeon driver installation...
authorChristoph von Wittich <christoph_vw@reactos.org>
Mon, 10 Aug 2015 10:52:21 +0000 (10:52 +0000)
committerChristoph von Wittich <christoph_vw@reactos.org>
Mon, 10 Aug 2015 10:52:21 +0000 (10:52 +0000)
svn path=/trunk/; revision=68659

reactos/dll/win32/setupapi/queue.c
reactos/dll/win32/setupapi/setupapi_private.h

index 3cb45ba..85620e0 100644 (file)
@@ -984,9 +984,27 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
 {
     BOOL rc = FALSE;
     BOOL docopy = TRUE;
+    WCHAR TempFile[MAX_PATH];
+    INT hSource, hTemp;
+    OFSTRUCT OfStruct;
+    WCHAR TempPath[MAX_PATH];
 
     TRACE("copy %s to %s style 0x%x\n",debugstr_w(source),debugstr_w(target),style);
 
+    hSource = LZOpenFileW((LPWSTR)source, &OfStruct, OF_READ);
+    if (hSource < 0)
+        return FALSE;
+
+    /* Get a temp file name */
+    GetTempPathW(sizeof(TempPath) / sizeof(WCHAR), TempPath);
+    GetTempFileNameW(TempPath, L"", 0, TempFile);
+
+    /* Extract the compressed file to a temp location */
+    hTemp = LZOpenFileW(TempFile, &OfStruct, OF_CREATE);
+    LZCopy(hSource, hTemp);
+    LZClose(hSource);
+    LZClose(hTemp);
+
     /* before copy processing */
     if (style & SP_COPY_REPLACEONLY)
     {
@@ -1010,9 +1028,9 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
          * we just basically unconditionally replace the builtin versions.
          */
         if ((GetFileAttributesW(target) != INVALID_FILE_ATTRIBUTES) &&
-            (GetFileAttributesW(source) != INVALID_FILE_ATTRIBUTES))
+            (GetFileAttributesW(TempFile) != INVALID_FILE_ATTRIBUTES))
         {
-            VersionSizeSource = GetFileVersionInfoSizeW((LPWSTR)source,&zero);
+            VersionSizeSource = GetFileVersionInfoSizeW(TempFile,&zero);
             VersionSizeTarget = GetFileVersionInfoSizeW((LPWSTR)target,&zero);
         }
 
@@ -1032,7 +1050,7 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
             VersionSource = HeapAlloc(GetProcessHeap(),0,VersionSizeSource);
             VersionTarget = HeapAlloc(GetProcessHeap(),0,VersionSizeTarget);
 
-            ret = GetFileVersionInfoW((LPWSTR)source,0,VersionSizeSource,VersionSource);
+            ret = GetFileVersionInfoW(TempFile,0,VersionSizeSource,VersionSource);
             if (ret)
               ret = GetFileVersionInfoW((LPWSTR)target, 0, VersionSizeTarget,
                     VersionTarget);
@@ -1107,7 +1125,7 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
 
     if (docopy)
     {
-        rc = CopyFileW(source,target,FALSE);
+        rc = MoveFileExW(TempFile,target,MOVEFILE_REPLACE_EXISTING);
         TRACE("Did copy... rc was %i\n",rc);
     }
 
index 72658f4..cf86101 100644 (file)
@@ -41,6 +41,7 @@
 #include <setupapi.h>
 #include <softpub.h>
 #include <mscat.h>
+#include <lzexpand.h>
 #include <shlobj.h>
 #include <wine/unicode.h>
 #define NTOS_MODE_USER