migrate substitution keywords to SVN
[reactos.git] / reactos / lib / rtl / encode.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security descriptor functions
6 * FILE: lib/rtl/encode.c
7 * PROGRAMMER: KJK::Hyperion <noog@libero.it>
8 * REVISION HISTORY:
9 * 02/04/2003: created (code contributed by crazylord
10 * <crazyl0rd@minithins.net>)
11 */
12
13 /* INCLUDES *****************************************************************/
14
15 #include <ddk/ntddk.h>
16
17 #include <ntdll/ntdll.h>
18
19 /* FUNCTIONS ***************************************************************/
20
21 VOID STDCALL
22 RtlRunDecodeUnicodeString (IN UCHAR Hash,
23 IN OUT PUNICODE_STRING String)
24 {
25 PUCHAR ptr;
26 USHORT i;
27
28 ptr = (PUCHAR)String->Buffer;
29 if (String->Length > 1)
30 {
31 for (i = String->Length; i > 1; i--)
32 {
33 ptr[i - 1] ^= ptr[i - 2] ^ Hash;
34 }
35 }
36
37 if (String->Length >= 1)
38 {
39 ptr[0] ^= Hash | (UCHAR)0x43;
40 }
41 }
42
43
44 VOID STDCALL
45 RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash,
46 IN OUT PUNICODE_STRING String)
47 {
48 LARGE_INTEGER CurrentTime;
49 PUCHAR ptr;
50 USHORT i;
51 NTSTATUS Status;
52
53 ptr = (PUCHAR) String->Buffer;
54 if (*Hash == 0)
55 {
56 Status = NtQuerySystemTime (&CurrentTime);
57 if (NT_SUCCESS(Status))
58 {
59 for (i = 1; i < sizeof(LARGE_INTEGER) && (*Hash == 0); i++)
60 *Hash |= *(PUCHAR)(((PUCHAR)&CurrentTime) + i);
61 }
62
63 if (*Hash == 0)
64 *Hash = 1;
65 }
66
67 if (String->Length >= 1)
68 {
69 ptr[0] ^= (*Hash) | (UCHAR)0x43;
70 if (String->Length > 1)
71 {
72 for (i = 1; i < String->Length; i++)
73 {
74 ptr[i] ^= ptr[i - 1] ^ (*Hash);
75 }
76 }
77 }
78 }
79
80 /* EOF */