Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362/* * PROJECT: ReactOS PSDK * LICENSE: MIT (https://spdx.org/licenses/MIT) * PURPOSE: "Secure" shell path manipulation functions * COPYRIGHT: MinGW-64 and Microsoft Corporation. * Copyright 2023-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org> */
/** * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER within this package. */
#pragma once
#ifndef WINBASEAPI#ifndef _KERNEL32_#define WINBASEAPI DECLSPEC_IMPORT#else#define WINBASEAPI#endif#endif
#ifndef WINPATHCCHAPI#ifndef STATIC_PATHCCH#define WINPATHCCHAPI WINBASEAPI#else#define WINPATHCCHAPI#endif#endif
#ifdef __cplusplusextern "C" {#endif
typedef enum PATHCCH_OPTIONS{ PATHCCH_NONE = 0x00, PATHCCH_ALLOW_LONG_PATHS = 0x01, PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS = 0x02, PATHCCH_FORCE_DISABLE_LONG_NAME_PROCESS = 0x04, PATHCCH_DO_NOT_NORMALIZE_SEGMENTS = 0x08, PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH = 0x10, PATHCCH_ENSURE_TRAILING_SLASH = 0x20,} PATHCCH_OPTIONS;DEFINE_ENUM_FLAG_OPERATORS(PATHCCH_OPTIONS)
#define VOLUME_PREFIX L"\\\\?\\Volume"#define VOLUME_PREFIX_LEN (ARRAYSIZE(VOLUME_PREFIX) - 1)
#define PATHCCH_MAX_CCH 0x8000
WINPATHCCHAPIHRESULTAPIENTRYPathAllocCanonicalize( _In_ PCWSTR pszPathIn, _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags, _Outptr_ PWSTR* ppszPathOut);
WINPATHCCHAPIHRESULTAPIENTRYPathAllocCombine( _In_opt_ PCWSTR pszPathIn, _In_opt_ PCWSTR pszMore, _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags, _Outptr_ PWSTR* ppszPathOut);
WINPATHCCHAPIHRESULTAPIENTRYPathCchAddBackslash( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchAddBackslashEx( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd, _Out_opt_ size_t* pcchRemaining);
WINPATHCCHAPIHRESULTAPIENTRYPathCchAddExtension( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _In_ PCWSTR pszExt);
WINPATHCCHAPIHRESULTAPIENTRYPathCchAppend( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _In_opt_ PCWSTR pszMore);
WINPATHCCHAPIHRESULTAPIENTRYPathCchAppendEx( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _In_opt_ PCWSTR pszMore, _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
WINPATHCCHAPIHRESULTAPIENTRYPathCchCanonicalize( _Out_writes_(cchPathOut) PWSTR pszPathOut, _In_ size_t cchPathOut, _In_ PCWSTR pszPathIn);
WINPATHCCHAPIHRESULTAPIENTRYPathCchCanonicalizeEx( _Out_writes_(cchPathOut) PWSTR pszPathOut, _In_ size_t cchPathOut, _In_ PCWSTR pszPathIn, _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
WINPATHCCHAPIHRESULTAPIENTRYPathCchCombine( _Out_writes_(cchPathOut) PWSTR pszPathOut, _In_ size_t cchPathOut, _In_opt_ PCWSTR pszPathIn, _In_opt_ PCWSTR pszMore);
WINPATHCCHAPIHRESULTAPIENTRYPathCchCombineEx( _Out_writes_(cchPathOut) PWSTR pszPathOut, _In_ size_t cchPathOut, _In_opt_ PCWSTR pszPathIn, _In_opt_ PCWSTR pszMore, _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
WINPATHCCHAPIHRESULTAPIENTRYPathCchFindExtension( _In_reads_(cchPath) PCWSTR pszPath, _In_ size_t cchPath, _Outptr_ PCWSTR* ppszExt);
WINPATHCCHAPIBOOLAPIENTRYPathCchIsRoot( _In_opt_ PCWSTR pszPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchRemoveBackslash( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchRemoveBackslashEx( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd, _Out_opt_ size_t* pcchRemaining);
WINPATHCCHAPIHRESULTAPIENTRYPathCchRemoveExtension( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchRemoveFileSpec( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchRenameExtension( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _In_ PCWSTR pszExt);
WINPATHCCHAPIHRESULTAPIENTRYPathCchSkipRoot( _In_ PCWSTR pszPath, _Outptr_ PCWSTR* ppszRootEnd);
WINPATHCCHAPIHRESULTAPIENTRYPathCchStripPrefix( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIHRESULTAPIENTRYPathCchStripToRoot( _Inout_updates_(cchPath) PWSTR pszPath, _In_ size_t cchPath);
WINPATHCCHAPIBOOLAPIENTRYPathIsUNCEx( _In_ PCWSTR pszPath, _Outptr_opt_ PCWSTR* ppszServer);
#ifndef PATHCCH_NO_DEPRECATE
#undef PathAddBackslash#undef PathAddBackslashA#undef PathAddBackslashW
#undef PathAddExtension#undef PathAddExtensionA#undef PathAddExtensionW
#undef PathAppend#undef PathAppendA#undef PathAppendW
#undef PathCanonicalize#undef PathCanonicalizeA#undef PathCanonicalizeW
#undef PathCombine#undef PathCombineA#undef PathCombineW
#undef PathRenameExtension#undef PathRenameExtensionA#undef PathRenameExtensionW
#ifdef DEPRECATE_SUPPORTED
// #pragma deprecated(PathIsRelativeWorker)// #pragma deprecated(StrIsEqualWorker)// #pragma deprecated(FindPreviousBackslashWorker)// #pragma deprecated(IsHexDigitWorker)// #pragma deprecated(StringIsGUIDWorker)// #pragma deprecated(PathIsVolumeGUIDWorker)// #pragma deprecated(IsValidExtensionWorker)
#pragma deprecated(PathAddBackslash)#pragma deprecated(PathAddBackslashA)#pragma deprecated(PathAddBackslashW)
#pragma deprecated(PathAddExtension)#pragma deprecated(PathAddExtensionA)#pragma deprecated(PathAddExtensionW)
#pragma deprecated(PathAppend)#pragma deprecated(PathAppendA)#pragma deprecated(PathAppendW)
#pragma deprecated(PathCanonicalize)#pragma deprecated(PathCanonicalizeA)#pragma deprecated(PathCanonicalizeW)
#pragma deprecated(PathCombine)#pragma deprecated(PathCombineA)#pragma deprecated(PathCombineW)
#pragma deprecated(PathRenameExtension)#pragma deprecated(PathRenameExtensionA)#pragma deprecated(PathRenameExtensionW)
#else // !DEPRECATE_SUPPORTED
// #define PathIsRelativeWorker PathIsRelativeWorker_is_internal_to_pathcch;// #define StrIsEqualWorker StrIsEqualWorker_is_internal_to_pathcch;// #define FindPreviousBackslashWorker FindPreviousBackslashWorker_is_internal_to_pathcch;// #define IsHexDigitWorker IsHexDigitWorker_is_internal_to_pathcch;// #define StringIsGUIDWorker StringIsGUIDWorker_is_internal_to_pathcch;// #define PathIsVolumeGUIDWorker PathIsVolumeGUIDWorker_is_internal_to_pathcch;// #define IsValidExtensionWorker IsValidExtensionWorker_is_internal_to_pathcch;
#define PathAddBackslash PathAddBackslash_instead_use_PathCchAddBackslash;#define PathAddBackslashA PathAddBackslash_instead_use_PathCchAddBackslash;#define PathAddBackslashW PathAddBackslash_instead_use_PathCchAddBackslash;
#define PathAddExtension PathAddExtension_instead_use_PathCchAddExtension;#define PathAddExtensionA PathAddExtension_instead_use_PathCchAddExtension;#define PathAddExtensionW PathAddExtension_instead_use_PathCchAddExtension;
#define PathAppend PathAppend_instead_use_PathCchAppend;#define PathAppendA PathAppend_instead_use_PathCchAppend;#define PathAppendW PathAppend_instead_use_PathCchAppend;
#define PathCanonicalize PathCanonicalize_instead_use_PathCchCanonicalize;#define PathCanonicalizeA PathCanonicalize_instead_use_PathCchCanonicalize;#define PathCanonicalizeW PathCanonicalize_instead_use_PathCchCanonicalize;
#define PathCombine PathCombine_instead_use_PathCchCombine;#define PathCombineA PathCombine_instead_use_PathCchCombine;#define PathCombineW PathCombine_instead_use_PathCchCombine;
#define PathRenameExtension PathRenameExtension_instead_use_PathCchRenameExtension;#define PathRenameExtensionA PathRenameExtension_instead_use_PathCchRenameExtension;#define PathRenameExtensionW PathRenameExtension_instead_use_PathCchRenameExtension;
#endif // DEPRECATE_SUPPORTED
#endif // PATHCCH_NO_DEPRECATE
#ifdef __cplusplus}#endif
/* C++ non-const overloads */#ifdef __cplusplus
__inline HRESULTPathCchFindExtension( _In_reads_(cchPath) PWSTR pszPath, _In_ size_t cchPath, _Outptr_ PWSTR* ppszExt){ return PathCchFindExtension(const_cast<PCWSTR>(pszPath), cchPath, const_cast<PCWSTR*>(ppszExt));}
__inline HRESULTPathCchSkipRoot( _In_ PWSTR pszPath, _Outptr_ PWSTR* ppszRootEnd){ return PathCchSkipRoot(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszRootEnd));}
__inline BOOLPathIsUNCEx( _In_ PWSTR pszPath, _Outptr_opt_ PWSTR* ppszServer){ return PathIsUNCEx(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszServer));}
#endif // __cplusplus