xref: /reactos/sdk/tools/mkhive/rtl.c (revision 3051eb0e)
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