45{
47
49
50 if (
Length == 3 && OriginalString[0] ==
'\\' && OriginalString[1] ==
'.' && OriginalString[2] ==
'.')
51 {
53 }
54
55 if (
Length == 2 && OriginalString[0] ==
'.' && OriginalString[1] ==
'.')
56 {
58 }
59
60 if (
Length > 2 && OriginalString[0] ==
'.' && OriginalString[1] ==
'.' && OriginalString[2] ==
'\\')
61 {
63 }
64
65 for (ReadPos = 0, WritePos = 0; ReadPos <
Length; ++WritePos)
66 {
67 for (; ReadPos > 0 && ReadPos <
Length; ++ReadPos)
68 {
69 if (ReadPos <
Length - 1 && OriginalString[ReadPos] ==
'\\' && OriginalString[ReadPos + 1] ==
'\\')
70 {
71 continue;
72 }
73
74 if (OriginalString[ReadPos] != '.')
75 {
76 break;
77 }
78
80 {
81 if (OriginalString[ReadPos - 1] == '\\')
82 {
83 if (WritePos > 1)
84 {
85 --WritePos;
86 }
87
88 continue;
89 }
90
91 OriginalString[WritePos] = '.';
92 ++WritePos;
93 continue;
94 }
95
96 if (OriginalString[ReadPos + 1] == '\\')
97 {
98 if (OriginalString[ReadPos - 1] != '\\')
99 {
100 OriginalString[WritePos] = '.';
101 ++WritePos;
102 continue;
103 }
104 }
105 else
106 {
107 if (OriginalString[ReadPos + 1] != '.' || OriginalString[ReadPos - 1] != '\\' ||
108 ((ReadPos !=
Length - 2) && OriginalString[ReadPos + 2] !=
'\\'))
109 {
110 OriginalString[WritePos] = '.';
111 ++WritePos;
112 continue;
113 }
114
115 for (WritePos -= 2; (
SHORT)WritePos > 0 && OriginalString[WritePos] !=
'\\'; --WritePos);
116
117 if ((
SHORT)WritePos < 0 || OriginalString[WritePos] !=
'\\')
118 {
120 }
121
122 if (WritePos == 0 && ReadPos ==
Length - 2)
123 {
124 WritePos = 1;
125 }
126 }
127
128 ++ReadPos;
129 }
130
132 {
133 break;
134 }
135
136 OriginalString[WritePos] = OriginalString[ReadPos];
137 ++ReadPos;
138 }
139
141
143 {
145 }
146
148}
static USHORT USHORT * NewLength
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_IO_REPARSE_DATA_INVALID