ReactOS 0.4.16-dev-852-gcfcc8d8
findfile.cpp File Reference
#include <corecrt_internal.h>
#include <errno.h>
#include <corecrt_internal_time.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <corecrt_internal_win32_buffer.h>
Include dependency graph for findfile.cpp:

Go to the source code of this file.

Functions

template<typename CrtTime >
static CrtTime __cdecl convert_system_time_to_time_t (SYSTEMTIME const &st) throw ()
 
template<>
__time32_t __cdecl convert_system_time_to_time_t (SYSTEMTIME const &st) throw ()
 
template<>
__time64_t __cdecl convert_system_time_to_time_t (SYSTEMTIME const &st) throw ()
 
template<typename CrtTime >
static CrtTime __cdecl convert_file_time_to_time_t (FILETIME const &ft) throw ()
 
template<typename Integer >
static Integer convert_file_size_to_integer (DWORD const high, DWORD const low) throw ()
 
template<>
__int64 convert_file_size_to_integer (DWORD const high, DWORD const low) throw ()
 
template<>
unsigned long convert_file_size_to_integer (DWORD const high, DWORD const low) throw ()
 
template<typename WideFileData , typename NarrowFileData >
 _Success_ (return) static bool __cdecl copy_wide_to_narrow_find_data(WideFileData const &wfd
 
_Out_ NarrowFileData unsigned int const code_page throw ()
 
template<typename WideFileData >
 _Success_ (return !=-1) static intptr_t __cdecl common_find_first_wide(wchar_t const *const pattern
 
template<typename WideFileData , typename NarrowFileData >
 _Success_ (return !=-1) static intptr_t __cdecl common_find_first_narrow(char const *const pattern
 
intptr_t __cdecl _findfirst32 (char const *const pattern, _finddata32_t *const result)
 
intptr_t __cdecl _findfirst32i64 (char const *const pattern, _finddata32i64_t *const result)
 
intptr_t __cdecl _findfirst64i32 (char const *const pattern, _finddata64i32_t *const result)
 
intptr_t __cdecl _findfirst64 (char const *const pattern, __finddata64_t *const result)
 
intptr_t __cdecl _wfindfirst32 (wchar_t const *const pattern, _wfinddata32_t *const result)
 
intptr_t __cdecl _wfindfirst32i64 (wchar_t const *const pattern, _wfinddata32i64_t *const result)
 
intptr_t __cdecl _wfindfirst64i32 (wchar_t const *const pattern, _wfinddata64i32_t *const result)
 
intptr_t __cdecl _wfindfirst64 (wchar_t const *const pattern, _wfinddata64_t *const result)
 
template<typename WideFileData >
static int __cdecl common_find_next_wide (intptr_t const handle, WideFileData *const result) throw ()
 
template<typename WideFileData , typename NarrowFileData >
static int __cdecl common_find_next_narrow (intptr_t const pattern, NarrowFileData *const result, unsigned int const code_page) throw ()
 
int __cdecl _findnext32 (intptr_t const handle, _finddata32_t *const result)
 
int __cdecl _findnext32i64 (intptr_t const handle, _finddata32i64_t *const result)
 
int __cdecl _findnext64i32 (intptr_t const handle, _finddata64i32_t *const result)
 
int __cdecl _findnext64 (intptr_t const handle, __finddata64_t *const result)
 
int __cdecl _wfindnext32 (intptr_t const handle, _wfinddata32_t *const result)
 
int __cdecl _wfindnext32i64 (intptr_t const handle, _wfinddata32i64_t *const result)
 
int __cdecl _wfindnext64i32 (intptr_t const handle, _wfinddata64i32_t *const result)
 
int __cdecl _wfindnext64 (intptr_t const handle, _wfinddata64_t *const result)
 
int __cdecl _findclose (intptr_t const handle)
 

Variables

_Out_ NarrowFileData & fd
 
_Out_ NarrowFileData *const result
 

Function Documentation

◆ _findclose()

int __cdecl _findclose ( intptr_t const  handle)

Definition at line 387 of file findfile.cpp.

388{
389 if (!FindClose(reinterpret_cast<HANDLE>(handle)))
390 {
391 errno = EINVAL;
392 return -1;
393 }
394 return 0;
395}
#define EINVAL
Definition: acclib.h:90
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
#define errno
Definition: errno.h:18

◆ _findfirst32()

intptr_t __cdecl _findfirst32 ( char const *const  pattern,
_finddata32_t *const  result 
)

Definition at line 198 of file findfile.cpp.

199{
200 return common_find_first_narrow<_wfinddata32_t>(pattern, result, __acrt_get_utf8_acp_compatibility_codepage());
201}
unsigned int __acrt_get_utf8_acp_compatibility_codepage()
GLubyte * pattern
Definition: glext.h:7787
GLuint64EXT * result
Definition: glext.h:11304

◆ _findfirst32i64()

intptr_t __cdecl _findfirst32i64 ( char const *const  pattern,
_finddata32i64_t *const  result 
)

Definition at line 204 of file findfile.cpp.

205{
206 return common_find_first_narrow<_wfinddata32i64_t>(pattern, result, __acrt_get_utf8_acp_compatibility_codepage());
207}

◆ _findfirst64()

intptr_t __cdecl _findfirst64 ( char const *const  pattern,
__finddata64_t *const  result 
)

Definition at line 216 of file findfile.cpp.

217{
218 return common_find_first_narrow<_wfinddata64_t>(pattern, result, __acrt_get_utf8_acp_compatibility_codepage());
219}

◆ _findfirst64i32()

intptr_t __cdecl _findfirst64i32 ( char const *const  pattern,
_finddata64i32_t *const  result 
)

Definition at line 210 of file findfile.cpp.

211{
212 return common_find_first_narrow<_wfinddata64i32_t>(pattern, result, __acrt_get_utf8_acp_compatibility_codepage());
213}

◆ _findnext32()

int __cdecl _findnext32 ( intptr_t const  handle,
_finddata32_t *const  result 
)

Definition at line 330 of file findfile.cpp.

331{
332 return common_find_next_narrow<_wfinddata32_t>(handle, result, __acrt_get_utf8_acp_compatibility_codepage());
333}

◆ _findnext32i64()

int __cdecl _findnext32i64 ( intptr_t const  handle,
_finddata32i64_t *const  result 
)

Definition at line 336 of file findfile.cpp.

337{
338 return common_find_next_narrow<_wfinddata32i64_t>(handle, result, __acrt_get_utf8_acp_compatibility_codepage());
339}

◆ _findnext64()

int __cdecl _findnext64 ( intptr_t const  handle,
__finddata64_t *const  result 
)

Definition at line 348 of file findfile.cpp.

349{
350 return common_find_next_narrow<_wfinddata64_t>(handle, result, __acrt_get_utf8_acp_compatibility_codepage());
351}

◆ _findnext64i32()

int __cdecl _findnext64i32 ( intptr_t const  handle,
_finddata64i32_t *const  result 
)

Definition at line 342 of file findfile.cpp.

343{
344 return common_find_next_narrow<_wfinddata64i32_t>(handle, result, __acrt_get_utf8_acp_compatibility_codepage());
345}

◆ _Success_() [1/3]

template<typename WideFileData , typename NarrowFileData >
_Success_ ( return = -1) const

◆ _Success_() [2/3]

template<typename WideFileData >
_Success_ ( return = -1) const

◆ _Success_() [3/3]

template<typename WideFileData , typename NarrowFileData >
_Success_ ( return  ) const &

◆ _wfindfirst32()

intptr_t __cdecl _wfindfirst32 ( wchar_t const *const  pattern,
_wfinddata32_t *const  result 
)

Definition at line 222 of file findfile.cpp.

223{
224 return common_find_first_wide(pattern, result);
225}

◆ _wfindfirst32i64()

intptr_t __cdecl _wfindfirst32i64 ( wchar_t const *const  pattern,
_wfinddata32i64_t *const  result 
)

Definition at line 228 of file findfile.cpp.

229{
230 return common_find_first_wide(pattern, result);
231}

◆ _wfindfirst64()

intptr_t __cdecl _wfindfirst64 ( wchar_t const *const  pattern,
_wfinddata64_t *const  result 
)

Definition at line 240 of file findfile.cpp.

241{
242 return common_find_first_wide(pattern, result);
243}

◆ _wfindfirst64i32()

intptr_t __cdecl _wfindfirst64i32 ( wchar_t const *const  pattern,
_wfinddata64i32_t *const  result 
)

Definition at line 234 of file findfile.cpp.

235{
236 return common_find_first_wide(pattern, result);
237}

◆ _wfindnext32()

int __cdecl _wfindnext32 ( intptr_t const  handle,
_wfinddata32_t *const  result 
)

Definition at line 354 of file findfile.cpp.

355{
357}
static int __cdecl common_find_next_wide(intptr_t const handle, WideFileData *const result)
Definition: findfile.cpp:266

◆ _wfindnext32i64()

int __cdecl _wfindnext32i64 ( intptr_t const  handle,
_wfinddata32i64_t *const  result 
)

Definition at line 360 of file findfile.cpp.

361{
363}

◆ _wfindnext64()

int __cdecl _wfindnext64 ( intptr_t const  handle,
_wfinddata64_t *const  result 
)

Definition at line 372 of file findfile.cpp.

373{
375}

◆ _wfindnext64i32()

int __cdecl _wfindnext64i32 ( intptr_t const  handle,
_wfinddata64i32_t *const  result 
)

Definition at line 366 of file findfile.cpp.

367{
369}

◆ common_find_next_narrow()

template<typename WideFileData , typename NarrowFileData >
static int __cdecl common_find_next_narrow ( intptr_t const  pattern,
NarrowFileData *const  result,
unsigned int const  code_page 
)
throw (
)
static

Definition at line 316 of file findfile.cpp.

317{
318 WideFileData wide_result;
319 int const return_value = common_find_next_wide(pattern, &wide_result);
320 if (return_value == -1)
321 return -1;
322
323 if (!copy_wide_to_narrow_find_data(wide_result, *result, code_page))
324 return -1;
325
326 return return_value;
327}
_Out_opt_ UINT * code_page

◆ common_find_next_wide()

template<typename WideFileData >
static int __cdecl common_find_next_wide ( intptr_t const  handle,
WideFileData *const  result 
)
throw (
)
static

Definition at line 266 of file findfile.cpp.

267{
268 HANDLE const os_handle = reinterpret_cast<HANDLE>(handle);
269
270 _VALIDATE_RETURN(os_handle != 0 , EINVAL, -1);
272 _VALIDATE_RETURN(result != nullptr, EINVAL, -1);
273
275 if (!FindNextFileW(os_handle, &wfd))
276 {
277 DWORD const os_error = GetLastError();
278 switch (os_error)
279 {
283 errno = ENOENT;
284 break;
285
287 errno = ENOMEM;
288 break;
289
290 default:
291 errno = EINVAL;
292 break;
293 }
294
295 return -1;
296 }
297
298 result->attrib = wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL
299 ? 0
300 : wfd.dwFileAttributes;
301
302 typedef decltype(result->time_create) crt_time_type;
303 result->time_create = convert_file_time_to_time_t<crt_time_type>(wfd.ftCreationTime);
304 result->time_access = convert_file_time_to_time_t<crt_time_type>(wfd.ftLastAccessTime);
305 result->time_write = convert_file_time_to_time_t<crt_time_type>(wfd.ftLastWriteTime);
306
307 typedef decltype(result->size) file_size_type;
308 result->size = convert_file_size_to_integer<file_size_type>(wfd.nFileSizeHigh, wfd.nFileSizeLow);
309
310 _ERRCHECK(wcscpy_s(result->name, _countof(result->name), wfd.cFileName));
311
312 return 0;
313}
#define ENOENT
Definition: acclib.h:79
#define ENOMEM
Definition: acclib.h:84
#define _ERRCHECK(e)
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
unsigned long DWORD
Definition: ntddk_ex.h:95
#define wcscpy_s(d, l, s)
Definition: utility.h:201
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define _countof(array)
Definition: sndvol32.h:70
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define ERROR_NO_MORE_FILES
Definition: winerror.h:121

Referenced by _wfindnext32(), _wfindnext32i64(), _wfindnext64(), _wfindnext64i32(), and common_find_next_narrow().

◆ convert_file_size_to_integer() [1/3]

template<typename Integer >
static Integer convert_file_size_to_integer ( DWORD const  high,
DWORD const  low 
)
throw (
)
static

◆ convert_file_size_to_integer() [2/3]

template<>
__int64 convert_file_size_to_integer ( DWORD const  high,
DWORD const  low 
)
throw (
)

Definition at line 67 of file findfile.cpp.

68{
69 return static_cast<__int64>(high) * 0x100000000ll + static_cast<__int64>(low);
70}
#define __int64
Definition: basetyps.h:16

◆ convert_file_size_to_integer() [3/3]

template<>
unsigned long convert_file_size_to_integer ( DWORD const  high,
DWORD const  low 
)
throw (
)

Definition at line 73 of file findfile.cpp.

74{
76 return low;
77}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325

◆ convert_file_time_to_time_t()

template<typename CrtTime >
static CrtTime __cdecl convert_file_time_to_time_t ( FILETIME const ft)
throw (
)
static

Definition at line 44 of file findfile.cpp.

45{
46 // A FILETIME of 0 becomes a time_t of -1:
47 if (ft.dwLowDateTime == 0 && ft.dwHighDateTime == 0)
48 return static_cast<CrtTime>(-1);
49
50 SYSTEMTIME st_utc;
51 if (!FileTimeToSystemTime(&ft, &st_utc))
52 return static_cast<CrtTime>(-1);
53
54 SYSTEMTIME st_local;
55 if (!SystemTimeToTzSpecificLocalTime(nullptr, &st_utc, &st_local))
56 return static_cast<CrtTime>(-1);
57
58 return convert_system_time_to_time_t<CrtTime>(st_local);
59}
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI SystemTimeToTzSpecificLocalTime(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation, CONST SYSTEMTIME *lpUniversalTime, LPSYSTEMTIME lpLocalTime)
Definition: timezone.c:377

◆ convert_system_time_to_time_t() [1/3]

template<typename CrtTime >
static CrtTime __cdecl convert_system_time_to_time_t ( SYSTEMTIME const st)
throw (
)
static

◆ convert_system_time_to_time_t() [2/3]

template<>
__time32_t __cdecl convert_system_time_to_time_t ( SYSTEMTIME const st)
throw (
)

Definition at line 30 of file findfile.cpp.

31{
32 return __loctotime32_t(st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, -1);
33}
__time32_t __cdecl __loctotime32_t(int, int, int, int, int, int, int)
Definition: loctotime.cpp:93

◆ convert_system_time_to_time_t() [3/3]

template<>
__time64_t __cdecl convert_system_time_to_time_t ( SYSTEMTIME const st)
throw (
)

Definition at line 36 of file findfile.cpp.

37{
38 return __loctotime64_t(st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, -1);
39}
__time64_t __cdecl __loctotime64_t(int, int, int, int, int, int, int)
Definition: loctotime.cpp:106

◆ throw()

_Out_ NarrowFileData unsigned int const code_page throw ( )

Definition at line 83 of file findfile.cpp.

84{
86
87 errno_t const cvt = __acrt_wcs_to_mbs_cp(wfd.name, name, code_page);
88
89 if (cvt != 0) {
90 return false;
91 }
92
93 _ERRCHECK(strcpy_s(fd.name, _countof(fd.name), name.data()));
94
95 fd.attrib = wfd.attrib;
96 fd.time_create = wfd.time_create;
97 fd.time_access = wfd.time_access;
98 fd.time_write = wfd.time_write;
99 fd.size = wfd.size;
100
101 return true;
102}
errno_t __acrt_wcs_to_mbs_cp(wchar_t const *const null_terminated_input_string, __crt_win32_buffer< char, ResizePolicy > &win32_buffer, unsigned int const code_page)
static char * cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag)
Definition: fcvtbuf.c:45
_Out_ NarrowFileData & fd
Definition: findfile.cpp:83
#define strcpy_s(d, l, s)
Definition: utility.h:200
Definition: name.c:39
int errno_t
Definition: corecrt.h:615

Variable Documentation

◆ fd

_Out_ NarrowFileData& fd

Definition at line 83 of file findfile.cpp.

◆ result

_Out_ NarrowFileData* const result

Definition at line 174 of file findfile.cpp.