332 lines
9.2 KiB
C
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
|