|
|
/*++
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
//
// not NTSYSAPI so easily statically linked to
//
//
// 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)
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)
#define RTL_APPEND_PATH_ELEMENT_BUGFIX_CHECK_FIRST_THREE_CHARS_FOR_SLASH_TAKE_FOUND_SLASH_INSTEAD_OF_FIRST_CHAR (0x00000002)
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.
//
NTSTATUS NTAPI RtlGetLengthWithoutLastFullDosPathElement( IN ULONG Flags, IN PCUNICODE_STRING Path, OUT ULONG* LengthOut );
NTSTATUS NTAPI RtlGetLengthWithoutLastNtPathElement( IN ULONG Flags, IN PCUNICODE_STRING Path, OUT ULONG* LengthOut );
NTSTATUS NTAPI RtlGetLengthWithoutLastFullDosOrNtPathElement( IN ULONG Flags, IN PCUNICODE_STRING Path, OUT ULONG* LengthOut );
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
//--
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
|