OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
KernelVersion.c
Go to the documentation of this file.
1
15#include <Base.h>
16
17#include <Library/BaseLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/DebugLib.h>
21#include <Library/OcMiscLib.h>
22#include <Library/OcStringLib.h>
23
24#include "PrelinkedInternal.h"
25
26UINT32
28 IN CONST CHAR8 *String
29 )
30{
31 UINT32 Version;
32 UINT32 VersionPart;
33 UINT32 Index;
34 UINT32 Index2;
35
36 if ((*String == '\0') || (*String < '0') || (*String > '9')) {
37 return 0;
38 }
39
40 Version = 0;
41
42 for (Index = 0; Index < 3; ++Index) {
43 Version *= 100;
44
45 VersionPart = 0;
46
47 for (Index2 = 0; Index2 < 2; ++Index2) {
48 //
49 // Handle single digit parts, i.e. parse 1.2.3 as 010203.
50 //
51 if ((*String != '.') && (*String != '\0')) {
52 VersionPart *= 10;
53 }
54
55 if ((*String >= '0') && (*String <= '9')) {
56 VersionPart += *String++ - '0';
57 } else if ((*String != '.') && (*String != '\0')) {
58 return 0;
59 }
60 }
61
62 Version += VersionPart;
63
64 if (*String == '.') {
65 ++String;
66 }
67 }
68
69 return Version;
70}
71
72BOOLEAN
74 IN UINT32 CurrentVersion OPTIONAL,
75 IN UINT32 MinVersion OPTIONAL,
76 IN UINT32 MaxVersion OPTIONAL
77 )
78{
79 //
80 // Check against min <= curr <= max.
81 // curr=0 -> curr=inf, max=0 -> max=inf
82 //
83
84 //
85 // Replace max inf with max known version.
86 //
87 if (MaxVersion == 0) {
88 MaxVersion = CurrentVersion;
89 }
90
91 //
92 // Handle curr=inf <= max=inf(?) case.
93 //
94 if (CurrentVersion == 0) {
95 return MaxVersion == 0;
96 }
97
98 //
99 // Handle curr=num > max=num case.
100 //
101 if (CurrentVersion > MaxVersion) {
102 return FALSE;
103 }
104
105 //
106 // Handle min=num > curr=num case.
107 //
108 if (CurrentVersion < MinVersion) {
109 return FALSE;
110 }
111
112 return TRUE;
113}
114
115UINT32
117 IN CONST UINT8 *Kernel,
118 IN UINT32 KernelSize
119 )
120{
121 BOOLEAN Exists;
122 UINT32 Offset;
123 UINT32 Index;
124 CHAR8 DarwinVersion[32];
125 UINT32 DarwinVersionInteger;
126
127 Offset = 0;
128 Exists = FindPattern (
129 (CONST UINT8 *)"Darwin Kernel Version ",
130 NULL,
131 L_STR_LEN ("Darwin Kernel Version "),
132 Kernel,
133 KernelSize,
134 &Offset
135 );
136
137 if (!Exists) {
138 DEBUG ((DEBUG_WARN, "OCAK: Failed to determine kernel version\n"));
139 return 0;
140 }
141
142 Offset += L_STR_LEN ("Darwin Kernel Version ");
143
144 for (Index = 0; Index < ARRAY_SIZE (DarwinVersion) - 1; ++Index, ++Offset) {
145 if ((Offset >= KernelSize) || (Kernel[Offset] == ':')) {
146 break;
147 }
148
149 DarwinVersion[Index] = (CHAR8)Kernel[Offset];
150 }
151
152 DarwinVersion[Index] = '\0';
153 DarwinVersionInteger = OcParseDarwinVersion (DarwinVersion);
154
155 DEBUG ((
156 DEBUG_INFO,
157 "OCAK: Read kernel version %a (%u)\n",
158 DarwinVersion,
159 DarwinVersionInteger
160 ));
161
162 return DarwinVersionInteger;
163}
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
UINT32 Version
BOOLEAN OcMatchDarwinVersion(IN UINT32 CurrentVersion OPTIONAL, IN UINT32 MinVersion OPTIONAL, IN UINT32 MaxVersion OPTIONAL)
UINT32 OcKernelReadDarwinVersion(IN CONST UINT8 *Kernel, IN UINT32 KernelSize)
UINT32 OcParseDarwinVersion(IN CONST CHAR8 *String)
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
#define L_STR_LEN(String)
Definition OcStringLib.h:26