kernel32 [3/3]: Forward LZOpenFileA to LZOpenFileW,
not the other way around
James Hawkins
truiken at gmail.com
Fri Nov 17 20:14:34 CST 2006
Hi,
Changelog:
* Forward LZOpenFileA to LZOpenFileW, not the other way around.
dlls/kernel32/lzexpand.c | 141 +++++++++++++++++++++++++++++++++-------------
1 files changed, 102 insertions(+), 39 deletions(-)
--
James Hawkins
-------------- next part --------------
diff --git a/dlls/kernel32/lzexpand.c b/dlls/kernel32/lzexpand.c
index a198459..6978333 100644
--- a/dlls/kernel32/lzexpand.c
+++ b/dlls/kernel32/lzexpand.c
@@ -527,66 +527,129 @@ #undef BUFLEN
}
/* reverses GetExpandedPathname */
-static LPSTR LZEXPAND_MangleName( LPCSTR fn )
+static LPWSTR LZEXPAND_MangleName(LPCWSTR fn)
{
- char *p;
- char *mfn = HeapAlloc( GetProcessHeap(), 0, strlen(fn) + 3 ); /* "._" and \0 */
- if(mfn == NULL) return NULL;
- strcpy( mfn, fn );
- if (!(p = strrchr( mfn, '\\' ))) p = mfn;
- if ((p = strchr( p, '.' )))
+ LPWSTR p, mfn;
+ DWORD len;
+
+ static const WCHAR underscore[] = {'_',0};
+ static const WCHAR dotunder[] = {'.','_',0};
+
+ len = lstrlenW(fn) + 3; /* "._" and \0 */
+ mfn = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if(!mfn)
+ return NULL;
+
+ lstrcpyW(mfn, fn);
+ if (!(p = strrchrW( mfn, '\\' ))) p = mfn;
+ if ((p = strchrW( p, '.' )))
{
p++;
- if (strlen(p) < 3) strcat( p, "_" ); /* append '_' */
- else p[strlen(p)-1] = '_'; /* replace last character */
+ if (lstrlenW(p) < 3) lstrcatW( p, underscore ); /* append '_' */
+ else p[lstrlenW(p)-1] = '_'; /* replace last character */
}
- else strcat( mfn, "._" ); /* append "._" */
+ else lstrcatW( mfn, dotunder ); /* append "._" */
return mfn;
}
-
/***********************************************************************
* LZOpenFileA (KERNEL32.@)
*
- * Opens a file. If not compressed, open it as a normal file.
+ * See LZOpenFileW.
*/
-HFILE WINAPI LZOpenFileA( LPSTR fn, LPOFSTRUCT ofs, WORD mode )
+HFILE WINAPI LZOpenFileA(LPSTR fn, LPOFSTRUCT ofs, WORD mode)
{
- HFILE fd,cfd;
+ HFILE ret;
+ DWORD len;
+ LPWSTR fileW;
- TRACE("(%s,%p,%d)\n",fn,ofs,mode);
- /* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
- fd=OpenFile(fn,ofs,mode);
- if (fd==HFILE_ERROR)
- {
- LPSTR mfn = LZEXPAND_MangleName(fn);
- fd = OpenFile(mfn,ofs,mode);
- HeapFree( GetProcessHeap(), 0, mfn );
- }
- if ((mode&~0x70)!=OF_READ)
- return fd;
- if (fd==HFILE_ERROR)
- return HFILE_ERROR;
- cfd=LZInit(fd);
- if ((INT)cfd <= 0) return fd;
- return cfd;
+ if (!fn || !*fn)
+ return LZERROR_BADINHANDLE;
+
+ len = MultiByteToWideChar(CP_ACP, 0, fn, -1, NULL, 0);
+ fileW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!fileW)
+ return LZERROR_GLOBALLOC;
+
+ MultiByteToWideChar(CP_ACP, 0, fn, -1, fileW, len);
+
+ ret = LZOpenFileW(fileW, ofs, mode);
+
+ HeapFree(GetProcessHeap(), 0, fileW);
+ return ret;
}
+/* Wrapper for CreateFile that takes OF_* mode flags. */
+static HANDLE create_file_OF(LPWSTR path, INT mode)
+{
+ DWORD access, sharing, creation;
+
+ if (mode & OF_CREATE)
+ {
+ creation = CREATE_ALWAYS;
+ access = GENERIC_READ | GENERIC_WRITE;
+ }
+ else
+ {
+ creation = OPEN_EXISTING;
+ switch(mode & 0x03)
+ {
+ case OF_READ: access = GENERIC_READ; break;
+ case OF_WRITE: access = GENERIC_WRITE; break;
+ case OF_READWRITE: access = GENERIC_READ | GENERIC_WRITE; break;
+ default: access = 0; break;
+ }
+ }
+
+ switch(mode & 0x70)
+ {
+ case OF_SHARE_EXCLUSIVE: sharing = 0; break;
+ case OF_SHARE_DENY_WRITE: sharing = FILE_SHARE_READ; break;
+ case OF_SHARE_DENY_READ: sharing = FILE_SHARE_WRITE; break;
+ case OF_SHARE_DENY_NONE:
+ case OF_SHARE_COMPAT:
+ default: sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; break;
+ }
+
+ return CreateFileW(path, access, sharing, NULL, creation, FILE_ATTRIBUTE_NORMAL, 0);
+}
/***********************************************************************
* LZOpenFileW (KERNEL32.@)
+ *
+ * Opens a file. If not compressed, open it as a normal file.
*/
-HFILE WINAPI LZOpenFileW( LPWSTR fn, LPOFSTRUCT ofs, WORD mode )
+HFILE WINAPI LZOpenFileW(LPWSTR fn, LPOFSTRUCT ofs, WORD mode)
{
- HFILE ret;
- DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
- LPSTR xfn = HeapAlloc( GetProcessHeap(), 0, len );
- WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL );
- ret = LZOpenFileA(xfn,ofs,mode);
- HeapFree( GetProcessHeap(), 0, xfn );
- return ret;
-}
+ HFILE cfd, ret;
+ HANDLE file;
+ LPWSTR mfn;
+
+ TRACE("(%s, %p, %d)\n", debugstr_w(fn), ofs, mode);
+
+ file = create_file_OF(fn, mode);
+ if (file == INVALID_HANDLE_VALUE)
+ {
+ mfn = LZEXPAND_MangleName(fn);
+ file = create_file_OF(mfn, mode);
+ HeapFree(GetProcessHeap(), 0, mfn);
+ }
+ if (file == INVALID_HANDLE_VALUE)
+ return HFILE_ERROR;
+
+ ret = (HFILE)file;
+
+ /* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
+ if ((mode & ~0x70) != OF_READ)
+ return ret;
+
+ cfd = LZInit(ret);
+ if (cfd <= 0)
+ return ret;
+
+ return cfd;
+}
/***********************************************************************
* LZClose (KERNEL32.@)
--
1.4.2.4
More information about the wine-patches
mailing list