[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