mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
d0e1d36009
CORE-12686 Isolate PathCch* functions from Wine implementation in kernelbase (which are mixed with a ton of unrelated stuff). These functions are compiled into a pathcch.lib library, similarly to the one in the official MS PSDK. Excepting that here, their actual implementation is in the library. This contrasts with the one in the MS PSDK, which is an import library to an apiset DLL. The pathcch.h header is an original one, that contains SAL annotations and descriptive parameter names, based on the MinGW and MS PSDK headers. Wine's header was not used as it is poor and incomplete. Co-authored-by: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
360 lines
8.7 KiB
C
360 lines
8.7 KiB
C
/*
|
|
* PROJECT: ReactOS PSDK
|
|
* LICENSE: MIT (https://spdx.org/licenses/MIT)
|
|
* PURPOSE: "Secure" shell path manipulation functions
|
|
* COPYRIGHT: MinGW-64 and Microsoft Corporation.
|
|
*/
|
|
|
|
/**
|
|
* 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 __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// typedef enum PATHCCH_OPTIONS
|
|
#define PATHCCH_NONE 0x00
|
|
#define PATHCCH_ALLOW_LONG_PATHS 0x01
|
|
#define PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS 0x02
|
|
#define PATHCCH_FORCE_DISABLE_LONG_NAME_PROCESS 0x04
|
|
#define PATHCCH_DO_NOT_NORMALIZE_SEGMENTS 0x08
|
|
#define PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH 0x10
|
|
#define PATHCCH_ENSURE_TRAILING_SLASH 0x20
|
|
// DEFINE_ENUM_FLAG_OPERATORS(PATHCCH_OPTIONS)
|
|
|
|
#define VOLUME_PREFIX L"\\\\?\\Volume"
|
|
#define VOLUME_PREFIX_LEN (ARRAYSIZE(VOLUME_PREFIX) - 1)
|
|
|
|
#define PATHCCH_MAX_CCH 0x8000
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathAllocCanonicalize(
|
|
_In_ PCWSTR pszPathIn,
|
|
_In_ /* PATHCCH_OPTIONS */ ULONG dwFlags,
|
|
_Outptr_ PWSTR* ppszPathOut);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathAllocCombine(
|
|
_In_opt_ PCWSTR pszPathIn,
|
|
_In_opt_ PCWSTR pszMore,
|
|
_In_ /* PATHCCH_OPTIONS */ ULONG dwFlags,
|
|
_Outptr_ PWSTR* ppszPathOut);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchAddBackslash(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchAddBackslashEx(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd,
|
|
_Out_opt_ size_t* pcchRemaining);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchAddExtension(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_In_ PCWSTR pszExt);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchAppend(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_In_opt_ PCWSTR pszMore);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchAppendEx(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_In_opt_ PCWSTR pszMore,
|
|
_In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchCanonicalize(
|
|
_Out_writes_(cchPathOut) PWSTR pszPathOut,
|
|
_In_ size_t cchPathOut,
|
|
_In_ PCWSTR pszPathIn);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchCanonicalizeEx(
|
|
_Out_writes_(cchPathOut) PWSTR pszPathOut,
|
|
_In_ size_t cchPathOut,
|
|
_In_ PCWSTR pszPathIn,
|
|
_In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchCombine(
|
|
_Out_writes_(cchPathOut) PWSTR pszPathOut,
|
|
_In_ size_t cchPathOut,
|
|
_In_opt_ PCWSTR pszPathIn,
|
|
_In_opt_ PCWSTR pszMore);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchCombineEx(
|
|
_Out_writes_(cchPathOut) PWSTR pszPathOut,
|
|
_In_ size_t cchPathOut,
|
|
_In_opt_ PCWSTR pszPathIn,
|
|
_In_opt_ PCWSTR pszMore,
|
|
_In_ /* PATHCCH_OPTIONS */ ULONG dwFlags);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchFindExtension(
|
|
_In_reads_(cchPath) PCWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_Outptr_ PCWSTR* ppszExt);
|
|
|
|
WINPATHCCHAPI
|
|
BOOL
|
|
APIENTRY
|
|
PathCchIsRoot(
|
|
_In_opt_ PCWSTR pszPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchRemoveBackslash(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchRemoveBackslashEx(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_Outptr_opt_result_buffer_(*pcchRemaining) PWSTR* ppszEnd,
|
|
_Out_opt_ size_t* pcchRemaining);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchRemoveExtension(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchRemoveFileSpec(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchRenameExtension(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_In_ PCWSTR pszExt);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchSkipRoot(
|
|
_In_ PCWSTR pszPath,
|
|
_Outptr_ PCWSTR* ppszRootEnd);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchStripPrefix(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
HRESULT
|
|
APIENTRY
|
|
PathCchStripToRoot(
|
|
_Inout_updates_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath);
|
|
|
|
WINPATHCCHAPI
|
|
BOOL
|
|
APIENTRY
|
|
PathIsUNCEx(
|
|
_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 HRESULT
|
|
PathCchFindExtension(
|
|
_In_reads_(cchPath) PWSTR pszPath,
|
|
_In_ size_t cchPath,
|
|
_Outptr_ PWSTR* ppszExt)
|
|
{
|
|
return PathCchFindExtension(const_cast<PCWSTR>(pszPath), cchPath, const_cast<PCWSTR*>(ppszExt));
|
|
}
|
|
|
|
__inline HRESULT
|
|
PathCchSkipRoot(
|
|
_In_ PWSTR pszPath,
|
|
_Outptr_ PWSTR* ppszRootEnd)
|
|
{
|
|
return PathCchSkipRoot(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszRootEnd));
|
|
}
|
|
|
|
__inline BOOL
|
|
PathIsUNCEx(
|
|
_In_ PWSTR pszPath,
|
|
_Outptr_opt_ PWSTR* ppszServer)
|
|
{
|
|
return PathIsUNCEx(const_cast<PCWSTR>(pszPath), const_cast<PCWSTR*>(ppszServer));
|
|
}
|
|
|
|
#endif // __cplusplus
|