From debd7d36d007afae100ca0f5a2dffda985d567d3 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Thu, 15 Apr 2010 13:42:27 +0200 Subject: [PATCH] msvcrt: Implement findfirst64 and findnext64. --- dlls/msvcrt/dir.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/msvcrt.spec | 4 ++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index da688bf74dc..a9f9234d604 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -96,6 +96,27 @@ static void msvcrt_fttofdi64( const WIN32_FIND_DATAA *fd, struct MSVCRT__finddat strcpy(ft->name, fd->cFileName); } +/* INTERNAL: Translate WIN32_FIND_DATAA to finddata64_t */ +static void msvcrt_fttofd64( const WIN32_FIND_DATAA *fd, struct MSVCRT__finddata64_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) { @@ -288,6 +309,27 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirsti64(const char * fspec, struct MSVCRT__fi } /********************************************************************* + * _findfirst64 (MSVCRT.@) + * + * 64-bit version of _findfirst. + */ +MSVCRT_intptr_t CDECL MSVCRT__findfirst64(const char * fspec, struct MSVCRT__finddata64_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_fttofd64(&find_data,ft); + TRACE(":got handle %p\n",hfind); + return (MSVCRT_intptr_t)hfind; +} + +/********************************************************************* * _wfindfirsti64 (MSVCRT.@) * * Unicode version of _findfirsti64. @@ -377,6 +419,25 @@ int CDECL MSVCRT__findnexti64(MSVCRT_intptr_t hand, struct MSVCRT__finddatai64_t } /********************************************************************* + * _findnext64 (MSVCRT.@) + * + * 64-bit version of _findnext. + */ +int CDECL MSVCRT__findnext64(long hand, struct MSVCRT__finddata64_t * ft) +{ + WIN32_FIND_DATAA find_data; + + if (!FindNextFileA((HANDLE)hand, &find_data)) + { + *MSVCRT__errno() = MSVCRT_ENOENT; + return -1; + } + + msvcrt_fttofd64(&find_data,ft); + return 0; +} + +/********************************************************************* * _wfindnexti64 (MSVCRT.@) * * Unicode version of _findnexti64. diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index d61e2500e16..22e921ee408 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -373,10 +373,10 @@ @ cdecl _fileno(ptr) MSVCRT__fileno @ cdecl _findclose(long) MSVCRT__findclose @ cdecl _findfirst(str ptr) MSVCRT__findfirst -# stub _findfirst64 +@ cdecl _findfirst64(str ptr) MSVCRT__findfirst64 @ cdecl _findfirsti64(str ptr) MSVCRT__findfirsti64 @ cdecl _findnext(long ptr) MSVCRT__findnext -# stub _findnext64 +@ cdecl _findnext64(long ptr) MSVCRT__findnext64 @ cdecl _findnexti64(long ptr) MSVCRT__findnexti64 @ cdecl _finite( double ) @ cdecl _flsbuf(long ptr) MSVCRT__flsbuf -- 2.11.4.GIT