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
;
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
;
38 for (ReadPos
= 0, WritePos
= 0; ReadPos
< Length
; ++WritePos
)
40 for (; ReadPos
> 0 && ReadPos
< Length
; ++ReadPos
)
42 if (ReadPos
< Length
- 1 && OriginalString
[ReadPos
] == '\\' && OriginalString
[ReadPos
+ 1] == '\\')
47 if (OriginalString
[ReadPos
] != '.')
52 if (ReadPos
== Length
- 1)
54 if (OriginalString
[ReadPos
- 1] == '\\')
64 OriginalString
[WritePos
] = '.';
69 if (OriginalString
[ReadPos
+ 1] == '\\')
71 if (OriginalString
[ReadPos
- 1] != '\\')
73 OriginalString
[WritePos
] = '.';
80 if (OriginalString
[ReadPos
+ 1] != '.' || OriginalString
[ReadPos
- 1] != '\\' ||
81 ((ReadPos
!= Length
- 2) && OriginalString
[ReadPos
+ 2] != '\\'))
83 OriginalString
[WritePos
] = '.';
88 for (WritePos
-= 2; (SHORT
)WritePos
> 0 && OriginalString
[WritePos
] != '\\'; --WritePos
);
90 if ((SHORT
)WritePos
< 0 || OriginalString
[WritePos
] != '\\')
92 return STATUS_IO_REPARSE_DATA_INVALID
;
95 if (WritePos
== 0 && ReadPos
== Length
- 2)
104 if (ReadPos
>= Length
)
109 OriginalString
[WritePos
] = OriginalString
[ReadPos
];
113 *NewLength
= WritePos
* sizeof(WCHAR
);
115 while (WritePos
< Length
)
117 OriginalString
[WritePos
++] = UNICODE_NULL
;
120 return STATUS_SUCCESS
;