xref: /reactos/sdk/lib/rtl/mem.c (revision 177ae91b)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS system libraries
4  * FILE:            lib/rtl/mem.c
5  * PURPOSE:         Memory functions
6  * PROGRAMMER:      David Welch (welch@mcmail.com)
7  */
8 
9 /* INCLUDES *****************************************************************/
10 
11 #include <rtl.h>
12 
13 #define NDEBUG
14 #include <debug.h>
15 
16 
17 /* FUNCTIONS *****************************************************************/
18 
19 /******************************************************************************
20  *  RtlCompareMemory   [NTDLL.@]
21  *
22  * Compare one block of memory with another
23  *
24  * PARAMS
25  *  Source1 [I] Source block
26  *  Source2 [I] Block to compare to Source1
27  *  Length  [I] Number of bytes to fill
28  *
29  * RETURNS
30  *  The length of the first byte at which Source1 and Source2 differ, or Length
31  *  if they are the same.
32  *
33  * @implemented
34  */
35 SIZE_T
36 NTAPI
37 RtlCompareMemory(IN const VOID *Source1,
38                  IN const VOID *Source2,
39                  IN SIZE_T Length)
40 {
41     SIZE_T i;
42     for (i = 0; (i < Length) && (((PUCHAR)Source1)[i] == ((PUCHAR)Source2)[i]); i++)
43         ;
44 
45     return i;
46 }
47 
48 
49 /*
50  * FUNCTION: Compares a block of ULONGs with an ULONG and returns the number of equal bytes
51  * ARGUMENTS:
52  *      Source = Block to compare
53  *      Length = Number of bytes to compare
54  *      Value = Value to compare
55  * RETURNS: Number of equal bytes
56  *
57  * @implemented
58  */
59 SIZE_T
60 NTAPI
61 RtlCompareMemoryUlong(IN PVOID Source,
62                       IN SIZE_T Length,
63                       IN ULONG Value)
64 {
65     PULONG ptr = (PULONG)Source;
66     ULONG_PTR len = Length / sizeof(ULONG);
67     ULONG_PTR i;
68 
69     for (i = 0; i < len; i++)
70     {
71         if (*ptr != Value)
72             break;
73 
74         ptr++;
75     }
76 
77     return (SIZE_T)((PCHAR)ptr - (PCHAR)Source);
78 }
79 
80 
81 #undef RtlFillMemory
82 /*
83  * @implemented
84  */
85 VOID
86 NTAPI
87 RtlFillMemory(PVOID Destination,
88               SIZE_T Length,
89               UCHAR Fill)
90 {
91     memset(Destination, Fill, Length);
92 }
93 
94 
95 #ifndef _M_AMD64
96 /*
97  * @implemented
98  */
99 VOID
100 NTAPI
101 RtlFillMemoryUlong(PVOID Destination,
102                    SIZE_T Length,
103                    ULONG Fill)
104 {
105     PULONG Dest  = Destination;
106     SIZE_T Count = Length / sizeof(ULONG);
107 
108     while (Count > 0)
109     {
110         *Dest = Fill;
111         Dest++;
112         Count--;
113     }
114 }
115 
116 #ifdef _WIN64
117 VOID
118 NTAPI
119 RtlFillMemoryUlonglong(
120     PVOID Destination,
121     SIZE_T Length,
122     ULONGLONG Fill)
123 {
124     PULONGLONG Dest  = Destination;
125     SIZE_T Count = Length / sizeof(ULONGLONG);
126 
127     while (Count > 0)
128     {
129         *Dest = Fill;
130         Dest++;
131         Count--;
132     }
133 }
134 #endif // _WIN64
135 #endif // _M_AMD64
136 
137 #undef RtlMoveMemory
138 /*
139  * @implemented
140  */
141 VOID
142 NTAPI
143 RtlMoveMemory(PVOID Destination,
144               CONST VOID *Source,
145               SIZE_T Length)
146 {
147     memmove(Destination, Source, Length);
148 }
149 
150 #undef RtlZeroMemory
151 /*
152  * @implemented
153  */
154 VOID
155 NTAPI
156 RtlZeroMemory(PVOID Destination,
157               SIZE_T Length)
158 {
159     RtlFillMemory(Destination, Length, 0);
160 }
161 
162 /* EOF */
163