windows-nt/Source/XPSP1/NT/public/sdk/inc/ntrtlpath.h
2020-09-26 16:20:57 +08:00

332 lines
9.2 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
NtRtlPath.h
Abstract:
Broken out from nturtl and rtl so I can move it between them in seperate
trees without merge madness. To be integrated into ntrtl.h
Author:
Jay Krell (a-JayK) December 2000
Environment:
Revision History:
--*/
#ifndef _NTRTL_PATH_
#define _NTRTL_PATH_
#if _MSC_VER >= 1100
#pragma once
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if defined (_MSC_VER)
#if ( _MSC_VER >= 800 )
#pragma warning(disable:4514)
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#endif
#endif
//
// Don't use NTSYSAPI directly so you can more easily
// statically link to these functions, independently
// of how you link to the rest of ntdll.
//
#if !defined(RTL_PATH_API)
#define RTL_PATH_API NTSYSAPI
#endif
//
// These are OUT Disposition values.
//
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_AMBIGUOUS (0x00000001)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_UNC (0x00000002)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_DRIVE (0x00000003)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_ALREADY_DOS (0x00000004)
RTL_PATH_API
NTSTATUS
NTAPI
RtlNtPathNameToDosPathName(
IN ULONG Flags,
IN OUT PRTL_UNICODE_STRING_BUFFER Path,
OUT ULONG* Disposition OPTIONAL,
IN OUT PWSTR* FilePart OPTIONAL
);
//
// If either Path or Element end in a path seperator, then so does the result.
// The path seperator to put on the end is chosen from the existing ones.
//
#define RTL_APPEND_PATH_ELEMENT_ONLY_BACKSLASH_IS_SEPERATOR (0x00000001)
RTL_PATH_API
NTSTATUS
NTAPI
RtlAppendPathElement(
IN ULONG Flags,
IN OUT PRTL_UNICODE_STRING_BUFFER Path,
PCUNICODE_STRING Element
);
//
// c:\foo => c:\
// \foo => empty
// \ => empty
// Trailing slashness is generally preserved.
//
RTL_PATH_API
NTSTATUS
NTAPI
RtlGetLengthWithoutLastFullDosPathElement(
IN ULONG Flags,
IN PCUNICODE_STRING Path,
OUT ULONG* LengthOut
);
RTL_PATH_API
NTSTATUS
NTAPI
RtlGetLengthWithoutLastNtPathElement(
IN ULONG Flags,
IN PCUNICODE_STRING Path,
OUT ULONG* LengthOut
);
RTL_PATH_API
NTSTATUS
NTAPI
RtlGetLengthWithoutLastFullDosOrNtPathElement(
IN ULONG Flags,
IN PCUNICODE_STRING Path,
OUT ULONG* LengthOut
);
RTL_PATH_API
NTSTATUS
NTAPI
RtlGetLengthWithoutTrailingPathSeperators(
IN ULONG Flags,
IN PCUNICODE_STRING Path,
OUT ULONG* LengthOut
);
//++
//
// NTSTATUS
// RtlRemoveLastNtPathElement(
// IN ULONG Flags
// IN OUT PUNICODE_STRING UnicodeString
//
// NTSTATUS
// RtlRemoveLastNtPathElement(
// IN ULONG Flags
// IN OUT PRTL_UNICODE_STRING_BUFFER UnicodeStringBuffer
// );
//
// NTSTATUS
// RtlRemoveLastFullDosPathElement(
// IN ULONG Flags
// IN OUT PUNICODE_STRING UnicodeString
//
// NTSTATUS
// RtlRemoveLastFullDosPathElement(
// IN ULONG Flags
// IN OUT PRTL_UNICODE_STRING_BUFFER UnicodeStringBuffer
// );
//
// NTSTATUS
// RtlRemoveLastFullDosOrNtPathElement(
// IN ULONG Flags
// IN OUT PUNICODE_STRING UnicodeString
//
// NTSTATUS
// RtlRemoveLastFullDosOrNtPathElement(
// IN ULONG Flags
// IN OUT PRTL_UNICODE_STRING_BUFFER UnicodeStringBuffer
// );
//
// NTSTATUS
// RtlRemoveTrailingPathSeperators(
// IN ULONG Flags
// IN OUT PUNICODE_STRING UnicodeString
//
// NTSTATUS
// RtlRemoveTrailingPathSeperators(
// IN ULONG Flags
// IN OUT PRTL_UNICODE_STRING_BUFFER UnicodeStringBuffer
// );
//
// Routine Description:
//
// This family of functions the last element from a path, where path is explicitly
// an Nt Path, a full DOS path, or either.
// NT Path:
// Uses only backslash as delimiter.
// Starts with single backslash.
// Full DOS/Win32 Path:
// Uses backslash and forward slash as delimiter.
// Starts with two delimiters or drive-letter-colon-delimiter.
// Also beware the special \\? form.
//
// And paths are stored in UNICODE_STRING or RTL_UNICODE_STRING_BUFFER.
// UNICODE_STRING is shortened just by changing the length, RTL_UNICODE_STRING_BUFFER
// also get a terminal nul written into them.
//
// There were more comments here, but the file got copied over by accident.
//
// Arguments:
//
// Flags -
// UnicodeString -
// UnicodeStringBuffer -
//
// Return Value:
//
// STATUS_INVALID_PARAMETER
// STATUS_SUCCESS
//--
RTL_PATH_API
NTSTATUS
NTAPI
RtlpApplyLengthFunction(
IN ULONG Flags,
IN SIZE_T SizeOfStruct,
IN OUT PVOID UnicodeStringOrUnicodeStringBuffer,
NTSTATUS (NTAPI* LengthFunction)(ULONG, PCUNICODE_STRING, ULONG*)
);
#define RtlRemoveLastNtPathElement(Flags, Path) \
(RtlpApplyLengthFunction((Flags), sizeof(*Path), (Path), RtlGetLengthWithoutLastNtPathElement))
#define RtlRemoveLastFullDosPathElement(Flags, Path) \
(RtlpApplyLengthFunction((Flags), sizeof(*Path), (Path), RtlGetLengthWithoutLastFullDosPathElement))
#define RtlRemoveLastFullDosOrNtPathElement(Flags, Path) \
(RtlpApplyLengthFunction((Flags), sizeof(*Path), (Path), RtlGetLengthWithoutLastFullDosOrNtPathElement))
#define RtlRemoveTrailingPathSeperators(Flags, Path) \
(RtlpApplyLengthFunction((Flags), sizeof(*Path), (Path), RtlGetLengthWithoutTrailingPathSeperators))
//
// Such small pieces of data are not worth exporting.
// If you want any of this data in char form, just take the first char from the string.
//
#if !(defined(SORTPP_PASS) || defined(MIDL_PASS)) // Neither the Wow64 thunk generation tools nor midl accept this.
#if defined(RTL_CONSTANT_STRING) // Some code gets here without this defined.
#if defined(_MSC_VER) && (_MSC_VER >= 1100) // VC5 for __declspec(selectany)
__declspec(selectany) extern const UNICODE_STRING RtlNtPathSeperatorString = RTL_CONSTANT_STRING(L"\\");
__declspec(selectany) extern const UNICODE_STRING RtlDosPathSeperatorsString = RTL_CONSTANT_STRING(L"\\/");
__declspec(selectany) extern const UNICODE_STRING RtlAlternateDosPathSeperatorString = RTL_CONSTANT_STRING(L"/");
#else
static const UNICODE_STRING RtlNtPathSeperatorString = RTL_CONSTANT_STRING(L"\\");
static const UNICODE_STRING RtlDosPathSeperatorsString = RTL_CONSTANT_STRING(L"\\/");
static const UNICODE_STRING RtlAlternateDosPathSeperatorString = RTL_CONSTANT_STRING(L"/");
#endif // defined(_MSC_VER) && (_MSC_VER >= 1100)
#else
#if defined(_MSC_VER) && (_MSC_VER >= 1100) // VC5 for __declspec(selectany)
__declspec(selectany) extern const UNICODE_STRING RtlNtPathSeperatorString = { 1 * sizeof(WCHAR), 2 * sizeof(WCHAR), L"\\" };
__declspec(selectany) extern const UNICODE_STRING RtlDosPathSeperatorsString = { 2 * sizeof(WCHAR), 3 * sizeof(WCHAR), L"\\/" };
__declspec(selectany) extern const UNICODE_STRING RtlAlternateDosPathSeperatorString = { 1 * sizeof(WCHAR), 2 * sizeof(WCHAR), L"/" };
#else
static const UNICODE_STRING RtlNtPathSeperatorString = { 1 * sizeof(WCHAR), 2 * sizeof(WCHAR), L"\\" };
static const UNICODE_STRING RtlDosPathSeperatorsString = { 2 * sizeof(WCHAR), 3 * sizeof(WCHAR), L"\\/" };
static const UNICODE_STRING RtlAlternateDosPathSeperatorString = { 1 * sizeof(WCHAR), 2 * sizeof(WCHAR), L"/" };
#endif // defined(_MSC_VER) && (_MSC_VER >= 1100)
#endif // defined(RTL_CONSTANT_STRING)
#define RtlCanonicalDosPathSeperatorString RtlNtPathSeperatorString
#define RtlPathSeperatorString RtlNtPathSeperatorString
#endif
//++
//
// WCHAR
// RTL_IS_DOS_PATH_SEPARATOR(
// IN WCHAR Ch
// );
//
// Routine Description:
//
// Arguments:
//
// Ch -
//
// Return Value:
//
// TRUE if ch is \\ or /.
// FALSE otherwise.
//--
#define RTL_IS_DOS_PATH_SEPARATOR(ch_) ((ch_) == '\\' || ((ch_) == '/'))
#define RTL_IS_DOS_PATH_SEPERATOR(ch_) RTL_IS_DOS_PATH_SEPARATOR(ch_)
#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER >= 1100 // VC5 for bool
inline bool RtlIsDosPathSeparator(WCHAR ch) { return RTL_IS_DOS_PATH_SEPARATOR(ch); }
inline bool RtlIsDosPathSeperator(WCHAR ch) { return RTL_IS_DOS_PATH_SEPARATOR(ch); }
#endif
//
// compatibility
//
#define RTL_IS_PATH_SEPERATOR RTL_IS_DOS_PATH_SEPERATOR
#define RTL_IS_PATH_SEPARATOR RTL_IS_DOS_PATH_SEPERATOR
#define RtlIsPathSeparator RtlIsDosPathSeparator
#define RtlIsPathSeperator RtlIsDosPathSeparator
//++
//
// WCHAR
// RTL_IS_NT_PATH_SEPARATOR(
// IN WCHAR Ch
// );
//
// Routine Description:
//
// Arguments:
//
// Ch -
//
// Return Value:
//
// TRUE if ch is \\.
// FALSE otherwise.
//--
#define RTL_IS_NT_PATH_SEPARATOR(ch_) ((ch_) == '\\')
#define RTL_IS_NT_PATH_SEPERATOR(ch_) RTL_IS_NT_PATH_SEPARATOR(ch_)
#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER >= 1100 // VC5 for bool
inline bool RtlIsNtPathSeparator(WCHAR ch) { return RTL_IS_NT_PATH_SEPARATOR(ch); }
inline bool RtlIsNtPathSeperator(WCHAR ch) { return RTL_IS_NT_PATH_SEPARATOR(ch); }
#endif
#ifdef __cplusplus
} // extern "C"
#endif
#if defined (_MSC_VER) && ( _MSC_VER >= 800 )
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning(default:4001)
#pragma warning(default:4201)
#pragma warning(default:4214)
#endif
#endif
#endif