[SDK:LIB] Import PathCch* functions from Wine (#5842)

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>
This commit is contained in:
Hermès Bélusca-Maïto 2023-10-27 15:46:13 +02:00
parent c7777f5963
commit d0e1d36009
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
4 changed files with 1462 additions and 0 deletions

View file

@ -34,6 +34,7 @@ endif()
add_subdirectory(ioevent)
add_subdirectory(lsalib)
add_subdirectory(nt)
add_subdirectory(pathcch)
add_subdirectory(pseh)
if(KDBG)

View file

@ -0,0 +1,3 @@
add_library(pathcch pathcch.c)
add_dependencies(pathcch xdk)

1098
sdk/lib/pathcch/pathcch.c Normal file

File diff suppressed because it is too large Load diff

360
sdk/lib/pathcch/pathcch.h Normal file
View file

@ -0,0 +1,360 @@
/*
* 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