1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS hive maker
4 * FILE: tools/mkhive/rtl.c
5 * PURPOSE: Runtime Library
6 */
7
8 #include <stdlib.h>
9 #include <stdarg.h>
10
11 /* gcc defaults to cdecl */
12 #if defined(__GNUC__)
13 #undef __cdecl
14 #define __cdecl
15 #endif
16
17 #include "mkhive.h"
18 #include <bitmap.c>
19
20 /*
21 * @implemented
22 *
23 * NOTES
24 * If source is NULL the length of source is assumed to be 0.
25 */
26 VOID NTAPI
RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,IN PCWSTR SourceString)27 RtlInitUnicodeString(
28 IN OUT PUNICODE_STRING DestinationString,
29 IN PCWSTR SourceString)
30 {
31 SIZE_T DestSize;
32
33 if(SourceString)
34 {
35 DestSize = strlenW(SourceString) * sizeof(WCHAR);
36 DestinationString->Length = (USHORT)DestSize;
37 DestinationString->MaximumLength = (USHORT)DestSize + sizeof(WCHAR);
38 }
39 else
40 {
41 DestinationString->Length = 0;
42 DestinationString->MaximumLength = 0;
43 }
44
45 DestinationString->Buffer = (PWCHAR)SourceString;
46 }
47
48 LONG NTAPI
RtlCompareUnicodeString(IN PCUNICODE_STRING String1,IN PCUNICODE_STRING String2,IN BOOLEAN CaseInSensitive)49 RtlCompareUnicodeString(
50 IN PCUNICODE_STRING String1,
51 IN PCUNICODE_STRING String2,
52 IN BOOLEAN CaseInSensitive)
53 {
54 USHORT i;
55 WCHAR c1, c2;
56
57 for (i = 0; i <= String1->Length / sizeof(WCHAR) && i <= String2->Length / sizeof(WCHAR); i++)
58 {
59 if (CaseInSensitive)
60 {
61 c1 = RtlUpcaseUnicodeChar(String1->Buffer[i]);
62 c2 = RtlUpcaseUnicodeChar(String2->Buffer[i]);
63 }
64 else
65 {
66 c1 = String1->Buffer[i];
67 c2 = String2->Buffer[i];
68 }
69
70 if (c1 < c2)
71 return -1;
72 else if (c1 > c2)
73 return 1;
74 }
75
76 return 0;
77 }
78
79 WCHAR NTAPI
RtlUpcaseUnicodeChar(IN WCHAR Source)80 RtlUpcaseUnicodeChar(
81 IN WCHAR Source)
82 {
83 USHORT Offset;
84
85 if (Source < 'a')
86 return Source;
87
88 if (Source <= 'z')
89 return (Source - ('a' - 'A'));
90
91 Offset = 0;
92
93 return Source + (SHORT)Offset;
94 }
95
96 VOID NTAPI
KeQuerySystemTime(OUT PLARGE_INTEGER CurrentTime)97 KeQuerySystemTime(
98 OUT PLARGE_INTEGER CurrentTime)
99 {
100 CurrentTime->QuadPart = 0;
101 }
102
103 PVOID NTAPI
ExAllocatePool(IN POOL_TYPE PoolType,IN SIZE_T NumberOfBytes)104 ExAllocatePool(
105 IN POOL_TYPE PoolType,
106 IN SIZE_T NumberOfBytes)
107 {
108 return (PVOID) malloc(NumberOfBytes);
109 }
110
111 VOID NTAPI
ExFreePool(IN PVOID p)112 ExFreePool(
113 IN PVOID p)
114 {
115 free(p);
116 }
117
118 ULONG
119 __cdecl
DbgPrint(IN CHAR * Format,IN...)120 DbgPrint(
121 IN CHAR *Format,
122 IN ...)
123 {
124 va_list ap;
125 va_start(ap, Format);
126 vprintf(Format, ap);
127 va_end(ap);
128
129 return 0;
130 }
131
132 VOID
133 NTAPI
RtlAssert(IN PVOID FailedAssertion,IN PVOID FileName,IN ULONG LineNumber,IN PCHAR Message OPTIONAL)134 RtlAssert(IN PVOID FailedAssertion,
135 IN PVOID FileName,
136 IN ULONG LineNumber,
137 IN PCHAR Message OPTIONAL)
138 {
139 if (Message != NULL)
140 {
141 DbgPrint("Assertion \'%s\' failed at %s line %u: %s\n",
142 (PCHAR)FailedAssertion,
143 (PCHAR)FileName,
144 LineNumber,
145 Message);
146 }
147 else
148 {
149 DbgPrint("Assertion \'%s\' failed at %s line %u\n",
150 (PCHAR)FailedAssertion,
151 (PCHAR)FileName,
152 LineNumber);
153 }
154
155 //DbgBreakPoint();
156 }
157
158 // FIXME: DECLSPEC_NORETURN
159 VOID
160 NTAPI
KeBugCheckEx(IN ULONG BugCheckCode,IN ULONG_PTR BugCheckParameter1,IN ULONG_PTR BugCheckParameter2,IN ULONG_PTR BugCheckParameter3,IN ULONG_PTR BugCheckParameter4)161 KeBugCheckEx(
162 IN ULONG BugCheckCode,
163 IN ULONG_PTR BugCheckParameter1,
164 IN ULONG_PTR BugCheckParameter2,
165 IN ULONG_PTR BugCheckParameter3,
166 IN ULONG_PTR BugCheckParameter4)
167 {
168 printf("*** STOP: 0x%08X (0x%p,0x%p,0x%p,0x%p)",
169 BugCheckCode,
170 (PVOID)BugCheckParameter1,
171 (PVOID)BugCheckParameter2,
172 (PVOID)BugCheckParameter3,
173 (PVOID)BugCheckParameter4);
174 ASSERT(FALSE);
175 }
176
BitScanForward(ULONG * Index,unsigned long Mask)177 unsigned char BitScanForward(ULONG * Index, unsigned long Mask)
178 {
179 *Index = 0;
180 while (Mask && ((Mask & 1) == 0))
181 {
182 Mask >>= 1;
183 ++(*Index);
184 }
185 return Mask ? 1 : 0;
186 }
187
BitScanReverse(ULONG * const Index,unsigned long Mask)188 unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask)
189 {
190 *Index = 0;
191 while (Mask && ((Mask & (1 << 31)) == 0))
192 {
193 Mask <<= 1;
194 ++(*Index);
195 }
196 return Mask ? 1 : 0;
197 }
198