Reactos
1////////////////////////////////////////////////////////////////////
2// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3// All rights reserved
4// This file was released under the GPLv2 on June 2015.
5////////////////////////////////////////////////////////////////////
6
7extern "C"
8ULONG
9MyRtlCompareMemory(
10 PVOID s1,
11 PVOID s2,
12 ULONG len
13 )
14{
15 ULONG i;
16
17 for(i=0; i<len; i++) {
18 if( ((char*)s1)[i] != ((char*)s2)[i] )
19 break;
20 }
21 return i;
22}
23
24#define STRING_BUFFER_ALIGNMENT (32)
25#define STRING_BUFFER_ALIGN(sz) (((sz)+STRING_BUFFER_ALIGNMENT)&(~((ULONG)(STRING_BUFFER_ALIGNMENT-1))))
26
27#ifndef NT_NATIVE_MODE
28
29extern "C"
30ULONG
31RtlCompareUnicodeString(
32 PUNICODE_STRING s1,
33 PUNICODE_STRING s2,
34 BOOLEAN UpCase
35 )
36{
37 ULONG i;
38
39 if(s1->Length != s2->Length) return (-1);
40 i = memcmp(s1->Buffer, s2->Buffer, (s1->Length) ? (s1->Length) : (s2->Length));
41 return i;
42}
43
44extern "C"
45NTSTATUS
46RtlUpcaseUnicodeString(
47 PUNICODE_STRING dst,
48 PUNICODE_STRING src,
49 BOOLEAN Alloc
50 )
51{
52// if(s1->Length != s2->Length) return (-1);
53 memcpy(dst->Buffer, src->Buffer, src->Length);
54 dst->Buffer[src->Length/sizeof(WCHAR)] = 0;
55 dst->Length = src->Length;
56 _wcsupr(dst->Buffer);
57 return STATUS_SUCCESS;
58}
59
60extern "C"
61NTSTATUS
62RtlAppendUnicodeToString(
63 IN PUNICODE_STRING Str1,
64 IN PWSTR Str2
65 )
66{
67 PWCHAR tmp;
68 USHORT i;
69
70#ifdef _X86_
71
72 __asm push ebx
73 __asm push esi
74 __asm xor ebx,ebx
75 __asm mov esi,Str2
76Scan_1:
77 __asm cmp [word ptr esi+ebx],0
78 __asm je EO_Scan
79 __asm add ebx,2
80 __asm jmp Scan_1
81EO_Scan:
82 __asm mov i,bx
83 __asm pop esi
84 __asm pop ebx
85
86#else // NO X86 optimization, use generic C/C++
87
88 i=0;
89 while(Str2[i]) {
90 i++;
91 }
92 i *= sizeof(WCHAR);
93
94#endif // _X86_
95
96 tmp = Str1->Buffer;
97 ASSERT(Str1->MaximumLength);
98 if((Str1->Length+i+sizeof(WCHAR)) > Str1->MaximumLength) {
99 PWCHAR tmp2 = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, STRING_BUFFER_ALIGN(i + Str1->Length + sizeof(WCHAR))*2, 'ilTS');
100 if(!tmp2)
101 return STATUS_INSUFFICIENT_RESOURCES;
102 memcpy(tmp2, tmp, Str1->MaximumLength);
103 ExFreePool(tmp);
104 tmp = tmp2;
105 Str1->MaximumLength = STRING_BUFFER_ALIGN(i + sizeof(WCHAR))*2;
106 Str1->Buffer = tmp;
107 }
108 RtlCopyMemory(((PCHAR)tmp)+Str1->Length, Str2, i);
109 i+=Str1->Length;
110 tmp[(i / sizeof(WCHAR))] = 0;
111 Str1->Length = i;
112
113 return STATUS_SUCCESS;
114
115#undef UDF_UNC_STR_TAG
116
117} // end RtlAppendUnicodeToString()
118
119#endif //NT_NATIVE_MODE
120
121#ifdef CDRW_W32
122NTSTATUS
123MyInitUnicodeString(
124 IN PUNICODE_STRING Str1,
125 IN PCWSTR Str2
126 )
127{
128
129 USHORT i;
130
131#ifdef _X86_
132
133 __asm push ebx
134 __asm push esi
135 __asm xor ebx,ebx
136 __asm mov esi,Str2
137Scan_1:
138 __asm cmp [word ptr esi+ebx],0
139 __asm je EO_Scan
140 __asm add ebx,2
141 __asm jmp Scan_1
142EO_Scan:
143 __asm mov i,bx
144 __asm pop esi
145 __asm pop ebx
146
147#else // NO X86 optimization, use generic C/C++
148
149 i=0;
150 while(Str2[i]) {
151 i++;
152 }
153 i *= sizeof(WCHAR);
154
155#endif // _X86_
156
157 Str1->MaximumLength = STRING_BUFFER_ALIGN((Str1->Length = i) + sizeof(WCHAR));
158 Str1->Buffer = (PWCHAR)MyAllocatePool__(NonPagedPool, Str1->MaximumLength);
159 if(!Str1->Buffer)
160 return STATUS_INSUFFICIENT_RESOURCES;
161 RtlCopyMemory(Str1->Buffer, Str2, i);
162 Str1->Buffer[i/sizeof(WCHAR)] = 0;
163 return STATUS_SUCCESS;
164
165} // end MyInitUnicodeString()
166#endif //CDRW_W32