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_STR_W[] = L
"/";
42static const WCHAR PATH_BACKSLASH_STR_W[] = L
"\\";
44#if defined(__BIG_ENDIAN__)
45static const WCHAR PATH_SLASH_STR_W[] = { 0x2f00,
'\0' };
46static const WCHAR PATH_BACKSLASH_STR_W[] = { 0x5c00,
'\0' };
48static const WCHAR PATH_SLASH_STR_W[] = {
'/',
'\0' };
49static const WCHAR PATH_BACKSLASH_STR_W[] = {
'\\',
'\0' };
54#define PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
55#define PATH_SEPARATOR_STR PATH_BACKSLASH_STR
56#define PATH_SEPARATOR_STR_W PATH_BACKSLASH_STR_W
58#define PATH_SEPARATOR_CHR PATH_SLASH_CHR
59#define PATH_SEPARATOR_STR PATH_SLASH_STR
60#define PATH_SEPARATOR_STR_W PATH_SLASH_STR_W
64#define TAG WINPR_TAG("path")
72#define DEFINE_UNICODE FALSE
73#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
74#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashA
75#include "include/PathCchAddSeparator.h"
77#undef CUR_PATH_SEPARATOR_CHR
78#undef PATH_CCH_ADD_SEPARATOR
80#define DEFINE_UNICODE TRUE
81#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
82#define PATH_CCH_ADD_SEPARATOR PathCchAddBackslashW
83#include "include/PathCchAddSeparator.h"
85#undef CUR_PATH_SEPARATOR_CHR
86#undef PATH_CCH_ADD_SEPARATOR
90#define DEFINE_UNICODE FALSE
91#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
92#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashA
93#include "include/PathCchAddSeparator.h"
95#undef CUR_PATH_SEPARATOR_CHR
96#undef PATH_CCH_ADD_SEPARATOR
98#define DEFINE_UNICODE TRUE
99#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
100#define PATH_CCH_ADD_SEPARATOR PathCchAddSlashW
101#include "include/PathCchAddSeparator.h"
103#undef CUR_PATH_SEPARATOR_CHR
104#undef PATH_CCH_ADD_SEPARATOR
108#define DEFINE_UNICODE FALSE
109#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
110#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorA
111#include "include/PathCchAddSeparator.h"
113#undef CUR_PATH_SEPARATOR_CHR
114#undef PATH_CCH_ADD_SEPARATOR
116#define DEFINE_UNICODE TRUE
117#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
118#define PATH_CCH_ADD_SEPARATOR PathCchAddSeparatorW
119#include "include/PathCchAddSeparator.h"
121#undef CUR_PATH_SEPARATOR_CHR
122#undef PATH_CCH_ADD_SEPARATOR
128HRESULT PathCchRemoveBackslashA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
130 WLog_ERR(TAG,
"not implemented");
134HRESULT PathCchRemoveBackslashW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
136 WLog_ERR(TAG,
"not implemented");
146#define DEFINE_UNICODE FALSE
147#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
148#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExA
149#include "include/PathCchAddSeparatorEx.h"
151#undef CUR_PATH_SEPARATOR_CHR
152#undef PATH_CCH_ADD_SEPARATOR_EX
154#define DEFINE_UNICODE TRUE
155#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
156#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExW
157#include "include/PathCchAddSeparatorEx.h"
159#undef CUR_PATH_SEPARATOR_CHR
160#undef PATH_CCH_ADD_SEPARATOR_EX
164#define DEFINE_UNICODE FALSE
165#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
166#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExA
167#include "include/PathCchAddSeparatorEx.h"
169#undef CUR_PATH_SEPARATOR_CHR
170#undef PATH_CCH_ADD_SEPARATOR_EX
172#define DEFINE_UNICODE TRUE
173#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
174#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSlashExW
175#include "include/PathCchAddSeparatorEx.h"
177#undef CUR_PATH_SEPARATOR_CHR
178#undef PATH_CCH_ADD_SEPARATOR_EX
182#define DEFINE_UNICODE FALSE
183#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
184#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExA
185#include "include/PathCchAddSeparatorEx.h"
187#undef CUR_PATH_SEPARATOR_CHR
188#undef PATH_CCH_ADD_SEPARATOR_EX
190#define DEFINE_UNICODE TRUE
191#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
192#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddSeparatorExW
193#include "include/PathCchAddSeparatorEx.h"
195#undef CUR_PATH_SEPARATOR_CHR
196#undef PATH_CCH_ADD_SEPARATOR_EX
198HRESULT PathCchRemoveBackslashExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
199 WINPR_ATTR_UNUSED PSTR* ppszEnd,
200 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
202 WLog_ERR(TAG,
"not implemented");
206HRESULT PathCchRemoveBackslashExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
207 WINPR_ATTR_UNUSED PWSTR* ppszEnd,
208 WINPR_ATTR_UNUSED
size_t* pcchRemaining)
210 WLog_ERR(TAG,
"not implemented");
220#define DEFINE_UNICODE FALSE
221#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
222#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
223#include "include/PathCchAddExtension.h"
225#undef CUR_PATH_SEPARATOR_CHR
226#undef PATH_CCH_ADD_EXTENSION
228#define DEFINE_UNICODE TRUE
229#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
230#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionW
231#include "include/PathCchAddExtension.h"
233#undef CUR_PATH_SEPARATOR_CHR
234#undef PATH_CCH_ADD_EXTENSION
238#define DEFINE_UNICODE FALSE
239#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
240#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionA
241#include "include/PathCchAddExtension.h"
243#undef CUR_PATH_SEPARATOR_CHR
244#undef PATH_CCH_ADD_EXTENSION
246#define DEFINE_UNICODE TRUE
247#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
248#define PATH_CCH_ADD_EXTENSION UnixPathCchAddExtensionW
249#include "include/PathCchAddExtension.h"
251#undef CUR_PATH_SEPARATOR_CHR
252#undef PATH_CCH_ADD_EXTENSION
256#define DEFINE_UNICODE FALSE
257#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
258#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionA
259#include "include/PathCchAddExtension.h"
261#undef CUR_PATH_SEPARATOR_CHR
262#undef PATH_CCH_ADD_EXTENSION
264#define DEFINE_UNICODE TRUE
265#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
266#define PATH_CCH_ADD_EXTENSION NativePathCchAddExtensionW
267#include "include/PathCchAddExtension.h"
269#undef CUR_PATH_SEPARATOR_CHR
270#undef PATH_CCH_ADD_EXTENSION
278#define DEFINE_UNICODE FALSE
279#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
280#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
281#define PATH_CCH_APPEND PathCchAppendA
282#include "include/PathCchAppend.h"
284#undef CUR_PATH_SEPARATOR_CHR
285#undef CUR_PATH_SEPARATOR_STR
286#undef PATH_CCH_APPEND
288#define DEFINE_UNICODE TRUE
289#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
290#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
291#define PATH_CCH_APPEND PathCchAppendW
292#include "include/PathCchAppend.h"
294#undef CUR_PATH_SEPARATOR_CHR
295#undef CUR_PATH_SEPARATOR_STR
296#undef PATH_CCH_APPEND
300#define DEFINE_UNICODE FALSE
301#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
302#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
303#define PATH_CCH_APPEND UnixPathCchAppendA
304#include "include/PathCchAppend.h"
306#undef CUR_PATH_SEPARATOR_CHR
307#undef CUR_PATH_SEPARATOR_STR
308#undef PATH_CCH_APPEND
310#define DEFINE_UNICODE TRUE
311#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
312#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
313#define PATH_CCH_APPEND UnixPathCchAppendW
314#include "include/PathCchAppend.h"
316#undef CUR_PATH_SEPARATOR_CHR
317#undef CUR_PATH_SEPARATOR_STR
318#undef PATH_CCH_APPEND
322#define DEFINE_UNICODE FALSE
323#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
324#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
325#define PATH_CCH_APPEND NativePathCchAppendA
326#include "include/PathCchAppend.h"
328#undef CUR_PATH_SEPARATOR_CHR
329#undef CUR_PATH_SEPARATOR_STR
330#undef PATH_CCH_APPEND
332#define DEFINE_UNICODE TRUE
333#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
334#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
335#define PATH_CCH_APPEND NativePathCchAppendW
336#include "include/PathCchAppend.h"
338#undef CUR_PATH_SEPARATOR_CHR
339#undef CUR_PATH_SEPARATOR_STR
340#undef PATH_CCH_APPEND
346HRESULT PathCchAppendExA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
347 WINPR_ATTR_UNUSED PCSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
349 WLog_ERR(TAG,
"not implemented");
353HRESULT PathCchAppendExW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
354 WINPR_ATTR_UNUSED PCWSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags)
356 WLog_ERR(TAG,
"not implemented");
364HRESULT PathCchCanonicalizeA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
365 WINPR_ATTR_UNUSED PCSTR pszPathIn)
367 WLog_ERR(TAG,
"not implemented");
371HRESULT PathCchCanonicalizeW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
372 WINPR_ATTR_UNUSED
size_t cchPathOut,
373 WINPR_ATTR_UNUSED PCWSTR pszPathIn)
375 WLog_ERR(TAG,
"not implemented");
383HRESULT PathCchCanonicalizeExA(WINPR_ATTR_UNUSED PSTR pszPathOut,
384 WINPR_ATTR_UNUSED
size_t cchPathOut,
385 WINPR_ATTR_UNUSED PCSTR pszPathIn,
386 WINPR_ATTR_UNUSED
unsigned long dwFlags)
388 WLog_ERR(TAG,
"not implemented");
392HRESULT PathCchCanonicalizeExW(WINPR_ATTR_UNUSED PWSTR pszPathOut,
393 WINPR_ATTR_UNUSED
size_t cchPathOut,
394 WINPR_ATTR_UNUSED PCWSTR pszPathIn,
395 WINPR_ATTR_UNUSED
unsigned long dwFlags)
397 WLog_ERR(TAG,
"not implemented");
405HRESULT PathAllocCanonicalizeA(WINPR_ATTR_UNUSED PCSTR pszPathIn,
406 WINPR_ATTR_UNUSED
unsigned long dwFlags,
407 WINPR_ATTR_UNUSED PSTR* ppszPathOut)
409 WLog_ERR(TAG,
"not implemented");
413HRESULT PathAllocCanonicalizeW(WINPR_ATTR_UNUSED PCWSTR pszPathIn,
414 WINPR_ATTR_UNUSED
unsigned long dwFlags,
415 WINPR_ATTR_UNUSED PWSTR* ppszPathOut)
417 WLog_ERR(TAG,
"not implemented");
425HRESULT PathCchCombineA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
426 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore)
428 WLog_ERR(TAG,
"not implemented");
432HRESULT PathCchCombineW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
433 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore)
435 WLog_ERR(TAG,
"not implemented");
443HRESULT PathCchCombineExA(WINPR_ATTR_UNUSED PSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
444 WINPR_ATTR_UNUSED PCSTR pszPathIn, WINPR_ATTR_UNUSED PCSTR pszMore,
445 WINPR_ATTR_UNUSED
unsigned long dwFlags)
447 WLog_ERR(TAG,
"not implemented");
451HRESULT PathCchCombineExW(WINPR_ATTR_UNUSED PWSTR pszPathOut, WINPR_ATTR_UNUSED
size_t cchPathOut,
452 WINPR_ATTR_UNUSED PCWSTR pszPathIn, WINPR_ATTR_UNUSED PCWSTR pszMore,
453 WINPR_ATTR_UNUSED
unsigned long dwFlags)
455 WLog_ERR(TAG,
"not implemented");
465#define DEFINE_UNICODE FALSE
466#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
467#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR
468#define PATH_ALLOC_COMBINE PathAllocCombineA
469#include "include/PathAllocCombine.h"
471#undef CUR_PATH_SEPARATOR_CHR
472#undef CUR_PATH_SEPARATOR_STR
473#undef PATH_ALLOC_COMBINE
475#define DEFINE_UNICODE TRUE
476#define CUR_PATH_SEPARATOR_CHR PATH_BACKSLASH_CHR
477#define CUR_PATH_SEPARATOR_STR PATH_BACKSLASH_STR_W
478#define PATH_ALLOC_COMBINE PathAllocCombineW
479#include "include/PathAllocCombine.h"
481#undef CUR_PATH_SEPARATOR_CHR
482#undef CUR_PATH_SEPARATOR_STR
483#undef PATH_ALLOC_COMBINE
487#define DEFINE_UNICODE FALSE
488#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
489#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR
490#define PATH_ALLOC_COMBINE UnixPathAllocCombineA
491#include "include/PathAllocCombine.h"
493#undef CUR_PATH_SEPARATOR_CHR
494#undef CUR_PATH_SEPARATOR_STR
495#undef PATH_ALLOC_COMBINE
497#define DEFINE_UNICODE TRUE
498#define CUR_PATH_SEPARATOR_CHR PATH_SLASH_CHR
499#define CUR_PATH_SEPARATOR_STR PATH_SLASH_STR_W
500#define PATH_ALLOC_COMBINE UnixPathAllocCombineW
501#include "include/PathAllocCombine.h"
503#undef CUR_PATH_SEPARATOR_CHR
504#undef CUR_PATH_SEPARATOR_STR
505#undef PATH_ALLOC_COMBINE
509#define DEFINE_UNICODE FALSE
510#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
511#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR
512#define PATH_ALLOC_COMBINE NativePathAllocCombineA
513#include "include/PathAllocCombine.h"
515#undef CUR_PATH_SEPARATOR_CHR
516#undef CUR_PATH_SEPARATOR_STR
517#undef PATH_ALLOC_COMBINE
519#define DEFINE_UNICODE TRUE
520#define CUR_PATH_SEPARATOR_CHR PATH_SEPARATOR_CHR
521#define CUR_PATH_SEPARATOR_STR PATH_SEPARATOR_STR_W
522#define PATH_ALLOC_COMBINE NativePathAllocCombineW
523#include "include/PathAllocCombine.h"
525#undef CUR_PATH_SEPARATOR_CHR
526#undef CUR_PATH_SEPARATOR_STR
527#undef PATH_ALLOC_COMBINE
533HRESULT PathCchFindExtensionA(PCSTR pszPath,
size_t cchPath, PCSTR* ppszExt)
535 const char* p = (
const char*)pszPath;
537 if (!pszPath || !cchPath || !ppszExt)
542 while (*p && --cchPath)
566 if ((*p ==
'\\') || (*p ==
'/') || (*p ==
':'))
575HRESULT PathCchFindExtensionW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
576 WINPR_ATTR_UNUSED PCWSTR* ppszExt)
578 WLog_ERR(TAG,
"not implemented");
586HRESULT PathCchRenameExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
587 WINPR_ATTR_UNUSED PCSTR pszExt)
589 WLog_ERR(TAG,
"not implemented");
593HRESULT PathCchRenameExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath,
594 WINPR_ATTR_UNUSED PCWSTR pszExt)
596 WLog_ERR(TAG,
"not implemented");
604HRESULT PathCchRemoveExtensionA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
606 WLog_ERR(TAG,
"not implemented");
610HRESULT PathCchRemoveExtensionW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
612 WLog_ERR(TAG,
"not implemented");
620BOOL PathCchIsRootA(WINPR_ATTR_UNUSED PCSTR pszPath)
622 WLog_ERR(TAG,
"not implemented");
626BOOL PathCchIsRootW(WINPR_ATTR_UNUSED PCWSTR pszPath)
628 WLog_ERR(TAG,
"not implemented");
636BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer)
641 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
643 *ppszServer = &pszPath[2];
650BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer)
655 if ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\'))
657 *ppszServer = &pszPath[2];
668HRESULT PathCchSkipRootA(WINPR_ATTR_UNUSED PCSTR pszPath, WINPR_ATTR_UNUSED PCSTR* ppszRootEnd)
670 WLog_ERR(TAG,
"not implemented");
674HRESULT PathCchSkipRootW(WINPR_ATTR_UNUSED PCWSTR pszPath, WINPR_ATTR_UNUSED PCWSTR* ppszRootEnd)
676 WLog_ERR(TAG,
"not implemented");
684HRESULT PathCchStripToRootA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
686 WLog_ERR(TAG,
"not implemented");
690HRESULT PathCchStripToRootW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
692 WLog_ERR(TAG,
"not implemented");
700HRESULT PathCchStripPrefixA(PSTR pszPath,
size_t cchPath)
707 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
710 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
711 (pszPath[3] ==
'\\'))
720 if (IsCharAlpha(pszPath[4]) && (pszPath[5] ==
':'))
722 memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
727 pszPath[cchPath - 4] = 0;
735HRESULT PathCchStripPrefixW(PWSTR pszPath,
size_t cchPath)
742 if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
745 hasPrefix = ((pszPath[0] ==
'\\') && (pszPath[1] ==
'\\') && (pszPath[2] ==
'?') &&
746 (pszPath[3] ==
'\\'))
755 const size_t rc = (_wcslen(&pszPath[4]) + 1);
757 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
759 if (IsCharAlphaW(pszPath[4]) && (pszPath[5] == L
':'))
761 wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
766 pszPath[cchPath - 4] = 0;
778HRESULT PathCchRemoveFileSpecA(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
780 WLog_ERR(TAG,
"not implemented");
784HRESULT PathCchRemoveFileSpecW(WINPR_ATTR_UNUSED PWSTR pszPath, WINPR_ATTR_UNUSED
size_t cchPath)
786 WLog_ERR(TAG,
"not implemented");
798HRESULT PathCchConvertStyleA(PSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
800 if (dwFlags == PATH_STYLE_WINDOWS)
802 for (
size_t index = 0; index < cchPath; index++)
804 if (pszPath[index] == PATH_SLASH_CHR)
805 pszPath[index] = PATH_BACKSLASH_CHR;
808 else if (dwFlags == PATH_STYLE_UNIX)
810 for (
size_t index = 0; index < cchPath; index++)
812 if (pszPath[index] == PATH_BACKSLASH_CHR)
813 pszPath[index] = PATH_SLASH_CHR;
816 else if (dwFlags == PATH_STYLE_NATIVE)
818 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;
828 else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
832 for (
size_t index = 0; index < cchPath; index++)
834 if (pszPath[index] == PATH_BACKSLASH_CHR)
835 pszPath[index] = PATH_SLASH_CHR;
853HRESULT PathCchConvertStyleW(PWSTR pszPath,
size_t cchPath,
unsigned long dwFlags)
855 if (dwFlags == PATH_STYLE_WINDOWS)
857 for (
size_t index = 0; index < cchPath; index++)
859 if (pszPath[index] == PATH_SLASH_CHR)
860 pszPath[index] = PATH_BACKSLASH_CHR;
863 else if (dwFlags == PATH_STYLE_UNIX)
865 for (
size_t index = 0; index < cchPath; index++)
867 if (pszPath[index] == PATH_BACKSLASH_CHR)
868 pszPath[index] = PATH_SLASH_CHR;
871 else if (dwFlags == PATH_STYLE_NATIVE)
873 if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
877 for (
size_t index = 0; index < cchPath; index++)
879 if (pszPath[index] == PATH_SLASH_CHR)
880 pszPath[index] = PATH_BACKSLASH_CHR;
883 else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
887 for (
size_t index = 0; index < cchPath; index++)
889 if (pszPath[index] == PATH_BACKSLASH_CHR)
890 pszPath[index] = PATH_SLASH_CHR;
912char PathGetSeparatorA(
unsigned long dwFlags)
914 char separator = PATH_SEPARATOR_CHR;
917 dwFlags = PATH_STYLE_NATIVE;
919 if (dwFlags == PATH_STYLE_WINDOWS)
920 separator = PATH_SEPARATOR_CHR;
921 else if (dwFlags == PATH_STYLE_UNIX)
922 separator = PATH_SEPARATOR_CHR;
923 else if (dwFlags == PATH_STYLE_NATIVE)
924 separator = PATH_SEPARATOR_CHR;
929WCHAR PathGetSeparatorW(
unsigned long dwFlags)
937 cnv.c[0] = PATH_SEPARATOR_CHR;
941 dwFlags = PATH_STYLE_NATIVE;
943 if (dwFlags == PATH_STYLE_WINDOWS)
944 cnv.c[0] = PATH_SEPARATOR_CHR;
945 else if (dwFlags == PATH_STYLE_UNIX)
946 cnv.c[0] = PATH_SEPARATOR_CHR;
947 else if (dwFlags == PATH_STYLE_NATIVE)
948 cnv.c[0] = PATH_SEPARATOR_CHR;
956static const CHAR SharedLibraryExtensionDllA[] =
"dll";
957static const CHAR SharedLibraryExtensionSoA[] =
"so";
958static const CHAR SharedLibraryExtensionDylibA[] =
"dylib";
960static const CHAR SharedLibraryExtensionDotDllA[] =
".dll";
961static const CHAR SharedLibraryExtensionDotSoA[] =
".so";
962static const CHAR SharedLibraryExtensionDotDylibA[] =
".dylib";
963PCSTR PathGetSharedLibraryExtensionA(
unsigned long dwFlags)
965 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
967 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
969 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
970 return SharedLibraryExtensionDotDllA;
972 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
973 return SharedLibraryExtensionDotSoA;
975 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
976 return SharedLibraryExtensionDotDylibA;
980 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
981 return SharedLibraryExtensionDllA;
983 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
984 return SharedLibraryExtensionSoA;
986 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
987 return SharedLibraryExtensionDylibA;
991 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
994 return SharedLibraryExtensionDotDllA;
995#elif defined(__APPLE__)
996 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
997 return SharedLibraryExtensionDotSoA;
999 return SharedLibraryExtensionDotDylibA;
1001 return SharedLibraryExtensionDotSoA;
1007 return SharedLibraryExtensionDllA;
1008#elif defined(__APPLE__)
1009 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1010 return SharedLibraryExtensionSoA;
1012 return SharedLibraryExtensionDylibA;
1014 return SharedLibraryExtensionSoA;
1021PCWSTR PathGetSharedLibraryExtensionW(
unsigned long dwFlags)
1023 static WCHAR buffer[6][16] = { 0 };
1024 const WCHAR* SharedLibraryExtensionDotDllW = InitializeConstWCharFromUtf8(
1025 SharedLibraryExtensionDotDllA, buffer[0], ARRAYSIZE(buffer[0]));
1026 const WCHAR* SharedLibraryExtensionDotSoW =
1027 InitializeConstWCharFromUtf8(SharedLibraryExtensionDotSoA, buffer[1], ARRAYSIZE(buffer[1]));
1028 const WCHAR* SharedLibraryExtensionDotDylibW = InitializeConstWCharFromUtf8(
1029 SharedLibraryExtensionDotDylibA, buffer[2], ARRAYSIZE(buffer[2]));
1030 const WCHAR* SharedLibraryExtensionDllW =
1031 InitializeConstWCharFromUtf8(SharedLibraryExtensionDllA, buffer[3], ARRAYSIZE(buffer[3]));
1032 const WCHAR* SharedLibraryExtensionSoW =
1033 InitializeConstWCharFromUtf8(SharedLibraryExtensionSoA, buffer[4], ARRAYSIZE(buffer[4]));
1034 const WCHAR* SharedLibraryExtensionDylibW =
1035 InitializeConstWCharFromUtf8(SharedLibraryExtensionDylibA, buffer[5], ARRAYSIZE(buffer[5]));
1037 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
1039 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1041 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1042 return SharedLibraryExtensionDotDllW;
1044 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1045 return SharedLibraryExtensionDotSoW;
1047 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1048 return SharedLibraryExtensionDotDylibW;
1052 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
1053 return SharedLibraryExtensionDllW;
1055 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
1056 return SharedLibraryExtensionSoW;
1058 if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
1059 return SharedLibraryExtensionDylibW;
1063 if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
1066 return SharedLibraryExtensionDotDllW;
1067#elif defined(__APPLE__)
1068 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1069 return SharedLibraryExtensionDotSoW;
1071 return SharedLibraryExtensionDotDylibW;
1073 return SharedLibraryExtensionDotSoW;
1079 return SharedLibraryExtensionDllW;
1080#elif defined(__APPLE__)
1081 if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
1082 return SharedLibraryExtensionSoW;
1084 return SharedLibraryExtensionDylibW;
1086 return SharedLibraryExtensionSoW;
1093const char* GetKnownPathIdString(
int id)
1097 case KNOWN_PATH_HOME:
1098 return "KNOWN_PATH_HOME";
1099 case KNOWN_PATH_TEMP:
1100 return "KNOWN_PATH_TEMP";
1101 case KNOWN_PATH_XDG_DATA_HOME:
1102 return "KNOWN_PATH_XDG_DATA_HOME";
1103 case KNOWN_PATH_XDG_CONFIG_HOME:
1104 return "KNOWN_PATH_XDG_CONFIG_HOME";
1105 case KNOWN_PATH_XDG_CACHE_HOME:
1106 return "KNOWN_PATH_XDG_CACHE_HOME";
1107 case KNOWN_PATH_XDG_RUNTIME_DIR:
1108 return "KNOWN_PATH_XDG_RUNTIME_DIR";
1109 case KNOWN_PATH_SYSTEM_CONFIG_HOME:
1110 return "KNOWN_PATH_SYSTEM_CONFIG_HOME";
1112 return "KNOWN_PATH_UNKNOWN_ID";
1116static char* concat(
const char* path,
size_t pathlen,
const char* name,
size_t namelen)
1118 const size_t strsize = pathlen + namelen + 2;
1119 char* str = calloc(strsize,
sizeof(
char));
1123 winpr_str_append(path, str, strsize,
"");
1124 winpr_str_append(name, str, strsize,
"");
1128BOOL winpr_RemoveDirectory_RecursiveA(LPCSTR lpPathName)
1135 const size_t pathnamelen = strlen(lpPathName);
1136 const size_t path_slash_len = pathnamelen + 3;
1137 char* path_slash = calloc(pathnamelen + 4,
sizeof(
char));
1140 strncat(path_slash, lpPathName, pathnamelen);
1142 const char star[] =
"*";
1143 const HRESULT hr = NativePathCchAppendA(path_slash, path_slash_len, star);
1144 HANDLE dir = INVALID_HANDLE_VALUE;
1149 dir = FindFirstFileA(path_slash, &findFileData);
1151 if (dir == INVALID_HANDLE_VALUE)
1155 path_slash[path_slash_len - 1] =
'\0';
1158 const size_t len = strnlen(findFileData.cFileName, ARRAYSIZE(findFileData.cFileName));
1160 if ((len == 1 && findFileData.cFileName[0] ==
'.') ||
1161 (len == 2 && findFileData.cFileName[0] ==
'.' && findFileData.cFileName[1] ==
'.'))
1166 char* fullpath = concat(path_slash, path_slash_len, findFileData.cFileName, len);
1170 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1171 ret = winpr_RemoveDirectory_RecursiveA(fullpath);
1174 WINPR_PRAGMA_DIAG_PUSH
1175 WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL
1176 ret = DeleteFileA(fullpath);
1177 WINPR_PRAGMA_DIAG_POP
1184 }
while (ret && FindNextFileA(dir, &findFileData) != 0);
1188 WINPR_PRAGMA_DIAG_PUSH
1189 WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL
1190 if (!RemoveDirectoryA(lpPathName))
1192 WINPR_PRAGMA_DIAG_POP
1201BOOL winpr_RemoveDirectory_RecursiveW(LPCWSTR lpPathName)
1203 char* name = ConvertWCharToUtf8Alloc(lpPathName, NULL);
1206 const BOOL rc = winpr_RemoveDirectory_RecursiveA(name);
1211char* winpr_GetConfigFilePath(BOOL system,
const char* filename)
1213 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
1215#if defined(WINPR_USE_VENDOR_PRODUCT_CONFIG_DIR)
1216 char* vendor = GetKnownSubPath(
id, WINPR_VENDOR_STRING);
1219#if defined(WITH_RESOURCE_VERSIONING)
1220 const char* prod = WINPR_PRODUCT_STRING STR(WINPR_VERSION_MAJOR);
1222 const char* prod = WINPR_PRODUCT_STRING;
1224 char* base = GetCombinedPath(vendor, prod);
1227 char* base = GetKnownSubPath(
id,
"winpr");
1235 char* path = GetCombinedPath(base, filename);