2 * PROJECT: ReactOS Kernel - Vista+ APIs
3 * LICENSE: GPL v2 - See COPYING in the top level directory
4 * FILE: lib/drivers/ntoskrnl_vista/fsrtl.c
5 * PURPOSE: FsRtl functions of Vista+
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
15 FsRtlRemoveDotsFromPath(IN PWSTR OriginalString
,
17 OUT USHORT
*NewLength
)
19 USHORT Length
, ReadPos
, WritePos
= 0;
21 Length
= PathLength
/ sizeof(WCHAR
);
23 if (Length
== 3 && OriginalString
[0] == '\\' && OriginalString
[1] == '.' && OriginalString
[2] == '.')
25 return STATUS_IO_REPARSE_DATA_INVALID
;
28 if (Length
== 2 && OriginalString
[0] == '.' && OriginalString
[1] == '.')
30 return STATUS_IO_REPARSE_DATA_INVALID
;
33 if (Length
> 2 && OriginalString
[0] == '.' && OriginalString
[1] == '.' && OriginalString
[2] == '\\')
35 return STATUS_IO_REPARSE_DATA_INVALID
;
42 for (; ReadPos
< Length
; ++WritePos
)
44 for (; ReadPos
< Length
; ++ReadPos
)
46 if (ReadPos
< Length
- 1 && OriginalString
[ReadPos
] == '\\' && OriginalString
[ReadPos
+ 1] == '\\')
51 if (OriginalString
[ReadPos
] != '.')
56 if (ReadPos
== Length
- 1)
58 if (OriginalString
[ReadPos
- 1] == '\\')
68 OriginalString
[WritePos
] = '.';
73 if (OriginalString
[ReadPos
+ 1] == '\\')
75 if (OriginalString
[ReadPos
- 1] != '\\')
77 OriginalString
[WritePos
] = '.';
84 if (OriginalString
[ReadPos
+ 1] != '.' || OriginalString
[ReadPos
- 1] != '\\' ||
85 ((ReadPos
!= Length
- 2) && OriginalString
[ReadPos
+ 2] != '\\'))
87 OriginalString
[WritePos
] = '.';
92 for (WritePos
-= 2; (SHORT
)WritePos
> 0 && OriginalString
[WritePos
] != '\\'; --WritePos
);
94 if ((SHORT
)WritePos
< 0 || OriginalString
[WritePos
] != '\\')
96 return STATUS_IO_REPARSE_DATA_INVALID
;
99 if (WritePos
== 0 && ReadPos
== Length
- 2)
108 OriginalString
[WritePos
] = OriginalString
[ReadPos
];
113 *NewLength
= WritePos
* sizeof(WCHAR
);
115 while (WritePos
< Length
)
117 OriginalString
[WritePos
++] = UNICODE_NULL
;
120 return STATUS_SUCCESS
;