34#define ECP_HEADER_SIZE (sizeof(ECP_HEADER))
36#define ECP_HEADER_TO_CONTEXT(H) ((PVOID)((ULONG_PTR)H + ECP_HEADER_SIZE))
37#define ECP_CONTEXT_TO_HEADER(C) ((PECP_HEADER)((ULONG_PTR)C - ECP_HEADER_SIZE))
50 if (
Length == 3 && OriginalString[0] ==
'\\' && OriginalString[1] ==
'.' && OriginalString[2] ==
'.')
55 if (
Length == 2 && OriginalString[0] ==
'.' && OriginalString[1] ==
'.')
60 if (
Length > 2 && OriginalString[0] ==
'.' && OriginalString[1] ==
'.' && OriginalString[2] ==
'\\')
65 for (ReadPos = 0, WritePos = 0; ReadPos <
Length; ++WritePos)
67 for (; ReadPos > 0 && ReadPos <
Length; ++ReadPos)
69 if (ReadPos <
Length - 1 && OriginalString[ReadPos] ==
'\\' && OriginalString[ReadPos + 1] ==
'\\')
74 if (OriginalString[ReadPos] !=
'.')
81 if (OriginalString[ReadPos - 1] ==
'\\')
91 OriginalString[WritePos] =
'.';
96 if (OriginalString[ReadPos + 1] ==
'\\')
98 if (OriginalString[ReadPos - 1] !=
'\\')
100 OriginalString[WritePos] =
'.';
107 if (OriginalString[ReadPos + 1] !=
'.' || OriginalString[ReadPos - 1] !=
'\\' ||
108 ((ReadPos !=
Length - 2) && OriginalString[ReadPos + 2] !=
'\\'))
110 OriginalString[WritePos] =
'.';
115 for (WritePos -= 2; (
SHORT)WritePos > 0 && OriginalString[WritePos] !=
'\\'; --WritePos);
117 if ((
SHORT)WritePos < 0 || OriginalString[WritePos] !=
'\\')
122 if (WritePos == 0 && ReadPos ==
Length - 2)
136 OriginalString[WritePos] = OriginalString[ReadPos];
154 if (
Guid->Data1 == 0 &&
Guid->Data2 == 0 &&
Guid->Data3 == 0 &&
167 return ((Digit & 1) != 1);
187 DataLength = ReparseBuffer->ReparseDataLength;
188 ReparseTag = ReparseBuffer->ReparseTag;
219 if (!ReparseBuffer->MountPointReparseBuffer.SubstituteNameOffset)
222 if (ReparseBuffer->MountPointReparseBuffer.PrintNameOffset == ReparseBuffer->MountPointReparseBuffer.SubstituteNameLength +
sizeof(
UNICODE_NULL))
235#define FIELDS_SIZE (FIELD_OFFSET(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.PathBuffer) - FIELD_OFFSET(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.SubstituteNameOffset))
247 if (ReparseBuffer->SymbolicLinkReparseBuffer.SubstituteNameLength && ReparseBuffer->SymbolicLinkReparseBuffer.PrintNameLength)
250 if (
IsEven(ReparseBuffer->SymbolicLinkReparseBuffer.SubstituteNameLength) &&
IsEven(ReparseBuffer->SymbolicLinkReparseBuffer.PrintNameLength) &&
251 IsEven(ReparseBuffer->SymbolicLinkReparseBuffer.SubstituteNameOffset) &&
IsEven(ReparseBuffer->SymbolicLinkReparseBuffer.PrintNameOffset))
315 if (CurrentEntry ==
NULL)
static USHORT USHORT * NewLength
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
FORCEINLINE BOOLEAN IsNullGuid(IN PGUID Guid)
#define IsListEmpty(ListHead)
_In_ PECP_LIST _In_opt_ PVOID CurrentEcpContext
_In_ PECP_LIST _In_opt_ PVOID _Out_opt_ LPGUID _Outptr_opt_ PVOID * NextEcpContext
_In_ PECP_LIST _In_opt_ PVOID _Out_opt_ LPGUID NextEcpType
_Must_inspect_result_ _In_ FSRTL_ALLOCATE_ECPLIST_FLAGS _Outptr_ PECP_LIST * EcpList
_In_ PECP_LIST _In_opt_ PVOID _Out_opt_ LPGUID _Outptr_opt_ PVOID _Out_opt_ ULONG * NextEcpContextSize
VOID(* PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK)(_Inout_ PVOID EcpContext, _In_ LPCGUID EcpType)
#define REPARSE_DATA_BUFFER_HEADER_SIZE
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_IO_REPARSE_TAG_INVALID
#define STATUS_IO_REPARSE_DATA_INVALID
NTKERNELAPI NTSTATUS NTAPI FsRtlGetNextExtraCreateParameter(IN PECP_LIST EcpList, IN PVOID CurrentEcpContext, OUT LPGUID NextEcpType OPTIONAL, OUT PVOID *NextEcpContext, OUT PULONG NextEcpContextSize OPTIONAL)
struct _ECP_LIST * PECP_LIST
struct _ECP_HEADER ECP_HEADER
NTKERNELAPI NTSTATUS NTAPI FsRtlValidateReparsePointBuffer(IN ULONG BufferLength, IN PREPARSE_DATA_BUFFER ReparseBuffer)
struct _ECP_LIST ECP_LIST
NTKERNELAPI NTSTATUS NTAPI FsRtlRemoveDotsFromPath(IN PWSTR OriginalString, IN USHORT PathLength, OUT USHORT *NewLength)
#define ECP_CONTEXT_TO_HEADER(C)
NTKERNELAPI NTSTATUS NTAPI FsRtlGetEcpListFromIrp(IN PIRP Irp, OUT PECP_LIST *EcpList)
struct _ECP_HEADER * PECP_HEADER
#define ECP_HEADER_TO_CONTEXT(H)
PULONG MinorVersion OPTIONAL
struct _LIST_ENTRY * Flink
USHORT SubstituteNameOffset
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
NTKRNLVISTAAPI NTSTATUS NTAPI IoGetIrpExtraCreateParameter(_In_ PIRP Irp, _Outptr_result_maybenull_ struct _ECP_LIST **ExtraCreateParameter)
#define IO_REPARSE_TAG_RESERVED_ONE
struct _REPARSE_GUID_DATA_BUFFER * PREPARSE_GUID_DATA_BUFFER
#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE
#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE
#define IO_REPARSE_TAG_SYMLINK
#define IO_REPARSE_TAG_MOUNT_POINT
#define IO_REPARSE_TAG_RESERVED_ZERO
#define IsReparseTagMicrosoft(_tag)