20#include <winpr/config.h>
21#include <winpr/version.h>
22#include <winpr/build-config.h>
25#include <winpr/tchar.h>
27#include <winpr/path.h>
28#include <winpr/file.h>
30#if defined(WITH_RESOURCE_VERSIONING)
34#define PATH_SLASH_CHR '/'
35#define PATH_SLASH_STR "/"
37#define PATH_BACKSLASH_CHR '\\'
38#define PATH_BACKSLASH_STR "\\"
41#define PATH_SLASH_STR_W L"/"
42#define PATH_BACKSLASH_STR_W L"\\"
44#define PATH_SLASH_STR_W \
48#define PATH_BACKSLASH_STR_W \
55#define PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
56#define PATH_SEPARATOR_STR PATH_BACKSLASH_STR
57#define PATH_SEPARATOR_STR_W PATH_BACKSLASH_STR_W
59#define PATH_SEPARATOR_CHR PATH_SLASH_CHR
60#define PATH_SEPARATOR_STR PATH_SLASH_STR
61#define PATH_SEPARATOR_STR_W PATH_SLASH_STR_W
65#define TAG WINPR_TAG("path")
73#define DEFINE_UNICODE FALSE
74#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
75#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashA
76#include "include/PathCchAddSeparator.h"
78#undef CUR_PATH_SEPARATOR_CHR
79#undef PATH_CCH_ADD_SEPARATOR
81#define DEFINE_UNICODE TRUE
82#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
83#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashW
84#include "include/PathCchAddSeparator.h"
86#undef CUR_PATH_SEPARATOR_CHR
87#undef PATH_CCH_ADD_SEPARATOR
91#define DEFINE_UNICODE FALSE
92#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
93#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashA
94#include "include/PathCchAddSeparator.h"
96#undef CUR_PATH_SEPARATOR_CHR
97#undef PATH_CCH_ADD_SEPARATOR
99#define DEFINE_UNICODE TRUE
100#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
101#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashW
102#include "include/PathCchAddSeparator.h"
104#undef CUR_PATH_SEPARATOR_CHR
105#undef PATH_CCH_ADD_SEPARATOR
109#define DEFINE_UNICODE FALSE
110#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
111#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorA
112#include "include/PathCchAddSeparator.h"
114#undef CUR_PATH_SEPARATOR_CHR
115#undef PATH_CCH_ADD_SEPARATOR
117#define DEFINE_UNICODE TRUE
118#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
119#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorW
120#include "include/PathCchAddSeparator.h"
122#undef CUR_PATH_SEPARATOR_CHR
123#undef PATH_CCH_ADD_SEPARATOR
129HRESULT PathCchRemoveBackslashA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
131 WLog_ERR(TAG,
"not implemented");
135HRESULT PathCchRemoveBackslashW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
137 WLog_ERR(TAG,
"not implemented");
147#define DEFINE_UNICODE FALSE
148#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
149#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExA
150#include "include/PathCchAddSeparatorEx.h"
152#undef CUR_PATH_SEPARATOR_CHR
153#undef PATH_CCH_ADD_SEPARATOR_EX
155#define DEFINE_UNICODE TRUE
156#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
157#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExW
158#include "include/PathCchAddSeparatorEx.h"
160#undef CUR_PATH_SEPARATOR_CHR
161#undef PATH_CCH_ADD_SEPARATOR_EX
165#define DEFINE_UNICODE FALSE
166#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
167#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExA
168#include "include/PathCchAddSeparatorEx.h"
170#undef CUR_PATH_SEPARATOR_CHR
171#undef PATH_CCH_ADD_SEPARATOR_EX
173#define DEFINE_UNICODE TRUE
174#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
175#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExW
176#include "include/PathCchAddSeparatorEx.h"
178#undef CUR_PATH_SEPARATOR_CHR
179#undef PATH_CCH_ADD_SEPARATOR_EX
183#define DEFINE_UNICODE FALSE
184#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
185#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExA
186#include "include/PathCchAddSeparatorEx.h"
188#undef CUR_PATH_SEPARATOR_CHR
189#undef PATH_CCH_ADD_SEPARATOR_EX
191#define DEFINE_UNICODE TRUE
192#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
193#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExW
194#include "include/PathCchAddSeparatorEx.h"
196#undef CUR_PATH_SEPARATOR_CHR
197#undef PATH_CCH_ADD_SEPARATOR_EX
199HRESULT PathCchRemoveBackslashExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
200 WINPR_ATTR_UNUSED PSTR* ppszEnd,
201 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
203 WLog_ERR(TAG,
"not implemented");
207HRESULT PathCchRemoveBackslashExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
208 WINPR_ATTR_UNUSED PWSTR* ppszEnd,
209 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
211 WLog_ERR(TAG,
"not implemented");
221#define DEFINE_UNICODE FALSE
222#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
223#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
224#include "include/PathCchAddExtension.h"
226#undef CUR_PATH_SEPARATOR_CHR
227#undef PATH_CCH_ADD_EXTENSION
229#define DEFINE_UNICODE TRUE
230#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
231#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionW
232#include "include/PathCchAddExtension.h"
234#undef CUR_PATH_SEPARATOR_CHR
235#undef PATH_CCH_ADD_EXTENSION
239#define DEFINE_UNICODE FALSE
240#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
241#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionA
242#include "include/PathCchAddExtension.h"
244#undef CUR_PATH_SEPARATOR_CHR
245#undef PATH_CCH_ADD_EXTENSION
247#define DEFINE_UNICODE TRUE
248#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
249#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionW
250#include "include/PathCchAddExtension.h"
252#undef CUR_PATH_SEPARATOR_CHR
253#undef PATH_CCH_ADD_EXTENSION
257#define DEFINE_UNICODE FALSE
258#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
259#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionA
260#include "include/PathCchAddExtension.h"
262#undef CUR_PATH_SEPARATOR_CHR
263#undef PATH_CCH_ADD_EXTENSION
265#define DEFINE_UNICODE TRUE
266#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
267#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionW
268#include "include/PathCchAddExtension.h"
270#undef CUR_PATH_SEPARATOR_CHR
271#undef PATH_CCH_ADD_EXTENSION
279#define DEFINE_UNICODE FALSE
280#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
281#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
282#define PATH_CCH_APPEND PathCchAppendA
283#include "include/PathCchAppend.h"
285#undef CUR_PATH_SEPARATOR_CHR
286#undef CUR_PATH_SEPARATOR_STR
287#undef PATH_CCH_APPEND
289#define DEFINE_UNICODE TRUE
290#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
291#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
292#define PATH_CCH_APPEND PathCchAppendW
293#include "include/PathCchAppend.h"
295#undef CUR_PATH_SEPARATOR_CHR
296#undef CUR_PATH_SEPARATOR_STR
297#undef PATH_CCH_APPEND
301#define DEFINE_UNICODE FALSE
302#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
303#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
304#define PATH_CCH_APPEND UnixPathCchAppendA
305#include "include/PathCchAppend.h"
307#undef CUR_PATH_SEPARATOR_CHR
308#undef CUR_PATH_SEPARATOR_STR
309#undef PATH_CCH_APPEND
311#define DEFINE_UNICODE TRUE
312#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
313#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
314#define PATH_CCH_APPEND UnixPathCchAppendW
315#include "include/PathCchAppend.h"
317#undef CUR_PATH_SEPARATOR_CHR
318#undef CUR_PATH_SEPARATOR_STR
319#undef PATH_CCH_APPEND
323#define DEFINE_UNICODE FALSE
324#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
325#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
326#define PATH_CCH_APPEND NativePathCchAppendA
327#include "include/PathCchAppend.h"
329#undef CUR_PATH_SEPARATOR_CHR
330#undef CUR_PATH_SEPARATOR_STR
331#undef PATH_CCH_APPEND
333#define DEFINE_UNICODE TRUE
334#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
335#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
336#define PATH_CCH_APPEND NativePathCchAppendW
337#include "include/PathCchAppend.h"
339#undef CUR_PATH_SEPARATOR_CHR
340#undef CUR_PATH_SEPARATOR_STR
341#undef PATH_CCH_APPEND
347HRESULT PathCchAppendExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
348 WINPR_ATTR_UNUSED PCSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
350 WLog_ERR(TAG,
"not implemented");
354HRESULT PathCchAppendExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
355 WINPR_ATTR_UNUSED PCWSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
357 WLog_ERR(TAG,
"not implemented");
365HRESULT PathCchCanonicalizeA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
366 WINPR_ATTR_UNUSED PCSTR pszPathIn)
368 WLog_ERR(TAG,
"not implemented");
372HRESULT PathCchCanonicalizeW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
373 WINPR_ATTR_UNUSED
size_t cchPathOut,
374 WINPR_ATTR_UNUSED PCWSTR pszPathIn)
376 WLog_ERR(TAG,
"not implemented");
384HRESULT PathCchCanonicalizeExA(WINPR_ATTR_UNUSED PSTR pszPathOut,
385 WINPR_ATTR_UNUSED
size_t cchPathOut,
386 WINPR_ATTR_UNUSED PCSTR pszPathIn,
387 WINPR_ATTR_UNUSED
unsigned long dwFlags)
389 WLog_ERR(TAG,
"not implemented");
393HRESULT PathCchCanonicalizeExW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
394 WINPR_ATTR_UNUSED
size_t cchPathOut,
395 WINPR_ATTR_UNUSED PCWSTR pszPathIn,
396 WINPR_ATTR_UNUSED
unsigned long dwFlags)
398 WLog_ERR(TAG,
"not implemented");
406HRESULT PathAllocCanonicalizeA(WINPR_ATTR_UNUSED PCSTR pszPathIn,
407 WINPR_ATTR_UNUSED
unsigned long dwFlags,
408 WINPR_ATTR_UNUSED PSTR* ppszPathOut)
410 WLog_ERR(TAG,
"not implemented");
414HRESULT PathAllocCanonicalizeW(WINPR_ATTR_UNUSED PCWSTR pszPathIn,
415 WINPR_ATTR_UNUSED
unsigned long dwFlags,
416 WINPR_ATTR_UNUSED PWSTR* ppszPathOut)
418 WLog_ERR(TAG,
"not implemented");
426HRESULT PathCchCombineA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
427 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore)
429 WLog_ERR(TAG,
"not implemented");
433HRESULT PathCchCombineW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
434 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore)
436 WLog_ERR(TAG,
"not implemented");
444HRESULT PathCchCombineExA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
445 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore,
446 WINPR_ATTR_UNUSED
unsigned long dwFlags)
448 WLog_ERR(TAG,
"not implemented");
452HRESULT PathCchCombineExW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
453 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore,
454 WINPR_ATTR_UNUSED
unsigned long dwFlags)
456 WLog_ERR(TAG,
"not implemented");
466#define DEFINE_UNICODE FALSE
467#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
468#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
469#define PATH_ALLOC_COMBINE PathAllocCombineA
470#include "include/PathAllocCombine.h"
472#undef CUR_PATH_SEPARATOR_CHR
473#undef CUR_PATH_SEPARATOR_STR
474#undef PATH_ALLOC_COMBINE
476#define DEFINE_UNICODE TRUE
477#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
478#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
479#define PATH_ALLOC_COMBINE PathAllocCombineW
480#include "include/PathAllocCombine.h"
482#undef CUR_PATH_SEPARATOR_CHR
483#undef CUR_PATH_SEPARATOR_STR
484#undef PATH_ALLOC_COMBINE
488#define DEFINE_UNICODE FALSE
489#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
490#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
491#define PATH_ALLOC_COMBINE UnixPathAllocCombineA
492#include "include/PathAllocCombine.h"
494#undef CUR_PATH_SEPARATOR_CHR
495#undef CUR_PATH_SEPARATOR_STR
496#undef PATH_ALLOC_COMBINE
498#define DEFINE_UNICODE TRUE
499#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
500#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
501#define PATH_ALLOC_COMBINE UnixPathAllocCombineW
502#include "include/PathAllocCombine.h"
504#undef CUR_PATH_SEPARATOR_CHR
505#undef CUR_PATH_SEPARATOR_STR
506#undef PATH_ALLOC_COMBINE
510#define DEFINE_UNICODE FALSE
511#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
512#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
513#define PATH_ALLOC_COMBINE NativePathAllocCombineA
514#include "include/PathAllocCombine.h"
516#undef CUR_PATH_SEPARATOR_CHR
517#undef CUR_PATH_SEPARATOR_STR
518#undef PATH_ALLOC_COMBINE
520#define DEFINE_UNICODE TRUE
521#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
522#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
523#define PATH_ALLOC_COMBINE NativePathAllocCombineW
524#include "include/PathAllocCombine.h"
526#undef CUR_PATH_SEPARATOR_CHR
527#undef CUR_PATH_SEPARATOR_STR
528#undef PATH_ALLOC_COMBINE
534HRESULT PathCchFindExtensionA(PCSTR pszPath,
size_t cchPath, PCSTR* ppszExt)
536 const char* p = (
const char*)pszPath;
538 if (!pszPath || !cchPath || !ppszExt)
543 while (*p && --cchPath)
567 if ((*p ==
'\\') || (*p ==
'/') || (*p ==
':'))
576HRESULT PathCchFindExtensionW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
577 WINPR_ATTR_UNUSED PCWSTR* ppszExt)
579 WLog_ERR(TAG,
"not implemented");
587HRESULT PathCchRenameExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
588 WINPR_ATTR_UNUSED PCSTR pszExt)
590 WLog_ERR(TAG,
"not implemented");
594HRESULT PathCchRenameExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
595 WINPR_ATTR_UNUSED PCWSTR pszExt)
597 WLog_ERR(TAG,
"not implemented");
605HRESULT PathCchRemoveExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
607 WLog_ERR(TAG,
"not implemented");
611HRESULT PathCchRemoveExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
613 WLog_ERR(TAG,
"not implemented");
621BOOL PathCchIsRootA(WINPR_ATTR_UNUSED PCSTR pszPath)
623 WLog_ERR(TAG,
"not implemented");
627BOOL PathCchIsRootW(WINPR_ATTR_UNUSED PCWSTR pszPath)
629 WLog_ERR(TAG,
"not implemented");
637BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer)
642 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
644 *ppszServer = &pszPath[2];
651BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer)
656 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
658 *ppszServer = &pszPath[2];
669HRESULT PathCchSkipRootA(WINPR_ATTR_UNUSED PCSTR pszPath, WINPR_ATTR_UNUSED PCSTR* ppszRootEnd)
671 WLog_ERR(TAG,
"not implemented");
675HRESULT PathCchSkipRootW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED PCWSTR* ppszRootEnd)
677 WLog_ERR(TAG,
"not implemented");
685HRESULT PathCchStripToRootA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
687 WLog_ERR(TAG,
"not implemented");
691HRESULT PathCchStripToRootW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
693 WLog_ERR(TAG,
"not implemented");
701HRESULT PathCchStripPrefixA(PSTR pszPath,
size_t cchPath)
708 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
711 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
712 (pszPath[3] ==
'\\'))
721 if (IsCharAlpha(pszPath[4]) && (pszPath[5] ==
':'))
723 memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
728 pszPath[cchPath - 4] = 0;
736HRESULT PathCchStripPrefixW(PWSTR pszPath,
size_t cchPath)
743 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
746 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
747 (pszPath[3] ==
'\\'))
756 const size_t rc = (_wcslen(&pszPath[4]) + 1);
758 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
760 if (IsCharAlphaW(pszPath[4]) && (pszPath[5] == L
':'))
762 wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
767 pszPath[cchPath - 4] = 0;
779HRESULT PathCchRemoveFileSpecA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
781 WLog_ERR(TAG,
"not implemented");
785HRESULT PathCchRemoveFileSpecW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
787 WLog_ERR(TAG,
"not implemented");
799HRESULT PathCchConvertStyleA(PSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
801 if (dwFlags == PATH_STYLE_WINDOWS)
803 for (
size_t index = 0; index < cchPath; index++)
805 if (pszPath[index] == PATH_SLASH_CHR)
806 pszPath[index] = PATH_BACKSLASH_CHR;
809 else if (dwFlags == PATH_STYLE_UNIX)
811 for (
size_t index = 0; index < cchPath; index++)
813 if (pszPath[index] == PATH_BACKSLASH_CHR)
814 pszPath[index] = PATH_SLASH_CHR;
817 else if (dwFlags == PATH_STYLE_NATIVE)
819#if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
822 for (
size_t index = 0; index < cchPath; index++)
824 if (pszPath[index] == PATH_SLASH_CHR)
825 pszPath[index] = PATH_BACKSLASH_CHR;
827#elif (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
830 for (
size_t index = 0; index < cchPath; index++)
832 if (pszPath[index] == PATH_BACKSLASH_CHR)
833 pszPath[index] = PATH_SLASH_CHR;
849HRESULT PathCchConvertStyleW(PWSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
851 if (dwFlags == PATH_STYLE_WINDOWS)
853 for (
size_t index = 0; index < cchPath; index++)
855 if (pszPath[index] == PATH_SLASH_CHR)
856 pszPath[index] = PATH_BACKSLASH_CHR;
859 else if (dwFlags == PATH_STYLE_UNIX)
861 for (
size_t index = 0; index < cchPath; index++)
863 if (pszPath[index] == PATH_BACKSLASH_CHR)
864 pszPath[index] = PATH_SLASH_CHR;
867 else if (dwFlags == PATH_STYLE_NATIVE)
869#if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
873 for (
size_t index = 0; index < cchPath; index++)
875 if (pszPath[index] == PATH_SLASH_CHR)
876 pszPath[index] = PATH_BACKSLASH_CHR;
879#elif (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
883 for (
size_t index = 0; index < cchPath; index++)
885 if (pszPath[index] == PATH_BACKSLASH_CHR)
886 pszPath[index] = PATH_SLASH_CHR;
909char PathGetSeparatorA(
unsigned long dwFlags)
911 char separator = PATH_SEPARATOR_CHR;
914 dwFlags = PATH_STYLE_NATIVE;
916 if (dwFlags == PATH_STYLE_WINDOWS)
917 separator = PATH_SEPARATOR_CHR;
918 else if (dwFlags == PATH_STYLE_UNIX)
919 separator = PATH_SEPARATOR_CHR;
920 else if (dwFlags == PATH_STYLE_NATIVE)
921 separator = PATH_SEPARATOR_CHR;
926WCHAR PathGetSeparatorW(
unsigned long dwFlags)
934 cnv.c[0] = PATH_SEPARATOR_CHR;
938 dwFlags = PATH_STYLE_NATIVE;
940 if (dwFlags == PATH_STYLE_WINDOWS)
941 cnv.c[0] = PATH_SEPARATOR_CHR;
942 else if (dwFlags == PATH_STYLE_UNIX)
943 cnv.c[0] = PATH_SEPARATOR_CHR;
944 else if (dwFlags == PATH_STYLE_NATIVE)
945 cnv.c[0] = PATH_SEPARATOR_CHR;
953static const CHAR SharedLibraryExtensionDllA[] =
"dll";
954static const CHAR SharedLibraryExtensionSoA[] =
"so";
955static const CHAR SharedLibraryExtensionDylibA[] =
"dylib";
957static const CHAR SharedLibraryExtensionDotDllA[] =
".dll";
958static const CHAR SharedLibraryExtensionDotSoA[] =
".so";
959static const CHAR SharedLibraryExtensionDotDylibA[] =
".dylib";
960PCSTR PathGetSharedLibraryExtensionA(
unsigned long dwFlags)
962 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
964 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
966 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
967 return SharedLibraryExtensionDotDllA;
969 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
970 return SharedLibraryExtensionDotSoA;
972 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
973 return SharedLibraryExtensionDotDylibA;
977 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
978 return SharedLibraryExtensionDllA;
980 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
981 return SharedLibraryExtensionSoA;
983 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
984 return SharedLibraryExtensionDylibA;
988 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
991 return SharedLibraryExtensionDotDllA;
992#elif defined(__APPLE__)
993 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
994 return SharedLibraryExtensionDotSoA;
996 return SharedLibraryExtensionDotDylibA;
998 return SharedLibraryExtensionDotSoA;
1004 return SharedLibraryExtensionDllA;
1005#elif defined(__APPLE__)
1006 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1007 return SharedLibraryExtensionSoA;
1009 return SharedLibraryExtensionDylibA;
1011 return SharedLibraryExtensionSoA;
1018PCWSTR PathGetSharedLibraryExtensionW(
unsigned long dwFlags)
1020 static WCHAR buffer[6][16] = { 0 };
1021 const WCHAR* SharedLibraryExtensionDotDllW = InitializeConstWCharFromUtf8(
1022 SharedLibraryExtensionDotDllA, buffer[0], ARRAYSIZE(buffer[0]));
1023 const WCHAR* SharedLibraryExtensionDotSoW =
1024 InitializeConstWCharFromUtf8(SharedLibraryExtensionDotSoA, buffer[1], ARRAYSIZE(buffer[1]));
1025 const WCHAR* SharedLibraryExtensionDotDylibW = InitializeConstWCharFromUtf8(
1026 SharedLibraryExtensionDotDylibA, buffer[2], ARRAYSIZE(buffer[2]));
1027 const WCHAR* SharedLibraryExtensionDllW =
1028 InitializeConstWCharFromUtf8(SharedLibraryExtensionDllA, buffer[3], ARRAYSIZE(buffer[3]));
1029 const WCHAR* SharedLibraryExtensionSoW =
1030 InitializeConstWCharFromUtf8(SharedLibraryExtensionSoA, buffer[4], ARRAYSIZE(buffer[4]));
1031 const WCHAR* SharedLibraryExtensionDylibW =
1032 InitializeConstWCharFromUtf8(SharedLibraryExtensionDylibA, buffer[5], ARRAYSIZE(buffer[5]));
1034 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
1036 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1038 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1039 return SharedLibraryExtensionDotDllW;
1041 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1042 return SharedLibraryExtensionDotSoW;
1044 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1045 return SharedLibraryExtensionDotDylibW;
1049 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1050 return SharedLibraryExtensionDllW;
1052 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1053 return SharedLibraryExtensionSoW;
1055 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1056 return SharedLibraryExtensionDylibW;
1060 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1063 return SharedLibraryExtensionDotDllW;
1064#elif defined(__APPLE__)
1065 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1066 return SharedLibraryExtensionDotSoW;
1068 return SharedLibraryExtensionDotDylibW;
1070 return SharedLibraryExtensionDotSoW;
1076 return SharedLibraryExtensionDllW;
1077#elif defined(__APPLE__)
1078 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1079 return SharedLibraryExtensionSoW;
1081 return SharedLibraryExtensionDylibW;
1083 return SharedLibraryExtensionSoW;
1090const char* GetKnownPathIdString(
int id)
1094 case KNOWN_PATH_HOME:
1095 return "KNOWN_PATH_HOME";
1096 case KNOWN_PATH_TEMP:
1097 return "KNOWN_PATH_TEMP";
1098 case KNOWN_PATH_XDG_DATA_HOME:
1099 return "KNOWN_PATH_XDG_DATA_HOME";
1100 case KNOWN_PATH_XDG_CONFIG_HOME:
1101 return "KNOWN_PATH_XDG_CONFIG_HOME";
1102 case KNOWN_PATH_XDG_CACHE_HOME:
1103 return "KNOWN_PATH_XDG_CACHE_HOME";
1104 case KNOWN_PATH_XDG_RUNTIME_DIR:
1105 return "KNOWN_PATH_XDG_RUNTIME_DIR";
1106 case KNOWN_PATH_SYSTEM_CONFIG_HOME:
1107 return "KNOWN_PATH_SYSTEM_CONFIG_HOME";
1109 return "KNOWN_PATH_UNKNOWN_ID";
1113static WCHAR* concat(
const WCHAR* path,
size_t pathlen,
const WCHAR* name,
size_t namelen)
1115 WCHAR* str = calloc(pathlen + namelen + 1,
sizeof(WCHAR));
1119 _wcsncat(str, path, pathlen);
1120 _wcsncat(str, name, namelen);
1124BOOL winpr_RemoveDirectory_RecursiveA(LPCSTR lpPathName)
1126 WCHAR* name = ConvertUtf8ToWCharAlloc(lpPathName, NULL);
1129 const BOOL rc = winpr_RemoveDirectory_RecursiveW(name);
1134BOOL winpr_RemoveDirectory_RecursiveW(LPCWSTR lpPathName)
1141 const size_t pathnamelen = _wcslen(lpPathName);
1142 const size_t path_slash_len = pathnamelen + 3;
1143 WCHAR* path_slash = calloc(pathnamelen + 4,
sizeof(WCHAR));
1146 _wcsncat(path_slash, lpPathName, pathnamelen);
1148 WCHAR starbuffer[8] = { 0 };
1149 const WCHAR* star = InitializeConstWCharFromUtf8(
"*", starbuffer, ARRAYSIZE(starbuffer));
1150 const HRESULT hr = NativePathCchAppendW(path_slash, path_slash_len, star);
1151 HANDLE dir = INVALID_HANDLE_VALUE;
1156 dir = FindFirstFileW(path_slash, &findFileData);
1158 if (dir == INVALID_HANDLE_VALUE)
1162 path_slash[path_slash_len - 1] =
'\0';
1165 const size_t len = _wcsnlen(findFileData.cFileName, ARRAYSIZE(findFileData.cFileName));
1167 if ((len == 1 && findFileData.cFileName[0] ==
'.') ||
1168 (len == 2 && findFileData.cFileName[0] ==
'.' && findFileData.cFileName[1] ==
'.'))
1173 WCHAR* fullpath = concat(path_slash, path_slash_len, findFileData.cFileName, len);
1177 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1178 ret = winpr_RemoveDirectory_RecursiveW(fullpath);
1180 ret = DeleteFileW(fullpath);
1186 }
while (ret && FindNextFileW(dir, &findFileData) != 0);
1190 if (!RemoveDirectoryW(lpPathName))
1200char* winpr_GetConfigFilePath(BOOL system,
const char* filename)
1202 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
1204#if defined(WINPR_USE_VENDOR_PRODUCT_CONFIG_DIR)
1205 char* vendor = GetKnownSubPath(
id, WINPR_VENDOR_STRING);
1208#if defined(WITH_RESOURCE_VERSIONING)
1209 const char* prod = WINPR_PRODUCT_STRING STR(WINPR_VERSION_MAJOR);
1211 const char* prod = WINPR_PRODUCT_STRING;
1213 char* base = GetCombinedPath(vendor, prod);
1216 char* base = GetKnownSubPath(
id,
"winpr");
1224 char* path = GetCombinedPath(base, filename);