1 /**
2  * WinPR: Windows Portable Runtime
3  * File Functions
4  *
5  * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  * Copyright 2016 David PHAM-VAN <d.phamvan@inuvika.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #ifndef WINPR_FILE_H
22 #define WINPR_FILE_H
23 
24 #include <winpr/winpr.h>
25 #include <winpr/wtypes.h>
26 
27 #include <winpr/nt.h>
28 #include <winpr/io.h>
29 #include <winpr/error.h>
30 
31 #ifndef _WIN32
32 
33 #ifndef MAX_PATH
34 #define MAX_PATH 260
35 #endif
36 
37 #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
38 #define INVALID_FILE_SIZE ((DWORD)0xFFFFFFFF)
39 #define INVALID_SET_FILE_POINTER ((DWORD)-1)
40 #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
41 
42 #define FILE_ATTRIBUTE_READONLY 0x00000001
43 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
44 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
45 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
46 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
47 #define FILE_ATTRIBUTE_DEVICE 0x00000040
48 #define FILE_ATTRIBUTE_NORMAL 0x00000080
49 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
50 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
51 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
52 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
53 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
54 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
55 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
56 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
57 
58 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
59 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
60 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
61 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
62 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
63 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
64 #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
65 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
66 
67 #define FILE_ACTION_ADDED 0x00000001
68 #define FILE_ACTION_REMOVED 0x00000002
69 #define FILE_ACTION_MODIFIED 0x00000003
70 #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
71 #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
72 
73 #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
74 #define FILE_CASE_PRESERVED_NAMES 0x00000002
75 #define FILE_UNICODE_ON_DISK 0x00000004
76 #define FILE_PERSISTENT_ACLS 0x00000008
77 #define FILE_FILE_COMPRESSION 0x00000010
78 #define FILE_VOLUME_QUOTAS 0x00000020
79 #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
80 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
81 #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
82 #define FILE_VOLUME_IS_COMPRESSED 0x00008000
83 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
84 #define FILE_SUPPORTS_ENCRYPTION 0x00020000
85 #define FILE_NAMED_STREAMS 0x00040000
86 #define FILE_READ_ONLY_VOLUME 0x00080000
87 #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
88 #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
89 #define FILE_SUPPORTS_HARD_LINKS 0x00400000
90 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
91 #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
92 #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
93 
94 #define FILE_FLAG_WRITE_THROUGH 0x80000000
95 #define FILE_FLAG_OVERLAPPED 0x40000000
96 #define FILE_FLAG_NO_BUFFERING 0x20000000
97 #define FILE_FLAG_RANDOM_ACCESS 0x10000000
98 #define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000
99 #define FILE_FLAG_DELETE_ON_CLOSE 0x04000000
100 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000
101 #define FILE_FLAG_POSIX_SEMANTICS 0x01000000
102 #define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000
103 #define FILE_FLAG_OPEN_NO_RECALL 0x00100000
104 #define FILE_FLAG_FIRST_PIPE_INSTANCE 0x00080000
105 
106 #define PAGE_NOACCESS 0x00000001
107 #define PAGE_READONLY 0x00000002
108 #define PAGE_READWRITE 0x00000004
109 #define PAGE_WRITECOPY 0x00000008
110 #define PAGE_EXECUTE 0x00000010
111 #define PAGE_EXECUTE_READ 0x00000020
112 #define PAGE_EXECUTE_READWRITE 0x00000040
113 #define PAGE_EXECUTE_WRITECOPY 0x00000080
114 #define PAGE_GUARD 0x00000100
115 #define PAGE_NOCACHE 0x00000200
116 #define PAGE_WRITECOMBINE 0x00000400
117 
118 #define MEM_COMMIT 0x00001000
119 #define MEM_RESERVE 0x00002000
120 #define MEM_DECOMMIT 0x00004000
121 #define MEM_RELEASE 0x00008000
122 #define MEM_FREE 0x00010000
123 #define MEM_PRIVATE 0x00020000
124 #define MEM_MAPPED 0x00040000
125 #define MEM_RESET 0x00080000
126 #define MEM_TOP_DOWN 0x00100000
127 #define MEM_WRITE_WATCH 0x00200000
128 #define MEM_PHYSICAL 0x00400000
129 #define MEM_4MB_PAGES 0x80000000
130 #define MEM_IMAGE SEC_IMAGE
131 
132 #define SEC_NO_CHANGE 0x00400000
133 #define SEC_FILE 0x00800000
134 #define SEC_IMAGE 0x01000000
135 #define SEC_VLM 0x02000000
136 #define SEC_RESERVE 0x04000000
137 #define SEC_COMMIT 0x08000000
138 #define SEC_NOCACHE 0x10000000
139 #define SEC_WRITECOMBINE 0x40000000
140 #define SEC_LARGE_PAGES 0x80000000
141 
142 #define SECTION_MAP_EXECUTE_EXPLICIT 0x00020
143 #define SECTION_EXTEND_SIZE 0x00010
144 #define SECTION_MAP_READ 0x00004
145 #define SECTION_MAP_WRITE 0x00002
146 #define SECTION_QUERY 0x00001
147 #define SECTION_MAP_EXECUTE 0x00008
148 #define SECTION_ALL_ACCESS 0xF001F
149 
150 #define FILE_MAP_COPY SECTION_QUERY
151 #define FILE_MAP_WRITE SECTION_MAP_WRITE
152 #define FILE_MAP_READ SECTION_MAP_READ
153 #define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS
154 #define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT
155 
156 #define CREATE_NEW 1
157 #define CREATE_ALWAYS 2
158 #define OPEN_EXISTING 3
159 #define OPEN_ALWAYS 4
160 #define TRUNCATE_EXISTING 5
161 
162 #define FIND_FIRST_EX_CASE_SENSITIVE 0x1
163 #define FIND_FIRST_EX_LARGE_FETCH 0x2
164 
165 #define STD_INPUT_HANDLE (DWORD) - 10
166 #define STD_OUTPUT_HANDLE (DWORD) - 11
167 #define STD_ERROR_HANDLE (DWORD) - 12
168 
169 #define FILE_BEGIN 0
170 #define FILE_CURRENT 1
171 #define FILE_END 2
172 
173 #define LOCKFILE_FAIL_IMMEDIATELY 1
174 #define LOCKFILE_EXCLUSIVE_LOCK 2
175 
176 #define MOVEFILE_REPLACE_EXISTING 0x1
177 #define MOVEFILE_COPY_ALLOWED 0x2
178 #define MOVEFILE_DELAY_UNTIL_REBOOT 0x4
179 #define MOVEFILE_WRITE_THROUGH 0x8
180 #define MOVEFILE_CREATE_HARDLINK 0x10
181 #define MOVEFILE_FAIL_IF_NOT_TRACKABLE 0x20
182 
183 typedef union _FILE_SEGMENT_ELEMENT {
184 	PVOID64 Buffer;
185 	ULONGLONG Alignment;
186 } FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
187 
188 typedef struct _WIN32_FIND_DATAA
189 {
190 	DWORD dwFileAttributes;
191 	FILETIME ftCreationTime;
192 	FILETIME ftLastAccessTime;
193 	FILETIME ftLastWriteTime;
194 	DWORD nFileSizeHigh;
195 	DWORD nFileSizeLow;
196 	DWORD dwReserved0;
197 	DWORD dwReserved1;
198 	CHAR cFileName[MAX_PATH];
199 	CHAR cAlternateFileName[14];
200 } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
201 
202 typedef struct _WIN32_FIND_DATAW
203 {
204 	DWORD dwFileAttributes;
205 	FILETIME ftCreationTime;
206 	FILETIME ftLastAccessTime;
207 	FILETIME ftLastWriteTime;
208 	DWORD nFileSizeHigh;
209 	DWORD nFileSizeLow;
210 	DWORD dwReserved0;
211 	DWORD dwReserved1;
212 	WCHAR cFileName[MAX_PATH];
213 	WCHAR cAlternateFileName[14];
214 } WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
215 
216 typedef enum _FINDEX_INFO_LEVELS
217 {
218 	FindExInfoStandard,
219 	FindExInfoMaxInfoLevel
220 } FINDEX_INFO_LEVELS;
221 
222 typedef enum _FINDEX_SEARCH_OPS
223 {
224 	FindExSearchNameMatch,
225 	FindExSearchLimitToDirectories,
226 	FindExSearchLimitToDevices,
227 	FindExSearchMaxSearchOp
228 } FINDEX_SEARCH_OPS;
229 
230 typedef VOID (*LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered,
231                                                 LPOVERLAPPED lpOverlapped);
232 
233 #ifdef UNICODE
234 #define WIN32_FIND_DATA WIN32_FIND_DATAW
235 #define PWIN32_FIND_DATA PWIN32_FIND_DATAW
236 #define LPWIN32_FIND_DATA LPWIN32_FIND_DATAW
237 #else
238 #define WIN32_FIND_DATA WIN32_FIND_DATAA
239 #define PWIN32_FIND_DATA PWIN32_FIND_DATAA
240 #define LPWIN32_FIND_DATA LPWIN32_FIND_DATAA
241 #endif
242 
243 #ifdef __cplusplus
244 extern "C"
245 {
246 #endif
247 
248 	WINPR_API HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
249 	                             LPSECURITY_ATTRIBUTES lpSecurityAttributes,
250 	                             DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
251 	                             HANDLE hTemplateFile);
252 
253 	WINPR_API HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
254 	                             LPSECURITY_ATTRIBUTES lpSecurityAttributes,
255 	                             DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
256 	                             HANDLE hTemplateFile);
257 
258 	WINPR_API BOOL DeleteFileA(LPCSTR lpFileName);
259 
260 	WINPR_API BOOL DeleteFileW(LPCWSTR lpFileName);
261 
262 	WINPR_API BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
263 	                        LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
264 
265 	WINPR_API BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
266 	                          LPOVERLAPPED lpOverlapped,
267 	                          LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
268 
269 	WINPR_API BOOL ReadFileScatter(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
270 	                               DWORD nNumberOfBytesToRead, LPDWORD lpReserved,
271 	                               LPOVERLAPPED lpOverlapped);
272 
273 	WINPR_API BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
274 	                         LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
275 
276 	WINPR_API BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
277 	                           LPOVERLAPPED lpOverlapped,
278 	                           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
279 
280 	WINPR_API BOOL WriteFileGather(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
281 	                               DWORD nNumberOfBytesToWrite, LPDWORD lpReserved,
282 	                               LPOVERLAPPED lpOverlapped);
283 
284 	WINPR_API BOOL FlushFileBuffers(HANDLE hFile);
285 
286 	typedef struct _WIN32_FILE_ATTRIBUTE_DATA
287 	{
288 		DWORD dwFileAttributes;
289 		FILETIME ftCreationTime;
290 		FILETIME ftLastAccessTime;
291 		FILETIME ftLastWriteTime;
292 		DWORD nFileSizeHigh;
293 		DWORD nFileSizeLow;
294 	} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;
295 
296 	typedef enum _GET_FILEEX_INFO_LEVELS
297 	{
298 		GetFileExInfoStandard,
299 		GetFileExMaxInfoLevel
300 	} GET_FILEEX_INFO_LEVELS;
301 
302 	WINPR_API BOOL GetFileAttributesExA(LPCSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId,
303 	                                    LPVOID lpFileInformation);
304 
305 	WINPR_API DWORD GetFileAttributesA(LPCSTR lpFileName);
306 
307 	WINPR_API BOOL GetFileAttributesExW(LPCWSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId,
308 	                                    LPVOID lpFileInformation);
309 
310 	WINPR_API DWORD GetFileAttributesW(LPCWSTR lpFileName);
311 
312 	WINPR_API BOOL SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes);
313 
314 	WINPR_API BOOL SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes);
315 
316 	WINPR_API BOOL SetEndOfFile(HANDLE hFile);
317 
318 	WINPR_API DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
319 
320 	WINPR_API DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
321 	                               DWORD dwMoveMethod);
322 
323 	WINPR_API BOOL SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove,
324 	                                PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
325 
326 	WINPR_API BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
327 	                        DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
328 
329 	WINPR_API BOOL LockFileEx(HANDLE hFile, DWORD dwFlags, DWORD dwReserved,
330 	                          DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
331 	                          LPOVERLAPPED lpOverlapped);
332 
333 	WINPR_API BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
334 	                          DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
335 
336 	WINPR_API BOOL UnlockFileEx(HANDLE hFile, DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
337 	                            DWORD nNumberOfBytesToUnlockHigh, LPOVERLAPPED lpOverlapped);
338 
339 	WINPR_API BOOL SetFileTime(HANDLE hFile, const FILETIME* lpCreationTime,
340 	                           const FILETIME* lpLastAccessTime, const FILETIME* lpLastWriteTime);
341 
342 	WINPR_API HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
343 	WINPR_API HANDLE FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
344 
345 	WINPR_API HANDLE FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId,
346 	                                  LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp,
347 	                                  LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
348 	WINPR_API HANDLE FindFirstFileExW(LPCWSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId,
349 	                                  LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp,
350 	                                  LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
351 
352 	WINPR_API BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
353 	WINPR_API BOOL FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
354 
355 	WINPR_API BOOL FindClose(HANDLE hFindFile);
356 
357 	WINPR_API BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
358 	WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
359 
360 	WINPR_API BOOL RemoveDirectoryA(LPCSTR lpPathName);
361 	WINPR_API BOOL RemoveDirectoryW(LPCWSTR lpPathName);
362 
363 	WINPR_API HANDLE GetStdHandle(DWORD nStdHandle);
364 	WINPR_API BOOL SetStdHandle(DWORD nStdHandle, HANDLE hHandle);
365 	WINPR_API BOOL SetStdHandleEx(DWORD dwStdHandle, HANDLE hNewHandle, HANDLE* phOldHandle);
366 
367 	WINPR_API BOOL GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster,
368 	                                 LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters,
369 	                                 LPDWORD lpTotalNumberOfClusters);
370 
371 	WINPR_API BOOL GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster,
372 	                                 LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters,
373 	                                 LPDWORD lpTotalNumberOfClusters);
374 
375 	WINPR_API BOOL MoveFileExA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags);
376 
377 	WINPR_API BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags);
378 
379 	WINPR_API BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName);
380 
381 	WINPR_API BOOL MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName);
382 
383 #ifdef __cplusplus
384 }
385 #endif
386 
387 #ifdef UNICODE
388 #define CreateFile CreateFileW
389 #define DeleteFile DeleteFileW
390 #define FindFirstFile FindFirstFileW
391 #define FindFirstFileEx FindFirstFileExW
392 #define FindNextFile FindNextFileW
393 #define CreateDirectory CreateDirectoryW
394 #define RemoveDirectory RemoveDirectoryW
395 #define GetFileAttributesEx GetFileAttributesExW
396 #define GetFileAttributes GetFileAttributesW
397 #define SetFileAttributes SetFileAttributesW
398 #define GetDiskFreeSpace GetDiskFreeSpaceW
399 #define MoveFileEx MoveFileExW
400 #define MoveFile MoveFileW
401 #else
402 #define CreateFile CreateFileA
403 #define DeleteFile DeleteFileA
404 #define FindFirstFile FindFirstFileA
405 #define FindFirstFileEx FindFirstFileExA
406 #define FindNextFile FindNextFileA
407 #define CreateDirectory CreateDirectoryA
408 #define RemoveDirectory RemoveDirectoryA
409 #define GetFileAttributesEx GetFileAttributesExA
410 #define GetFileAttributes GetFileAttributesA
411 #define SetFileAttributes SetFileAttributesA
412 #define GetDiskFreeSpace GetDiskFreeSpaceA
413 #define MoveFileEx MoveFileExA
414 #define MoveFile MoveFileA
415 #endif
416 
417 /* Extra Functions */
418 
419 typedef BOOL (*pcIsFileHandled)(LPCSTR lpFileName);
420 typedef HANDLE (*pcCreateFileA)(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
421                                 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
422                                 DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
423                                 HANDLE hTemplateFile);
424 
425 typedef struct _HANDLE_CREATOR
426 {
427 	pcIsFileHandled IsHandled;
428 	pcCreateFileA CreateFileA;
429 } HANDLE_CREATOR, *PHANDLE_CREATOR, *LPHANDLE_CREATOR;
430 
431 WINPR_API BOOL ValidFileNameComponent(LPCWSTR lpFileName);
432 
433 #endif /* _WIN32 */
434 
435 #ifdef _UWP
436 
437 #ifdef __cplusplus
438 extern "C"
439 {
440 #endif
441 
442 	WINPR_API HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
443 	                             LPSECURITY_ATTRIBUTES lpSecurityAttributes,
444 	                             DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
445 	                             HANDLE hTemplateFile);
446 
447 	WINPR_API HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
448 	                             LPSECURITY_ATTRIBUTES lpSecurityAttributes,
449 	                             DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
450 	                             HANDLE hTemplateFile);
451 
452 	WINPR_API DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
453 
454 	WINPR_API DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
455 	                               DWORD dwMoveMethod);
456 
457 	WINPR_API HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
458 	WINPR_API HANDLE FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
459 
460 	WINPR_API DWORD GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer,
461 	                                 LPSTR* lpFilePart);
462 
463 	WINPR_API BOOL GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster,
464 	                                 LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters,
465 	                                 LPDWORD lpTotalNumberOfClusters);
466 
467 	WINPR_API BOOL GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster,
468 	                                 LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters,
469 	                                 LPDWORD lpTotalNumberOfClusters);
470 
471 	WINPR_API DWORD GetLogicalDriveStringsA(DWORD nBufferLength, LPSTR lpBuffer);
472 
473 	WINPR_API DWORD GetLogicalDriveStringsW(DWORD nBufferLength, LPWSTR lpBuffer);
474 
475 	WINPR_API BOOL PathIsDirectoryEmptyA(LPCSTR pszPath);
476 
477 	WINPR_API UINT GetACP(void);
478 
479 #ifdef UNICODE
480 #define CreateFile CreateFileW
481 #define FindFirstFile FindFirstFileW
482 #else
483 #define CreateFile CreateFileA
484 #define FindFirstFile FindFirstFileA
485 #endif
486 
487 #ifdef __cplusplus
488 }
489 #endif
490 
491 #ifdef UNICODE
492 #define FindFirstFile FindFirstFileW
493 #else
494 #define FindFirstFile FindFirstFileA
495 #endif
496 
497 #endif
498 
499 #define WILDCARD_STAR 0x00000001
500 #define WILDCARD_QM 0x00000002
501 #define WILDCARD_DOS 0x00000100
502 #define WILDCARD_DOS_STAR 0x00000110
503 #define WILDCARD_DOS_QM 0x00000120
504 #define WILDCARD_DOS_DOT 0x00000140
505 
506 #ifdef __cplusplus
507 extern "C"
508 {
509 #endif
510 
511 	WINPR_API BOOL FilePatternMatchA(LPCSTR lpFileName, LPCSTR lpPattern);
512 	WINPR_API LPSTR FilePatternFindNextWildcardA(LPCSTR lpPattern, DWORD* pFlags);
513 
514 	WINPR_API int UnixChangeFileMode(const char* filename, int flags);
515 
516 	WINPR_API BOOL IsNamedPipeFileNameA(LPCSTR lpName);
517 	WINPR_API char* GetNamedPipeNameWithoutPrefixA(LPCSTR lpName);
518 	WINPR_API char* GetNamedPipeUnixDomainSocketBaseFilePathA(void);
519 	WINPR_API char* GetNamedPipeUnixDomainSocketFilePathA(LPCSTR lpName);
520 
521 	WINPR_API int GetNamePipeFileDescriptor(HANDLE hNamedPipe);
522 	WINPR_API HANDLE GetFileHandleForFileDescriptor(int fd);
523 
524 WINPR_API FILE* winpr_fopen(const char* path, const char* mode);
525 
526 #ifdef __cplusplus
527 }
528 #endif
529 
530 #endif /* WINPR_FILE_H */
531