1 /* 2 * PROJECT: ReactOS PSDK 3 * LICENSE: MIT (https://spdx.org/licenses/MIT) 4 * PURPOSE: "Secure" shell path manipulation functions 5 * COPYRIGHT: MinGW-64 and Microsoft Corporation. 6 */ 7 8 /** 9 * This file is part of the mingw-w64 runtime package. 10 * No warranty is given; refer to the file DISCLAIMER within this package. 11 */ 12 13 #pragma once 14 15 16 #ifndef WINBASEAPI 17 #ifndef _KERNEL32_ 18 #define WINBASEAPI DECLSPEC_IMPORT 19 #else 20 #define WINBASEAPI 21 #endif 22 #endif 23 24 25 #ifndef WINPATHCCHAPI 26 #ifndef STATIC_PATHCCH 27 #define WINPATHCCHAPI WINBASEAPI 28 #else 29 #define WINPATHCCHAPI 30 #endif 31 #endif 32 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 // typedef enum PATHCCH_OPTIONS 39 #define PATHCCH_NONE 0x00 40 #define PATHCCH_ALLOW_LONG_PATHS 0x01 41 #define PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS 0x02 42 #define PATHCCH_FORCE_DISABLE_LONG_NAME_PROCESS 0x04 43 #define PATHCCH_DO_NOT_NORMALIZE_SEGMENTS 0x08 44 #define PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH 0x10 45 #define PATHCCH_ENSURE_TRAILING_SLASH 0x20 46 // DEFINE_ENUM_FLAG_OPERATORS(PATHCCH_OPTIONS) 47 48 #define VOLUME_PREFIX L"\\\\?\\Volume" 49 #define VOLUME_PREFIX_LEN (ARRAYSIZE(VOLUME_PREFIX) - 1) 50 51 #define PATHCCH_MAX_CCH 0x8000 52 53 WINPATHCCHAPI 54 HRESULT 55 APIENTRY 56 PathAllocCanonicalize( 57 _In_ PCWSTR pszPathIn, 58 _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags, 59 _Outptr_ PWSTR* ppszPathOut); 60 61 WINPATHCCHAPI 62 HRESULT 63 APIENTRY 64 PathAllocCombine( 65 _In_opt_ PCWSTR pszPathIn, 66 _In_opt_ PCWSTR pszMore, 67 _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags, 68 _Outptr_ PWSTR* ppszPathOut); 69 70 WINPATHCCHAPI 71 HRESULT 72 APIENTRY 73 PathCchAddBackslash( 74 _Inout_updates_(cchPath) PWSTR pszPath, 75 _In_ size_t cchPath); 76 77 WINPATHCCHAPI 78 HRESULT 79 APIENTRY 80 PathCchAddBackslashEx( 81 _Inout_updates_(cchPath) PWSTR pszPath, 82 _In_ size_t cchPath, 83 _Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd, 84 _Out_opt_ size_t* pcchRemaining); 85 86 WINPATHCCHAPI 87 HRESULT 88 APIENTRY 89 PathCchAddExtension( 90 _Inout_updates_(cchPath) PWSTR pszPath, 91 _In_ size_t cchPath, 92 _In_ PCWSTR pszExt); 93 94 WINPATHCCHAPI 95 HRESULT 96 APIENTRY 97 PathCchAppend( 98 _Inout_updates_(cchPath) PWSTR pszPath, 99 _In_ size_t cchPath, 100 _In_opt_ PCWSTR pszMore); 101 102 WINPATHCCHAPI 103 HRESULT 104 APIENTRY 105 PathCchAppendEx( 106 _Inout_updates_(cchPath) PWSTR pszPath, 107 _In_ size_t cchPath, 108 _In_opt_ PCWSTR pszMore, 109 _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags); 110 111 WINPATHCCHAPI 112 HRESULT 113 APIENTRY 114 PathCchCanonicalize( 115 _Out_writes_(cchPathOut) PWSTR pszPathOut, 116 _In_ size_t cchPathOut, 117 _In_ PCWSTR pszPathIn); 118 119 WINPATHCCHAPI 120 HRESULT 121 APIENTRY 122 PathCchCanonicalizeEx( 123 _Out_writes_(cchPathOut) PWSTR pszPathOut, 124 _In_ size_t cchPathOut, 125 _In_ PCWSTR pszPathIn, 126 _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags); 127 128 WINPATHCCHAPI 129 HRESULT 130 APIENTRY 131 PathCchCombine( 132 _Out_writes_(cchPathOut) PWSTR pszPathOut, 133 _In_ size_t cchPathOut, 134 _In_opt_ PCWSTR pszPathIn, 135 _In_opt_ PCWSTR pszMore); 136 137 WINPATHCCHAPI 138 HRESULT 139 APIENTRY 140 PathCchCombineEx( 141 _Out_writes_(cchPathOut) PWSTR pszPathOut, 142 _In_ size_t cchPathOut, 143 _In_opt_ PCWSTR pszPathIn, 144 _In_opt_ PCWSTR pszMore, 145 _In_ /* PATHCCH_OPTIONS */ ULONG dwFlags); 146 147 WINPATHCCHAPI 148 HRESULT 149 APIENTRY 150 PathCchFindExtension( 151 _In_reads_(cchPath) PCWSTR pszPath, 152 _In_ size_t cchPath, 153 _Outptr_ PCWSTR* ppszExt); 154 155 WINPATHCCHAPI 156 BOOL 157 APIENTRY 158 PathCchIsRoot( 159 _In_opt_ PCWSTR pszPath); 160 161 WINPATHCCHAPI 162 HRESULT 163 APIENTRY 164 PathCchRemoveBackslash( 165 _Inout_updates_(cchPath) PWSTR pszPath, 166 _In_ size_t cchPath); 167 168 WINPATHCCHAPI 169 HRESULT 170 APIENTRY 171 PathCchRemoveBackslashEx( 172 _Inout_updates_(cchPath) PWSTR pszPath, 173 _In_ size_t cchPath, 174 _Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd, 175 _Out_opt_ size_t* pcchRemaining); 176 177 WINPATHCCHAPI 178 HRESULT 179 APIENTRY 180 PathCchRemoveExtension( 181 _Inout_updates_(cchPath) PWSTR pszPath, 182 _In_ size_t cchPath); 183 184 WINPATHCCHAPI 185 HRESULT 186 APIENTRY 187 PathCchRemoveFileSpec( 188 _Inout_updates_(cchPath) PWSTR pszPath, 189 _In_ size_t cchPath); 190 191 WINPATHCCHAPI 192 HRESULT 193 APIENTRY 194 PathCchRenameExtension( 195 _Inout_updates_(cchPath) PWSTR pszPath, 196 _In_ size_t cchPath, 197 _In_ PCWSTR pszExt); 198 199 WINPATHCCHAPI 200 HRESULT 201 APIENTRY 202 PathCchSkipRoot( 203 _In_ PCWSTR pszPath, 204 _Outptr_ PCWSTR* ppszRootEnd); 205 206 WINPATHCCHAPI 207 HRESULT 208 APIENTRY 209 PathCchStripPrefix( 210 _Inout_updates_(cchPath) PWSTR pszPath, 211 _In_ size_t cchPath); 212 213 WINPATHCCHAPI 214 HRESULT 215 APIENTRY 216 PathCchStripToRoot( 217 _Inout_updates_(cchPath) PWSTR pszPath, 218 _In_ size_t cchPath); 219 220 WINPATHCCHAPI 221 BOOL 222 APIENTRY 223 PathIsUNCEx( 224 _In_ PCWSTR pszPath, 225 _Outptr_opt_ PCWSTR* ppszServer); 226 227 228 #ifndef PATHCCH_NO_DEPRECATE 229 230 #undef PathAddBackslash 231 #undef PathAddBackslashA 232 #undef PathAddBackslashW 233 234 #undef PathAddExtension 235 #undef PathAddExtensionA 236 #undef PathAddExtensionW 237 238 #undef PathAppend 239 #undef PathAppendA 240 #undef PathAppendW 241 242 #undef PathCanonicalize 243 #undef PathCanonicalizeA 244 #undef PathCanonicalizeW 245 246 #undef PathCombine 247 #undef PathCombineA 248 #undef PathCombineW 249 250 #undef PathRenameExtension 251 #undef PathRenameExtensionA 252 #undef PathRenameExtensionW 253 254 255 #ifdef DEPRECATE_SUPPORTED 256 257 // #pragma deprecated(PathIsRelativeWorker) 258 // #pragma deprecated(StrIsEqualWorker) 259 // #pragma deprecated(FindPreviousBackslashWorker) 260 // #pragma deprecated(IsHexDigitWorker) 261 // #pragma deprecated(StringIsGUIDWorker) 262 // #pragma deprecated(PathIsVolumeGUIDWorker) 263 // #pragma deprecated(IsValidExtensionWorker) 264 265 #pragma deprecated(PathAddBackslash) 266 #pragma deprecated(PathAddBackslashA) 267 #pragma deprecated(PathAddBackslashW) 268 269 #pragma deprecated(PathAddExtension) 270 #pragma deprecated(PathAddExtensionA) 271 #pragma deprecated(PathAddExtensionW) 272 273 #pragma deprecated(PathAppend) 274 #pragma deprecated(PathAppendA) 275 #pragma deprecated(PathAppendW) 276 277 #pragma deprecated(PathCanonicalize) 278 #pragma deprecated(PathCanonicalizeA) 279 #pragma deprecated(PathCanonicalizeW) 280 281 #pragma deprecated(PathCombine) 282 #pragma deprecated(PathCombineA) 283 #pragma deprecated(PathCombineW) 284 285 #pragma deprecated(PathRenameExtension) 286 #pragma deprecated(PathRenameExtensionA) 287 #pragma deprecated(PathRenameExtensionW) 288 289 #else // !DEPRECATE_SUPPORTED 290 291 // #define PathIsRelativeWorker PathIsRelativeWorker_is_internal_to_pathcch; 292 // #define StrIsEqualWorker StrIsEqualWorker_is_internal_to_pathcch; 293 // #define FindPreviousBackslashWorker FindPreviousBackslashWorker_is_internal_to_pathcch; 294 // #define IsHexDigitWorker IsHexDigitWorker_is_internal_to_pathcch; 295 // #define StringIsGUIDWorker StringIsGUIDWorker_is_internal_to_pathcch; 296 // #define PathIsVolumeGUIDWorker PathIsVolumeGUIDWorker_is_internal_to_pathcch; 297 // #define IsValidExtensionWorker IsValidExtensionWorker_is_internal_to_pathcch; 298 299 #define PathAddBackslash PathAddBackslash_instead_use_PathCchAddBackslash; 300 #define PathAddBackslashA PathAddBackslash_instead_use_PathCchAddBackslash; 301 #define PathAddBackslashW PathAddBackslash_instead_use_PathCchAddBackslash; 302 303 #define PathAddExtension PathAddExtension_instead_use_PathCchAddExtension; 304 #define PathAddExtensionA PathAddExtension_instead_use_PathCchAddExtension; 305 #define PathAddExtensionW PathAddExtension_instead_use_PathCchAddExtension; 306 307 #define PathAppend PathAppend_instead_use_PathCchAppend; 308 #define PathAppendA PathAppend_instead_use_PathCchAppend; 309 #define PathAppendW PathAppend_instead_use_PathCchAppend; 310 311 #define PathCanonicalize PathCanonicalize_instead_use_PathCchCanonicalize; 312 #define PathCanonicalizeA PathCanonicalize_instead_use_PathCchCanonicalize; 313 #define PathCanonicalizeW PathCanonicalize_instead_use_PathCchCanonicalize; 314 315 #define PathCombine PathCombine_instead_use_PathCchCombine; 316 #define PathCombineA PathCombine_instead_use_PathCchCombine; 317 #define PathCombineW PathCombine_instead_use_PathCchCombine; 318 319 #define PathRenameExtension PathRenameExtension_instead_use_PathCchRenameExtension; 320 #define PathRenameExtensionA PathRenameExtension_instead_use_PathCchRenameExtension; 321 #define PathRenameExtensionW PathRenameExtension_instead_use_PathCchRenameExtension; 322 323 #endif // DEPRECATE_SUPPORTED 324 325 #endif // PATHCCH_NO_DEPRECATE 326 327 #ifdef __cplusplus 328 } 329 #endif 330 331 332 /* C++ non-const overloads */ 333 #ifdef __cplusplus 334 335 __inline HRESULT 336 PathCchFindExtension( 337 _In_reads_(cchPath) PWSTR pszPath, 338 _In_ size_t cchPath, 339 _Outptr_ PWSTR* ppszExt) 340 { 341 return PathCchFindExtension(const_cast<PCWSTR>(pszPath), cchPath, const_cast<PCWSTR*>(ppszExt)); 342 } 343 344 __inline HRESULT 345 PathCchSkipRoot( 346 _In_ PWSTR pszPath, 347 _Outptr_ PWSTR* ppszRootEnd) 348 { 349 return PathCchSkipRoot(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszRootEnd)); 350 } 351 352 __inline BOOL 353 PathIsUNCEx( 354 _In_ PWSTR pszPath, 355 _Outptr_opt_ PWSTR* ppszServer) 356 { 357 return PathIsUNCEx(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszServer)); 358 } 359 360 #endif // __cplusplus 361