OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
DataPatcher.c
Go to the documentation of this file.
1
15#include <Library/BaseLib.h>
16#include <Library/BaseMemoryLib.h>
17#include <Library/BaseOverflowLib.h>
18#include <Library/DebugLib.h>
19#include <Library/OcMiscLib.h>
20
21STATIC
22BOOLEAN
24 IN CONST UINT8 *Pattern,
25 IN CONST UINT8 *PatternMask OPTIONAL,
26 IN CONST UINT32 PatternSize,
27 IN CONST UINT8 *Data,
28 IN UINT32 DataSize,
29 IN OUT UINT32 *DataOff
30 )
31{
32 UINT32 Index;
33 UINT32 LastOffset;
34 UINT32 CurrentOffset;
35
36 ASSERT (DataSize >= PatternSize);
37 ASSERT (DataOff != NULL);
38
39 if (PatternSize == 0) {
40 return FALSE;
41 }
42
43 CurrentOffset = *DataOff;
44 LastOffset = DataSize - PatternSize;
45
46 if (PatternMask == NULL) {
47 while (CurrentOffset <= LastOffset) {
48 for (Index = 0; Index < PatternSize; ++Index) {
49 if (Data[CurrentOffset + Index] != Pattern[Index]) {
50 break;
51 }
52 }
53
54 if (Index == PatternSize) {
55 *DataOff = CurrentOffset;
56 return TRUE;
57 }
58
59 ++CurrentOffset;
60 }
61 } else {
62 while (CurrentOffset <= LastOffset) {
63 for (Index = 0; Index < PatternSize; ++Index) {
64 if ((Data[CurrentOffset + Index] & PatternMask[Index]) != Pattern[Index]) {
65 break;
66 }
67 }
68
69 if (Index == PatternSize) {
70 *DataOff = CurrentOffset;
71 return TRUE;
72 }
73
74 ++CurrentOffset;
75 }
76 }
77
78 return FALSE;
79}
80
81BOOLEAN
83 IN CONST UINT8 *Pattern,
84 IN CONST UINT8 *PatternMask OPTIONAL,
85 IN CONST UINT32 PatternSize,
86 IN CONST UINT8 *Data,
87 IN UINT32 DataSize,
88 IN OUT UINT32 *DataOff
89 )
90{
91 if (DataSize < PatternSize) {
92 return FALSE;
93 }
94
95 return InternalFindPattern (
96 Pattern,
97 PatternMask,
98 PatternSize,
99 Data,
100 DataSize,
101 DataOff
102 );
103}
104
105UINT32
107 IN CONST UINT8 *Pattern,
108 IN CONST UINT8 *PatternMask OPTIONAL,
109 IN CONST UINT32 PatternSize,
110 IN CONST UINT8 *Replace,
111 IN CONST UINT8 *ReplaceMask OPTIONAL,
112 IN UINT8 *Data,
113 IN UINT32 DataSize,
114 IN UINT32 Count,
115 IN UINT32 Skip
116 )
117{
118 UINT32 ReplaceCount;
119 UINT32 DataOff;
120 BOOLEAN Found;
121
122 if (DataSize < PatternSize) {
123 return 0;
124 }
125
126 ReplaceCount = 0;
127 DataOff = 0;
128
129 while (TRUE) {
130 Found = InternalFindPattern (
131 Pattern,
132 PatternMask,
133 PatternSize,
134 Data,
135 DataSize,
136 &DataOff
137 );
138
139 if (!Found) {
140 break;
141 }
142
143 //
144 // DataOff + PatternSize - 1 is guaranteed to be a valid offset here. As
145 // DataSize can at most be MAX_UINT32, the maximum valid offset is
146 // MAX_UINT32 - 1. In consequence, DataOff + PatternSize cannot wrap around.
147 //
148
149 //
150 // Skip this finding if requested.
151 //
152 if (Skip > 0) {
153 --Skip;
154 DataOff += PatternSize;
155 continue;
156 }
157
158 //
159 // Perform replacement.
160 //
161 if (ReplaceMask == NULL) {
162 CopyMem (&Data[DataOff], Replace, PatternSize);
163 } else {
164 for (UINTN Index = 0; Index < PatternSize; ++Index) {
165 Data[DataOff + Index] = (Data[DataOff + Index] & ~ReplaceMask[Index]) | (Replace[Index] & ReplaceMask[Index]);
166 }
167 }
168
169 ++ReplaceCount;
170 DataOff += PatternSize;
171
172 //
173 // Check replace count if requested.
174 //
175 if (Count > 0) {
176 --Count;
177 if (Count == 0) {
178 break;
179 }
180 }
181 }
182
183 return ReplaceCount;
184}
STATIC BOOLEAN InternalFindPattern(IN CONST UINT8 *Pattern, IN CONST UINT8 *PatternMask OPTIONAL, IN CONST UINT32 PatternSize, IN CONST UINT8 *Data, IN UINT32 DataSize, IN OUT UINT32 *DataOff)
Definition DataPatcher.c:23
BOOLEAN FindPattern(IN CONST UINT8 *Pattern, IN CONST UINT8 *PatternMask OPTIONAL, IN CONST UINT32 PatternSize, IN CONST UINT8 *Data, IN UINT32 DataSize, IN OUT UINT32 *DataOff)
Definition DataPatcher.c:82
UINT32 ApplyPatch(IN CONST UINT8 *Pattern, IN CONST UINT8 *PatternMask OPTIONAL, IN CONST UINT32 PatternSize, IN CONST UINT8 *Replace, IN CONST UINT8 *ReplaceMask OPTIONAL, IN UINT8 *Data, IN UINT32 DataSize, IN UINT32 Count, IN UINT32 Skip)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
#define ASSERT(x)
Definition coder.h:55