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)
34static const char PATH_SLASH_CHR =
'/';
35static const char PATH_SLASH_STR[] =
"/";
37static const char PATH_BACKSLASH_CHR =
'\\';
38static const char PATH_BACKSLASH_STR[] =
"\\";
41static const WCHAR PATH_SLASH_CHR_W = L
'/';
42static const WCHAR PATH_BACKSLASH_CHR_W = L
'\\';
43static const WCHAR PATH_SLASH_STR_W[] = L
"/";
44static const WCHAR PATH_BACKSLASH_STR_W[] = L
"\\";
46#if defined(__BIG_ENDIAN__)
47static const WCHAR PATH_SLASH_CHR_W = 0x2f00;
48static const WCHAR PATH_BACKSLASH_CHR_W = 0x5c00;
49static const WCHAR PATH_SLASH_STR_W[] = { 0x2f00,
'\0' };
50static const WCHAR PATH_BACKSLASH_STR_W[] = { 0x5c00,
'\0' };
52static const WCHAR PATH_SLASH_CHR_W =
'/';
53static const WCHAR PATH_BACKSLASH_CHR_W =
'\\';
54static const WCHAR PATH_SLASH_STR_W[] = {
'/',
'\0' };
55static const WCHAR PATH_BACKSLASH_STR_W[] = {
'\\',
'\0' };
60#define PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
61#define PATH_SEPARATOR_STR PATH_BACKSLASH_STR
62#define PATH_SEPARATOR_CHR_W PATH_BACKSLASH_CHR_W
63#define PATH_SEPARATOR_STR_W PATH_BACKSLASH_STR_W
65#define PATH_SEPARATOR_CHR PATH_SLASH_CHR
66#define PATH_SEPARATOR_STR PATH_SLASH_STR
67#define PATH_SEPARATOR_CHR_W PATH_SLASH_CHR_W
68#define PATH_SEPARATOR_STR_W PATH_SLASH_STR_W
72#define TAG WINPR_TAG("path")
80#define DEFINE_UNICODE FALSE
81#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
82#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashA
83#include "include/PathCchAddSeparator.h"
85#undef CUR_PATH_SEPARATOR_CHR
86#undef PATH_CCH_ADD_SEPARATOR
88#define DEFINE_UNICODE TRUE
89#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR_W
90#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashW
91#include "include/PathCchAddSeparator.h"
93#undef CUR_PATH_SEPARATOR_CHR
94#undef PATH_CCH_ADD_SEPARATOR
98#define DEFINE_UNICODE FALSE
99#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
100#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashA
101#include "include/PathCchAddSeparator.h"
103#undef CUR_PATH_SEPARATOR_CHR
104#undef PATH_CCH_ADD_SEPARATOR
106#define DEFINE_UNICODE TRUE
107#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR_W
108#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashW
109#include "include/PathCchAddSeparator.h"
111#undef CUR_PATH_SEPARATOR_CHR
112#undef PATH_CCH_ADD_SEPARATOR
116#define DEFINE_UNICODE FALSE
117#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
118#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorA
119#include "include/PathCchAddSeparator.h"
121#undef CUR_PATH_SEPARATOR_CHR
122#undef PATH_CCH_ADD_SEPARATOR
124#define DEFINE_UNICODE TRUE
125#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR_W
126#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorW
127#include "include/PathCchAddSeparator.h"
129#undef CUR_PATH_SEPARATOR_CHR
130#undef PATH_CCH_ADD_SEPARATOR
136HRESULT PathCchRemoveBackslashA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
138 WLog_ERR(TAG,
"not implemented");
142HRESULT PathCchRemoveBackslashW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
144 WLog_ERR(TAG,
"not implemented");
154#define DEFINE_UNICODE FALSE
155#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
156#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExA
157#include "include/PathCchAddSeparatorEx.h"
159#undef CUR_PATH_SEPARATOR_CHR
160#undef PATH_CCH_ADD_SEPARATOR_EX
162#define DEFINE_UNICODE TRUE
163#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR_W
164#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExW
165#include "include/PathCchAddSeparatorEx.h"
167#undef CUR_PATH_SEPARATOR_CHR
168#undef PATH_CCH_ADD_SEPARATOR_EX
172#define DEFINE_UNICODE FALSE
173#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
174#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExA
175#include "include/PathCchAddSeparatorEx.h"
177#undef CUR_PATH_SEPARATOR_CHR
178#undef PATH_CCH_ADD_SEPARATOR_EX
180#define DEFINE_UNICODE TRUE
181#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR_W
182#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExW
183#include "include/PathCchAddSeparatorEx.h"
185#undef CUR_PATH_SEPARATOR_CHR
186#undef PATH_CCH_ADD_SEPARATOR_EX
190#define DEFINE_UNICODE FALSE
191#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
192#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExA
193#include "include/PathCchAddSeparatorEx.h"
195#undef CUR_PATH_SEPARATOR_CHR
196#undef PATH_CCH_ADD_SEPARATOR_EX
198#define DEFINE_UNICODE TRUE
199#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR_W
200#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExW
201#include "include/PathCchAddSeparatorEx.h"
203#undef CUR_PATH_SEPARATOR_CHR
204#undef PATH_CCH_ADD_SEPARATOR_EX
206HRESULT PathCchRemoveBackslashExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
207 WINPR_ATTR_UNUSED PSTR* ppszEnd,
208 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
210 WLog_ERR(TAG,
"not implemented");
214HRESULT PathCchRemoveBackslashExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
215 WINPR_ATTR_UNUSED PWSTR* ppszEnd,
216 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
218 WLog_ERR(TAG,
"not implemented");
228#define DEFINE_UNICODE FALSE
229#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
230#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
231#include "include/PathCchAddExtension.h"
233#undef CUR_PATH_SEPARATOR_CHR
234#undef PATH_CCH_ADD_EXTENSION
236#define DEFINE_UNICODE TRUE
237#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR_W
238#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionW
239#include "include/PathCchAddExtension.h"
241#undef CUR_PATH_SEPARATOR_CHR
242#undef PATH_CCH_ADD_EXTENSION
246#define DEFINE_UNICODE FALSE
247#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
248#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionA
249#include "include/PathCchAddExtension.h"
251#undef CUR_PATH_SEPARATOR_CHR
252#undef PATH_CCH_ADD_EXTENSION
254#define DEFINE_UNICODE TRUE
255#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR_W
256#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionW
257#include "include/PathCchAddExtension.h"
259#undef CUR_PATH_SEPARATOR_CHR
260#undef PATH_CCH_ADD_EXTENSION
264#define DEFINE_UNICODE FALSE
265#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
266#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionA
267#include "include/PathCchAddExtension.h"
269#undef CUR_PATH_SEPARATOR_CHR
270#undef PATH_CCH_ADD_EXTENSION
272#define DEFINE_UNICODE TRUE
273#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR_W
274#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionW
275#include "include/PathCchAddExtension.h"
277#undef CUR_PATH_SEPARATOR_CHR
278#undef PATH_CCH_ADD_EXTENSION
286#define DEFINE_UNICODE FALSE
287#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
288#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
289#define PATH_CCH_APPEND PathCchAppendA
290#include "include/PathCchAppend.h"
292#undef CUR_PATH_SEPARATOR_CHR
293#undef CUR_PATH_SEPARATOR_STR
294#undef PATH_CCH_APPEND
296#define DEFINE_UNICODE TRUE
297#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR_W
298#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
299#define PATH_CCH_APPEND PathCchAppendW
300#include "include/PathCchAppend.h"
302#undef CUR_PATH_SEPARATOR_CHR
303#undef CUR_PATH_SEPARATOR_STR
304#undef PATH_CCH_APPEND
308#define DEFINE_UNICODE FALSE
309#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
310#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
311#define PATH_CCH_APPEND UnixPathCchAppendA
312#include "include/PathCchAppend.h"
314#undef CUR_PATH_SEPARATOR_CHR
315#undef CUR_PATH_SEPARATOR_STR
316#undef PATH_CCH_APPEND
318#define DEFINE_UNICODE TRUE
319#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR_W
320#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
321#define PATH_CCH_APPEND UnixPathCchAppendW
322#include "include/PathCchAppend.h"
324#undef CUR_PATH_SEPARATOR_CHR
325#undef CUR_PATH_SEPARATOR_STR
326#undef PATH_CCH_APPEND
330#define DEFINE_UNICODE FALSE
331#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
332#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
333#define PATH_CCH_APPEND NativePathCchAppendA
334#include "include/PathCchAppend.h"
336#undef CUR_PATH_SEPARATOR_CHR
337#undef CUR_PATH_SEPARATOR_STR
338#undef PATH_CCH_APPEND
340#define DEFINE_UNICODE TRUE
341#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR_W
342#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
343#define PATH_CCH_APPEND NativePathCchAppendW
344#include "include/PathCchAppend.h"
346#undef CUR_PATH_SEPARATOR_CHR
347#undef CUR_PATH_SEPARATOR_STR
348#undef PATH_CCH_APPEND
354HRESULT PathCchAppendExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
355 WINPR_ATTR_UNUSED PCSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
357 WLog_ERR(TAG,
"not implemented");
361HRESULT PathCchAppendExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
362 WINPR_ATTR_UNUSED PCWSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
364 WLog_ERR(TAG,
"not implemented");
372HRESULT PathCchCanonicalizeA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
373 WINPR_ATTR_UNUSED PCSTR pszPathIn)
375 WLog_ERR(TAG,
"not implemented");
379HRESULT PathCchCanonicalizeW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
380 WINPR_ATTR_UNUSED
size_t cchPathOut,
381 WINPR_ATTR_UNUSED PCWSTR pszPathIn)
383 WLog_ERR(TAG,
"not implemented");
391HRESULT PathCchCanonicalizeExA(WINPR_ATTR_UNUSED PSTR pszPathOut,
392 WINPR_ATTR_UNUSED
size_t cchPathOut,
393 WINPR_ATTR_UNUSED PCSTR pszPathIn,
394 WINPR_ATTR_UNUSED
unsigned long dwFlags)
396 WLog_ERR(TAG,
"not implemented");
400HRESULT PathCchCanonicalizeExW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
401 WINPR_ATTR_UNUSED
size_t cchPathOut,
402 WINPR_ATTR_UNUSED PCWSTR pszPathIn,
403 WINPR_ATTR_UNUSED
unsigned long dwFlags)
405 WLog_ERR(TAG,
"not implemented");
413HRESULT PathAllocCanonicalizeA(WINPR_ATTR_UNUSED PCSTR pszPathIn,
414 WINPR_ATTR_UNUSED
unsigned long dwFlags,
415 WINPR_ATTR_UNUSED PSTR* ppszPathOut)
417 WLog_ERR(TAG,
"not implemented");
421HRESULT PathAllocCanonicalizeW(WINPR_ATTR_UNUSED PCWSTR pszPathIn,
422 WINPR_ATTR_UNUSED
unsigned long dwFlags,
423 WINPR_ATTR_UNUSED PWSTR* ppszPathOut)
425 WLog_ERR(TAG,
"not implemented");
433HRESULT PathCchCombineA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
434 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore)
436 WLog_ERR(TAG,
"not implemented");
440HRESULT PathCchCombineW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
441 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore)
443 WLog_ERR(TAG,
"not implemented");
451HRESULT PathCchCombineExA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
452 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore,
453 WINPR_ATTR_UNUSED
unsigned long dwFlags)
455 WLog_ERR(TAG,
"not implemented");
459HRESULT PathCchCombineExW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
460 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore,
461 WINPR_ATTR_UNUSED
unsigned long dwFlags)
463 WLog_ERR(TAG,
"not implemented");
473#define DEFINE_UNICODE FALSE
474#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
475#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
476#define PATH_ALLOC_COMBINE PathAllocCombineA
477#include "include/PathAllocCombine.h"
479#undef CUR_PATH_SEPARATOR_CHR
480#undef CUR_PATH_SEPARATOR_STR
481#undef PATH_ALLOC_COMBINE
483#define DEFINE_UNICODE TRUE
484#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR_W
485#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
486#define PATH_ALLOC_COMBINE PathAllocCombineW
487#include "include/PathAllocCombine.h"
489#undef CUR_PATH_SEPARATOR_CHR
490#undef CUR_PATH_SEPARATOR_STR
491#undef PATH_ALLOC_COMBINE
495#define DEFINE_UNICODE FALSE
496#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
497#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
498#define PATH_ALLOC_COMBINE UnixPathAllocCombineA
499#include "include/PathAllocCombine.h"
501#undef CUR_PATH_SEPARATOR_CHR
502#undef CUR_PATH_SEPARATOR_STR
503#undef PATH_ALLOC_COMBINE
505#define DEFINE_UNICODE TRUE
506#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR_W
507#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
508#define PATH_ALLOC_COMBINE UnixPathAllocCombineW
509#include "include/PathAllocCombine.h"
511#undef CUR_PATH_SEPARATOR_CHR
512#undef CUR_PATH_SEPARATOR_STR
513#undef PATH_ALLOC_COMBINE
517#define DEFINE_UNICODE FALSE
518#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
519#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
520#define PATH_ALLOC_COMBINE NativePathAllocCombineA
521#include "include/PathAllocCombine.h"
523#undef CUR_PATH_SEPARATOR_CHR
524#undef CUR_PATH_SEPARATOR_STR
525#undef PATH_ALLOC_COMBINE
527#define DEFINE_UNICODE TRUE
528#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR_W
529#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
530#define PATH_ALLOC_COMBINE NativePathAllocCombineW
531#include "include/PathAllocCombine.h"
533#undef CUR_PATH_SEPARATOR_CHR
534#undef CUR_PATH_SEPARATOR_STR
535#undef PATH_ALLOC_COMBINE
541HRESULT PathCchFindExtensionA(PCSTR pszPath,
size_t cchPath, PCSTR* ppszExt)
543 const char* p = (
const char*)pszPath;
545 if (!pszPath || !cchPath || !ppszExt)
550 while (*p && --cchPath)
574 if ((*p ==
'\\') || (*p ==
'/') || (*p ==
':'))
583HRESULT PathCchFindExtensionW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
584 WINPR_ATTR_UNUSED PCWSTR* ppszExt)
586 WLog_ERR(TAG,
"not implemented");
594HRESULT PathCchRenameExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
595 WINPR_ATTR_UNUSED PCSTR pszExt)
597 WLog_ERR(TAG,
"not implemented");
601HRESULT PathCchRenameExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
602 WINPR_ATTR_UNUSED PCWSTR pszExt)
604 WLog_ERR(TAG,
"not implemented");
612HRESULT PathCchRemoveExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
614 WLog_ERR(TAG,
"not implemented");
618HRESULT PathCchRemoveExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
620 WLog_ERR(TAG,
"not implemented");
628BOOL PathCchIsRootA(WINPR_ATTR_UNUSED PCSTR pszPath)
630 WLog_ERR(TAG,
"not implemented");
634BOOL PathCchIsRootW(WINPR_ATTR_UNUSED PCWSTR pszPath)
636 WLog_ERR(TAG,
"not implemented");
644BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer)
649 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
651 *ppszServer = &pszPath[2];
658BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer)
663 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
665 *ppszServer = &pszPath[2];
676HRESULT PathCchSkipRootA(WINPR_ATTR_UNUSED PCSTR pszPath, WINPR_ATTR_UNUSED PCSTR* ppszRootEnd)
678 WLog_ERR(TAG,
"not implemented");
682HRESULT PathCchSkipRootW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED PCWSTR* ppszRootEnd)
684 WLog_ERR(TAG,
"not implemented");
692HRESULT PathCchStripToRootA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
694 WLog_ERR(TAG,
"not implemented");
698HRESULT PathCchStripToRootW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
700 WLog_ERR(TAG,
"not implemented");
708HRESULT PathCchStripPrefixA(PSTR pszPath,
size_t cchPath)
715 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
718 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
719 (pszPath[3] ==
'\\'))
728 if (IsCharAlpha(pszPath[4]) && (pszPath[5] ==
':'))
730 memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
735 pszPath[cchPath - 4] = 0;
743HRESULT PathCchStripPrefixW(PWSTR pszPath,
size_t cchPath)
750 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
753 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
754 (pszPath[3] ==
'\\'))
763 const size_t rc = (_wcslen(&pszPath[4]) + 1);
765 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
767 if (IsCharAlphaW(pszPath[4]) && (pszPath[5] == L
':'))
769 wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
774 pszPath[cchPath - 4] = 0;
786HRESULT PathCchRemoveFileSpecA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
788 WLog_ERR(TAG,
"not implemented");
792HRESULT PathCchRemoveFileSpecW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
794 WLog_ERR(TAG,
"not implemented");
806HRESULT PathCchConvertStyleA(PSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
808 if (dwFlags == PATH_STYLE_WINDOWS)
810 for (
size_t index = 0; index < cchPath; index++)
812 if (pszPath[index] == PATH_SLASH_CHR)
813 pszPath[index] = PATH_BACKSLASH_CHR;
816 else if (dwFlags == PATH_STYLE_UNIX)
818 for (
size_t index = 0; index < cchPath; index++)
820 if (pszPath[index] == PATH_BACKSLASH_CHR)
821 pszPath[index] = PATH_SLASH_CHR;
824 else if (dwFlags == PATH_STYLE_NATIVE)
826 if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
830 for (
size_t index = 0; index < cchPath; index++)
832 if (pszPath[index] == PATH_SLASH_CHR)
833 pszPath[index] = PATH_BACKSLASH_CHR;
836 else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
840 for (
size_t index = 0; index < cchPath; index++)
842 if (pszPath[index] == PATH_BACKSLASH_CHR)
843 pszPath[index] = PATH_SLASH_CHR;
861HRESULT PathCchConvertStyleW(PWSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
863 if (dwFlags == PATH_STYLE_WINDOWS)
865 for (
size_t index = 0; index < cchPath; index++)
867 if (pszPath[index] == PATH_SLASH_CHR_W)
868 pszPath[index] = PATH_BACKSLASH_CHR_W;
871 else if (dwFlags == PATH_STYLE_UNIX)
873 for (
size_t index = 0; index < cchPath; index++)
875 if (pszPath[index] == PATH_BACKSLASH_CHR_W)
876 pszPath[index] = PATH_SLASH_CHR_W;
879 else if (dwFlags == PATH_STYLE_NATIVE)
881 if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR_W)
885 for (
size_t index = 0; index < cchPath; index++)
887 if (pszPath[index] == PATH_SLASH_CHR_W)
888 pszPath[index] = PATH_BACKSLASH_CHR_W;
891 else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR_W)
895 for (
size_t index = 0; index < cchPath; index++)
897 if (pszPath[index] == PATH_BACKSLASH_CHR_W)
898 pszPath[index] = PATH_SLASH_CHR_W;
920char PathGetSeparatorA(
unsigned long dwFlags)
922 char separator = PATH_SEPARATOR_CHR;
925 dwFlags = PATH_STYLE_NATIVE;
927 if (dwFlags == PATH_STYLE_WINDOWS)
928 separator = PATH_SEPARATOR_CHR;
929 else if (dwFlags == PATH_STYLE_UNIX)
930 separator = PATH_SEPARATOR_CHR;
931 else if (dwFlags == PATH_STYLE_NATIVE)
932 separator = PATH_SEPARATOR_CHR;
937WCHAR PathGetSeparatorW(
unsigned long dwFlags)
945 cnv.c[0] = PATH_SEPARATOR_CHR;
949 dwFlags = PATH_STYLE_NATIVE;
951 if (dwFlags == PATH_STYLE_WINDOWS)
952 cnv.c[0] = PATH_SEPARATOR_CHR;
953 else if (dwFlags == PATH_STYLE_UNIX)
954 cnv.c[0] = PATH_SEPARATOR_CHR;
955 else if (dwFlags == PATH_STYLE_NATIVE)
956 cnv.c[0] = PATH_SEPARATOR_CHR;
964static const CHAR SharedLibraryExtensionDllA[] =
"dll";
965static const CHAR SharedLibraryExtensionSoA[] =
"so";
966static const CHAR SharedLibraryExtensionDylibA[] =
"dylib";
968static const CHAR SharedLibraryExtensionDotDllA[] =
".dll";
969static const CHAR SharedLibraryExtensionDotSoA[] =
".so";
970static const CHAR SharedLibraryExtensionDotDylibA[] =
".dylib";
971PCSTR PathGetSharedLibraryExtensionA(
unsigned long dwFlags)
973 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
975 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
977 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
978 return SharedLibraryExtensionDotDllA;
980 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
981 return SharedLibraryExtensionDotSoA;
983 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
984 return SharedLibraryExtensionDotDylibA;
988 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
989 return SharedLibraryExtensionDllA;
991 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
992 return SharedLibraryExtensionSoA;
994 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
995 return SharedLibraryExtensionDylibA;
999 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1002 return SharedLibraryExtensionDotDllA;
1003#elif defined(__APPLE__)
1004 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1005 return SharedLibraryExtensionDotSoA;
1007 return SharedLibraryExtensionDotDylibA;
1009 return SharedLibraryExtensionDotSoA;
1015 return SharedLibraryExtensionDllA;
1016#elif defined(__APPLE__)
1017 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1018 return SharedLibraryExtensionSoA;
1020 return SharedLibraryExtensionDylibA;
1022 return SharedLibraryExtensionSoA;
1029PCWSTR PathGetSharedLibraryExtensionW(
unsigned long dwFlags)
1031 static WCHAR buffer[6][16] = { 0 };
1032 const WCHAR* SharedLibraryExtensionDotDllW = InitializeConstWCharFromUtf8(
1033 SharedLibraryExtensionDotDllA, buffer[0], ARRAYSIZE(buffer[0]));
1034 const WCHAR* SharedLibraryExtensionDotSoW =
1035 InitializeConstWCharFromUtf8(SharedLibraryExtensionDotSoA, buffer[1], ARRAYSIZE(buffer[1]));
1036 const WCHAR* SharedLibraryExtensionDotDylibW = InitializeConstWCharFromUtf8(
1037 SharedLibraryExtensionDotDylibA, buffer[2], ARRAYSIZE(buffer[2]));
1038 const WCHAR* SharedLibraryExtensionDllW =
1039 InitializeConstWCharFromUtf8(SharedLibraryExtensionDllA, buffer[3], ARRAYSIZE(buffer[3]));
1040 const WCHAR* SharedLibraryExtensionSoW =
1041 InitializeConstWCharFromUtf8(SharedLibraryExtensionSoA, buffer[4], ARRAYSIZE(buffer[4]));
1042 const WCHAR* SharedLibraryExtensionDylibW =
1043 InitializeConstWCharFromUtf8(SharedLibraryExtensionDylibA, buffer[5], ARRAYSIZE(buffer[5]));
1045 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
1047 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1049 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1050 return SharedLibraryExtensionDotDllW;
1052 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1053 return SharedLibraryExtensionDotSoW;
1055 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1056 return SharedLibraryExtensionDotDylibW;
1060 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1061 return SharedLibraryExtensionDllW;
1063 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1064 return SharedLibraryExtensionSoW;
1066 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1067 return SharedLibraryExtensionDylibW;
1071 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1074 return SharedLibraryExtensionDotDllW;
1075#elif defined(__APPLE__)
1076 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1077 return SharedLibraryExtensionDotSoW;
1079 return SharedLibraryExtensionDotDylibW;
1081 return SharedLibraryExtensionDotSoW;
1087 return SharedLibraryExtensionDllW;
1088#elif defined(__APPLE__)
1089 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1090 return SharedLibraryExtensionSoW;
1092 return SharedLibraryExtensionDylibW;
1094 return SharedLibraryExtensionSoW;
1101const char* GetKnownPathIdString(
int id)
1105 case KNOWN_PATH_HOME:
1106 return "KNOWN_PATH_HOME";
1107 case KNOWN_PATH_TEMP:
1108 return "KNOWN_PATH_TEMP";
1109 case KNOWN_PATH_XDG_DATA_HOME:
1110 return "KNOWN_PATH_XDG_DATA_HOME";
1111 case KNOWN_PATH_XDG_CONFIG_HOME:
1112 return "KNOWN_PATH_XDG_CONFIG_HOME";
1113 case KNOWN_PATH_XDG_CACHE_HOME:
1114 return "KNOWN_PATH_XDG_CACHE_HOME";
1115 case KNOWN_PATH_XDG_RUNTIME_DIR:
1116 return "KNOWN_PATH_XDG_RUNTIME_DIR";
1117 case KNOWN_PATH_SYSTEM_CONFIG_HOME:
1118 return "KNOWN_PATH_SYSTEM_CONFIG_HOME";
1120 return "KNOWN_PATH_UNKNOWN_ID";
1124static char* concat(
const char* path,
size_t pathlen,
const char* name,
size_t namelen)
1126 const size_t strsize = pathlen + namelen + 2;
1127 char* str = calloc(strsize,
sizeof(
char));
1131 winpr_str_append(path, str, strsize,
"");
1132 winpr_str_append(name, str, strsize,
"");
1136BOOL winpr_RemoveDirectory_RecursiveA(LPCSTR lpPathName)
1143 const size_t pathnamelen = strlen(lpPathName);
1144 const size_t path_slash_len = pathnamelen + 3;
1145 char* path_slash = calloc(pathnamelen + 4,
sizeof(
char));
1148 strncat(path_slash, lpPathName, pathnamelen);
1150 const char star[] =
"*";
1151 const HRESULT hr = NativePathCchAppendA(path_slash, path_slash_len, star);
1152 HANDLE dir = INVALID_HANDLE_VALUE;
1157 dir = FindFirstFileA(path_slash, &findFileData);
1159 if (dir == INVALID_HANDLE_VALUE)
1163 path_slash[path_slash_len - 1] =
'\0';
1166 const size_t len = strnlen(findFileData.cFileName, ARRAYSIZE(findFileData.cFileName));
1168 if ((len == 1 && findFileData.cFileName[0] ==
'.') ||
1169 (len == 2 && findFileData.cFileName[0] ==
'.' && findFileData.cFileName[1] ==
'.'))
1174 char* fullpath = concat(path_slash, path_slash_len, findFileData.cFileName, len);
1178 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1179 ret = winpr_RemoveDirectory_RecursiveA(fullpath);
1182 WINPR_PRAGMA_DIAG_PUSH
1183 WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL
1184 ret = DeleteFileA(fullpath);
1185 WINPR_PRAGMA_DIAG_POP
1192 }
while (ret && FindNextFileA(dir, &findFileData) != 0);
1196 WINPR_PRAGMA_DIAG_PUSH
1197 WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL
1198 if (!RemoveDirectoryA(lpPathName))
1200 WINPR_PRAGMA_DIAG_POP
1209BOOL winpr_RemoveDirectory_RecursiveW(LPCWSTR lpPathName)
1211 char* name = ConvertWCharToUtf8Alloc(lpPathName, NULL);
1214 const BOOL rc = winpr_RemoveDirectory_RecursiveA(name);
1219char* winpr_GetConfigFilePath(BOOL system,
const char* filename)
1221 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
1223#if defined(WINPR_USE_VENDOR_PRODUCT_CONFIG_DIR)
1224 char* vendor = GetKnownSubPath(
id, WINPR_VENDOR_STRING);
1227#if defined(WITH_RESOURCE_VERSIONING)
1228 const char* prod = WINPR_PRODUCT_STRING STR(WINPR_VERSION_MAJOR);
1230 const char* prod = WINPR_PRODUCT_STRING;
1232 char* base = GetCombinedPath(vendor, prod);
1235 char* base = GetKnownSubPath(
id,
"winpr");
1243 char* path = GetCombinedPath(base, filename);