[PATCH 1/3] msvcp: Implement the wchar version of _Open_dir (v2).

Stefan Dösinger stefan at codeweavers.com
Mon May 22 08:59:44 CDT 2017


Wargaming Game Center needs this.

Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>

---

Version 2: Use MAX_PATH instead of strlen / wcslen, check return value of MultiByteToWideChar.
---
 dlls/msvcp110/msvcp110.spec |  4 ++--
 dlls/msvcp120/msvcp120.spec |  4 ++--
 dlls/msvcp140/msvcp140.spec |  2 +-
 dlls/msvcp90/ios.c          | 57 ++++++++++++++++++++++++++++++++++-----------
 4 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 17e853166f..0627aed61f 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -1643,8 +1643,8 @@
 @ cdecl -arch=win64 ?_New_Locimp at _Locimp@locale at std@@CAPEAV123 at _N@Z(long) locale__Locimp__New_Locimp_transparent
 @ cdecl -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXPADPBDAAHAAW4file_type at 123@@Z(ptr str long long) tr2_sys__Open_dir
 @ cdecl -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at DPEBDAEAHAEAW4file_type@123@@Z(ptr str long long) tr2_sys__Open_dir
-@ stub -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXPA_WPB_WAAHAAW4file_type at 123@@Z
-@ stub -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXPEA_WPEB_WAEAHAEAW4file_type at 123@@Z
+@ cdecl -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXPA_WPB_WAAHAAW4file_type at 123@@Z(ptr wstr long long) tr2_sys__Open_dir_wchar
+@ cdecl -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXPEA_WPEB_WAEAHAEAW4file_type at 123@@Z(ptr wstr long long) tr2_sys__Open_dir_wchar
 @ cdecl -arch=arm ?_Orphan_all at _Container_base0@std@@QAAXXZ(ptr) Container_base0_Orphan_all
 @ thiscall -arch=i386 ?_Orphan_all at _Container_base0@std@@QAEXXZ(ptr) Container_base0_Orphan_all
 @ cdecl -arch=win64 ?_Orphan_all at _Container_base0@std@@QEAAXXZ(ptr) Container_base0_Orphan_all
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index 0146719adb..a2b82cbc25 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -1604,8 +1604,8 @@
 @ cdecl -arch=win64 ?_New_Locimp at _Locimp@locale at std@@CAPEAV123 at _N@Z(long) locale__Locimp__New_Locimp_transparent
 @ cdecl -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXAAY0BAE at DPBDAAHAAW4file_type@123@@Z(ptr str long long) tr2_sys__Open_dir
 @ cdecl -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at DPEBDAEAHAEAW4file_type@123@@Z(ptr str long long) tr2_sys__Open_dir
-@ stub -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXAAY0BAE at _WPB_WAAHAAW4file_type@123@@Z
-@ stub -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at _WPEB_WAEAHAEAW4file_type@123@@Z
+@ cdecl -arch=win32 ?_Open_dir at sys@tr2 at std@@YAPAXAAY0BAE at _WPB_WAAHAAW4file_type@123@@Z(ptr wstr long long) tr2_sys__Open_dir_wchar
+@ cdecl -arch=win64 ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at _WPEB_WAEAHAEAW4file_type@123@@Z(ptr wstr long long) tr2_sys__Open_dir_wchar
 @ cdecl -arch=arm ?_Orphan_all at _Container_base0@std@@QAAXXZ(ptr) Container_base0_Orphan_all
 @ thiscall -arch=i386 ?_Orphan_all at _Container_base0@std@@QAEXXZ(ptr) Container_base0_Orphan_all
 @ cdecl -arch=win64 ?_Orphan_all at _Container_base0@std@@QEAAXXZ(ptr) Container_base0_Orphan_all
diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index c75f8dd26d..faf0578de9 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -3689,7 +3689,7 @@
 @ stub _Mtxlock
 @ stub _Mtxunlock
 @ extern _Nan _Nan
-@ stub _Open_dir
+@ cdecl _Open_dir(ptr wstr long long) tr2_sys__Open_dir_wchar
 @ cdecl -ret64 _Query_perf_counter()
 @ cdecl -ret64 _Query_perf_frequency()
 @ stub _Read_dir
diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c
index 07aa651e54..5a328665af 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -27,6 +27,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
 
 #define SECSPERDAY        86400
@@ -14893,29 +14894,32 @@ void __cdecl tr2_sys__Last_write_time_set(char const* path, __int64 newtime)
     CloseHandle(handle);
 }
 
-/* ?_Open_dir at sys@tr2 at std@@YAPAXAAY0BAE at DPBDAAHAAW4file_type@123@@Z */
-/* ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at DPEBDAEAHAEAW4file_type@123@@Z */
-void* __cdecl tr2_sys__Open_dir(char* target, char const* dest, int* err_code, enum file_type* type)
+/* ??_Open_dir at sys@tr2 at std@@YAPAXPA_WPB_WAAHAAW4file_type at 123@@Z */
+/* ??_Open_dir at sys@tr2 at std@@YAPEAXPEA_WPEB_WAEAHAEAW4file_type at 123@@Z */
+void* __cdecl tr2_sys__Open_dir_wchar(wchar_t* target, wchar_t const* dest, int* err_code, enum file_type* type)
 {
     HANDLE handle;
-    WIN32_FIND_DATAA data;
-    char temppath[MAX_PATH];
-
-    TRACE("(%p %s %p %p)\n", target, debugstr_a(dest), err_code, type);
-    if(strlen(dest) > MAX_PATH - 3) {
+    WIN32_FIND_DATAW data;
+    wchar_t temppath[MAX_PATH];
+    static const wchar_t dot[] = {'.', 0};
+    static const wchar_t dotdot[] = {'.', '.', 0};
+    static const wchar_t asterisk[] = {'\\', '*', 0};
+
+    TRACE("(%p %s %p %p)\n", target, debugstr_w(dest), err_code, type);
+    if(wcslen(dest) > MAX_PATH - 3) {
         *err_code = ERROR_BAD_PATHNAME;
         return NULL;
     }
-    strcpy(temppath, dest);
-    strcat(temppath, "\\*");
+    wcscpy(temppath, dest);
+    wcscat(temppath, asterisk);
 
-    handle = FindFirstFileA(temppath, &data);
+    handle = FindFirstFileW(temppath, &data);
     if(handle == INVALID_HANDLE_VALUE) {
         *err_code = GetLastError();
         return NULL;
     }
-    while(!strcmp(data.cFileName, ".") || !strcmp(data.cFileName, "..")) {
-        if(!FindNextFileA(handle, &data)) {
+    while(!wcscmp(data.cFileName, dot) || !wcscmp(data.cFileName, dotdot)) {
+        if(!FindNextFileW(handle, &data)) {
             *err_code = ERROR_SUCCESS;
             *type = status_unknown;
             FindClose(handle);
@@ -14923,7 +14927,7 @@ void* __cdecl tr2_sys__Open_dir(char* target, char const* dest, int* err_code, e
         }
     }
 
-    strcpy(target, data.cFileName);
+    wcscpy(target, data.cFileName);
     *err_code = ERROR_SUCCESS;
     if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         *type = directory_file;
@@ -14932,6 +14936,31 @@ void* __cdecl tr2_sys__Open_dir(char* target, char const* dest, int* err_code, e
     return handle;
 }
 
+/* ?_Open_dir at sys@tr2 at std@@YAPAXAAY0BAE at DPBDAAHAAW4file_type@123@@Z */
+/* ?_Open_dir at sys@tr2 at std@@YAPEAXAEAY0BAE at DPEBDAEAHAEAW4file_type@123@@Z */
+void* __cdecl tr2_sys__Open_dir(char* target, char const* dest, int* err_code, enum file_type* type)
+{
+    void *handle;
+    wchar_t target_w[MAX_PATH];
+    wchar_t dest_w[MAX_PATH];
+
+    TRACE("(%p %s %p %p)\n", target, debugstr_a(dest), err_code, type);
+
+    if (dest && !MultiByteToWideChar(CP_ACP, 0, dest, -1, dest_w, MAX_PATH))
+    {
+        WARN("Failed to convert input string.\n");
+        *err_code = ERROR_BAD_PATHNAME;
+        return NULL;
+    }
+
+    handle = tr2_sys__Open_dir_wchar(target_w, dest ? dest_w : NULL, err_code, type);
+
+    if (handle)
+        WideCharToMultiByte(CP_ACP, 0, target_w, -1, target, MAX_PATH, NULL, NULL);
+
+    return handle;
+}
+
 /* ?_Read_dir at sys@tr2 at std@@YAPADAAY0BAE at DPAXAAW4file_type@123@@Z */
 /* ?_Read_dir at sys@tr2 at std@@YAPEADAEAY0BAE at DPEAXAEAW4file_type@123@@Z */
 char* __cdecl tr2_sys__Read_dir(char* target, void* handle, enum file_type* type)
-- 
2.13.0




More information about the wine-patches mailing list