[PATCH] msvcrt: Implement _findfirst64i32 and _findnext64i32.

Eryk Wieliczko ewdevel at gmail.com
Mon Nov 1 14:52:22 CDT 2010


Fixes bug #23101
---
 dlls/msvcr100/msvcr100.spec |    4 +-
 dlls/msvcr80/msvcr80.spec   |    4 +-
 dlls/msvcr90/msvcr90.spec   |    4 +-
 dlls/msvcrt/dir.c           |   59 +++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |    2 +
 5 files changed, 67 insertions(+), 6 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index ec0a1ba..c929e54 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -620,11 +620,11 @@
 @ stub _findfirst32
 @ stub _findfirst32i64
 @ cdecl _findfirst64(str ptr) msvcrt._findfirst64
-@ stub _findfirst64i32
+@ cdecl _findfirst64i32(str ptr) msvcrt._findfirst64i32
 @ stub _findnext32
 @ stub _findnext32i64
 @ cdecl _findnext64(long ptr) msvcrt._findnext64
-@ stub _findnext64i32
+@ cdecl _findnext64i32(long ptr) msvcrt._findnext64i32
 @ cdecl _finite( double ) msvcrt._finite
 @ cdecl _flsbuf(long ptr) msvcrt._flsbuf
 @ cdecl _flushall() msvcrt._flushall
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index a5bb126..ce77d9b 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -461,11 +461,11 @@
 @ stub _findfirst32
 @ stub _findfirst32i64
 @ cdecl _findfirst64(str ptr) msvcrt._findfirst64
-@ stub _findfirst64i32
+@ cdecl _findfirst64i32(str ptr) msvcrt._findfirst64i32
 @ stub _findnext32
 @ stub _findnext32i64
 @ cdecl _findnext64(long ptr) msvcrt._findnext64
-@ stub _findnext64i32
+@ cdecl _findnext64i32(long ptr) msvcrt._findnext64i32
 @ cdecl _finite( double ) msvcrt._finite
 @ cdecl _flsbuf(long ptr) msvcrt._flsbuf
 @ cdecl _flushall() msvcrt._flushall
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 14eec1b..0d48cb4 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -453,11 +453,11 @@
 @ stub _findfirst32
 @ stub _findfirst32i64
 @ cdecl _findfirst64(str ptr) msvcrt._findfirst64
-@ stub _findfirst64i32
+@ cdecl _findfirst64i32(str ptr) msvcrt._findfirst64i32
 @ stub _findnext32
 @ stub _findnext32i64
 @ cdecl _findnext64(long ptr) msvcrt._findnext64
-@ stub _findnext64i32
+@ cdecl _findnext64i32(long ptr) msvcrt._findnext64i32
 @ cdecl _finite( double ) msvcrt._finite
 @ cdecl _flsbuf(long ptr) msvcrt._flsbuf
 @ cdecl _flushall() msvcrt._flushall
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index 5b5f641..7123daa 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -116,6 +116,25 @@ static void msvcrt_fttofd64( const WIN32_FIND_DATAA *fd, struct MSVCRT__finddata
   strcpy(ft->name, fd->cFileName);
 }
 
+/* INTERNAL: Translate WIN32_FIND_DATAA to finddata64i32_t  */
+static void msvcrt_fttofd64i32( const WIN32_FIND_DATAA *fd, struct MSVCRT__finddata64i32_t* ft)
+{
+  DWORD dw;
+
+  if (fd->dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
+    ft->attrib = 0;
+  else
+    ft->attrib = fd->dwFileAttributes;
+
+  RtlTimeToSecondsSince1970( (const LARGE_INTEGER *)&fd->ftCreationTime, &dw );
+  ft->time_create = dw;
+  RtlTimeToSecondsSince1970( (const LARGE_INTEGER *)&fd->ftLastAccessTime, &dw );
+  ft->time_access = dw;
+  RtlTimeToSecondsSince1970( (const LARGE_INTEGER *)&fd->ftLastWriteTime, &dw );
+  ft->time_write = dw;
+  ft->size = ((__int64)fd->nFileSizeHigh) << 32 | fd->nFileSizeLow;
+  strcpy(ft->name, fd->cFileName);
+}
 
 /* INTERNAL: Translate WIN32_FIND_DATAW to wfinddatai64_t  */
 static void msvcrt_wfttofdi64( const WIN32_FIND_DATAW *fd, struct MSVCRT__wfinddatai64_t* ft)
@@ -330,6 +349,27 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirst64(const char * fspec, struct MSVCRT__fin
 }
 
 /*********************************************************************
+ *		_findfirst64i32 (MSVCRT.@)
+ *
+ * 64-bit/32-bit version of _findfirst.
+ */
+MSVCRT_intptr_t CDECL MSVCRT__findfirst64i32(const char * fspec, struct MSVCRT__finddata64i32_t* ft)
+{
+  WIN32_FIND_DATAA find_data;
+  HANDLE hfind;
+
+  hfind  = FindFirstFileA(fspec, &find_data);
+  if (hfind == INVALID_HANDLE_VALUE)
+  {
+    msvcrt_set_errno(GetLastError());
+    return -1;
+  }
+  msvcrt_fttofd64i32(&find_data,ft);
+  TRACE(":got handle %p\n",hfind);
+  return (MSVCRT_intptr_t)hfind;
+}
+
+/*********************************************************************
  *		_wfindfirsti64 (MSVCRT.@)
  *
  * Unicode version of _findfirsti64.
@@ -438,6 +478,25 @@ int CDECL MSVCRT__findnext64(long hand, struct MSVCRT__finddata64_t * ft)
 }
 
 /*********************************************************************
+ *		_findnext64i32 (MSVCRT.@)
+ *
+ * 64-bit/32-bit version of _findnext.
+ */
+int CDECL MSVCRT__findnext64i32(long hand, struct MSVCRT__finddata64i32_t * ft)
+{
+  WIN32_FIND_DATAA find_data;
+
+  if (!FindNextFileA((HANDLE)hand, &find_data))
+  {
+    *MSVCRT__errno() = MSVCRT_ENOENT;
+    return -1;
+  }
+
+  msvcrt_fttofd64i32(&find_data,ft);
+  return 0;
+}
+
+/*********************************************************************
  *		_wfindnexti64 (MSVCRT.@)
  *
  * Unicode version of _findnexti64.
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 1e8f06d..7b6b51c 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -413,9 +413,11 @@
 @ cdecl _findfirst(str ptr) MSVCRT__findfirst
 @ cdecl _findfirst64(str ptr) MSVCRT__findfirst64
 @ cdecl _findfirsti64(str ptr) MSVCRT__findfirsti64
+@ cdecl _findfirst64i32(str ptr) MSVCRT__findfirst64i32
 @ cdecl _findnext(long ptr) MSVCRT__findnext
 @ cdecl _findnext64(long ptr) MSVCRT__findnext64
 @ cdecl _findnexti64(long ptr) MSVCRT__findnexti64
+@ cdecl _findnext64i32(long ptr) MSVCRT__findnext64i32
 @ cdecl _finite( double )
 @ cdecl _flsbuf(long ptr) MSVCRT__flsbuf
 @ cdecl _flushall()
-- 
1.7.0.4




More information about the wine-patches mailing list