[PATCH 2/3] msvcp: Implement the wchar version of _Read_dir.

Stefan Dösinger stefan at codeweavers.com
Thu May 18 06:33:42 CDT 2017


Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
 dlls/msvcp110/msvcp110.spec |  4 ++--
 dlls/msvcp120/msvcp120.spec |  4 ++--
 dlls/msvcp140/msvcp140.spec |  2 +-
 dlls/msvcp90/ios.c          | 28 +++++++++++++++++++++-------
 4 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 0627aed61f..4001b68190 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -1713,8 +1713,8 @@
 @ cdecl ?_Random_device at std@@YAIXZ() _Random_device
 @ cdecl -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPADPADPAXAAW4file_type at 123@@Z(ptr ptr ptr) tr2_sys__Read_dir
 @ cdecl -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEADPEADPEAXAEAW4file_type at 123@@Z(ptr ptr ptr) tr2_sys__Read_dir
-@ stub -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPA_WPA_WPAXAAW4file_type at 123@@Z
-@ stub -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEA_WPEA_WPEAXAEAW4file_type at 123@@Z
+@ cdecl -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPA_WPA_WPAXAAW4file_type at 123@@Z(ptr ptr ptr) tr2_sys__Read_dir_wchar
+@ cdecl -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEA_WPEA_WPEAXAEAW4file_type at 123@@Z(ptr ptr ptr) tr2_sys__Read_dir_wchar
 @ cdecl -arch=arm ?_Release at _Pad@std@@QAAXXZ(ptr) _Pad__Release
 @ thiscall -arch=i386 ?_Release at _Pad@std@@QAEXXZ(ptr) _Pad__Release
 @ cdecl -arch=win64 ?_Release at _Pad@std@@QEAAXXZ(ptr) _Pad__Release
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index a2b82cbc25..7cd3514df2 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -1674,8 +1674,8 @@
 @ cdecl ?_Random_device at std@@YAIXZ() _Random_device
 @ cdecl -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPADAAY0BAE at DPAXAAW4file_type@123@@Z(ptr ptr ptr) tr2_sys__Read_dir
 @ cdecl -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEADAEAY0BAE at DPEAXAEAW4file_type@123@@Z(ptr ptr ptr) tr2_sys__Read_dir
-@ stub -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPA_WAAY0BAE at _WPAXAAW4file_type@123@@Z
-@ stub -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEA_WAEAY0BAE at _WPEAXAEAW4file_type@123@@Z
+@ cdecl -arch=win32 ?_Read_dir at sys@tr2 at std@@YAPA_WAAY0BAE at _WPAXAAW4file_type@123@@Z(ptr ptr ptr) tr2_sys__Read_dir_wchar
+@ cdecl -arch=win64 ?_Read_dir at sys@tr2 at std@@YAPEA_WAEAY0BAE at _WPEAXAEAW4file_type@123@@Z(ptr ptr ptr) tr2_sys__Read_dir_wchar
 @ cdecl -arch=arm ?_Release at _Pad@std@@QAAXXZ(ptr) _Pad__Release
 @ thiscall -arch=i386 ?_Release at _Pad@std@@QAEXXZ(ptr) _Pad__Release
 @ cdecl -arch=win64 ?_Release at _Pad@std@@QEAAXXZ(ptr) _Pad__Release
diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index faf0578de9..d5cedf9cbd 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -3692,7 +3692,7 @@
 @ 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
+@ cdecl _Read_dir(ptr ptr ptr) tr2_sys__Read_dir_wchar
 @ stub _Remove_dir
 @ stub _Rename
 @ stub _Resize
diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c
index f78618c294..a14306ed80 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -14968,23 +14968,25 @@ void* __cdecl tr2_sys__Open_dir(char* target, char const* dest, int* err_code, e
     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)
+/* ??_Read_dir at sys@tr2 at std@@YAPA_WPA_WPAXAAW4file_type at 123@@Z */
+/* ??_Read_dir at sys@tr2 at std@@YAPEA_WPEA_WPEAXAEAW4file_type at 123@@Z */
+wchar_t* __cdecl tr2_sys__Read_dir_wchar(wchar_t* target, void* handle, enum file_type* type)
 {
-    WIN32_FIND_DATAA data;
+    WIN32_FIND_DATAW data;
+    static const wchar_t dot[] = {'.', 0};
+    static const wchar_t dotdot[] = {'.', '.', 0};
 
     TRACE("(%p %p %p)\n", target, handle, type);
 
     do {
-        if(!FindNextFileA(handle, &data)) {
+        if(!FindNextFileW(handle, &data)) {
             *type = status_unknown;
             *target = '\0';
             return target;
         }
-    } while(!strcmp(data.cFileName, ".") || !strcmp(data.cFileName, ".."));
+    } while(!wcscmp(data.cFileName, dot) || !wcscmp(data.cFileName, dotdot));
 
-    strcpy(target, data.cFileName);
+    wcscpy(target, data.cFileName);
     if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         *type = directory_file;
     else
@@ -14992,6 +14994,18 @@ char* __cdecl tr2_sys__Read_dir(char* target, void* handle, enum file_type* type
     return target;
 }
 
+/* ?_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)
+{
+    wchar_t target_w[MAX_PATH];
+
+    tr2_sys__Read_dir_wchar(target_w, handle, type);
+    WideCharToMultiByte(CP_ACP, 0, target_w, -1, target, wcslen(target_w) + 1, NULL, NULL);
+
+    return target;
+}
+
 /* ?_Close_dir at sys@tr2 at std@@YAXPAX at Z */
 /* ?_Close_dir at sys@tr2 at std@@YAXPEAX at Z */
 void __cdecl tr2_sys__Close_dir(void* handle)
-- 
2.13.0




More information about the wine-patches mailing list