OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OpenNetworkBoot.c
Go to the documentation of this file.
1
9
10#define ENROLL_CERT L"enroll-cert"
11#define DELETE_CERT L"delete-cert"
12#define DELETE_ALL_CERTS L"delete-all-certs"
13
15
16STATIC BOOLEAN mAllowPxeBoot;
17STATIC BOOLEAN mAllowHttpBoot;
18STATIC BOOLEAN mAllowIpv4;
19STATIC BOOLEAN mAllowIpv6;
20STATIC BOOLEAN mAuxEntries;
21STATIC CHAR16 *mHttpBootUri;
22
23STATIC CHAR16 PxeBootId[] = L"PXE Boot IPv";
24STATIC CHAR16 HttpBootId[] = L"HTTP Boot IPv";
25
26STATIC
27VOID
29 IN OC_PICKER_ENTRY *Entry
30 )
31{
32 ASSERT (Entry != NULL);
33
34 if (Entry == NULL) {
35 return;
36 }
37
38 if (Entry->Id != NULL) {
39 FreePool ((CHAR8 *)Entry->Id);
40 }
41
42 if (Entry->Name != NULL) {
43 FreePool ((CHAR8 *)Entry->Name);
44 }
45
46 if (Entry->Path != NULL) {
47 FreePool ((CHAR8 *)Entry->Path);
48 }
49
50 if (Entry->Arguments != NULL) {
51 FreePool ((CHAR8 *)Entry->Arguments);
52 }
53
54 if (Entry->UnmanagedDevicePath != NULL) {
55 FreePool (Entry->UnmanagedDevicePath);
56 }
57}
58
59STATIC
60VOID
61EFIAPI
63 IN OC_PICKER_ENTRY **Entries,
64 IN UINTN NumEntries
65 )
66{
67 UINTN Index;
68
69 ASSERT (Entries != NULL);
70 ASSERT (*Entries != NULL);
71 if ((Entries == NULL) || (*Entries == NULL)) {
72 return;
73 }
74
75 for (Index = 0; Index < NumEntries; Index++) {
76 InternalFreePickerEntry (&(*Entries)[Index]);
77 }
78
79 FreePool (*Entries);
80 *Entries = NULL;
81}
82
83STATIC
84EFI_STATUS
86 OC_FLEX_ARRAY *FlexPickerEntries,
87 CHAR16 *Description,
88 EFI_HANDLE Handle,
89 CHAR16 *HttpBootUri,
90 BOOLEAN IsIPv4,
91 BOOLEAN IsHttpBoot
92 )
93{
94 EFI_STATUS Status;
95 OC_PICKER_ENTRY *PickerEntry;
96 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
97 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
98 UINTN IdLen;
99
100 Status = gBS->HandleProtocol (
101 Handle,
103 (VOID **)&DevicePath
104 );
105 if (EFI_ERROR (Status)) {
106 DEBUG ((
107 DEBUG_INFO,
108 "NETB: Missing device path - %r\n",
109 Status
110 ));
111 return Status;
112 }
113
114 PickerEntry = OcFlexArrayAddItem (FlexPickerEntries);
115 if (PickerEntry == NULL) {
116 return EFI_OUT_OF_RESOURCES;
117 }
118
119 IdLen = StrLen (Description);
120 PickerEntry->Id = AllocatePool ((IdLen + 1) * sizeof (PickerEntry->Id[0]));
121 if (PickerEntry->Id == NULL) {
122 return EFI_OUT_OF_RESOURCES;
123 }
124
125 UnicodeStrToAsciiStrS (Description, (CHAR8 *)PickerEntry->Id, IdLen + 1);
126
127 PickerEntry->Name = AllocateCopyPool (IdLen + 1, PickerEntry->Id);
128 if (PickerEntry->Name == NULL) {
129 return EFI_OUT_OF_RESOURCES;
130 }
131
132 if (IsHttpBoot && (HttpBootUri != NULL)) {
133 Status = HttpBootAddUri (DevicePath, HttpBootUri, OcStringFormatUnicode, &NewDevicePath);
134 if (EFI_ERROR (Status)) {
135 return Status;
136 }
137 } else {
138 NewDevicePath = DuplicateDevicePath (DevicePath);
139 if (NewDevicePath == NULL) {
140 return EFI_OUT_OF_RESOURCES;
141 }
142 }
143
144 PickerEntry->UnmanagedDevicePath = NewDevicePath;
145
146 if (IsHttpBoot) {
147 PickerEntry->CustomRead = HttpBootCustomRead;
148 PickerEntry->CustomFree = HttpBootCustomFree;
149 PickerEntry->Flavour = IsIPv4 ? OC_FLAVOUR_HTTP_BOOT4 : OC_FLAVOUR_HTTP_BOOT6;
150 } else {
151 PickerEntry->CustomRead = PxeBootCustomRead;
152 PickerEntry->Flavour = IsIPv4 ? OC_FLAVOUR_PXE_BOOT4 : OC_FLAVOUR_PXE_BOOT6;
153 }
154
155 PickerEntry->TextMode = TRUE;
156 PickerEntry->Auxiliary = mAuxEntries;
157
158 return EFI_SUCCESS;
159}
160
161STATIC
162EFI_STATUS
163EFIAPI
165 IN OUT OC_PICKER_CONTEXT *PickerContext,
166 IN CONST EFI_HANDLE Device OPTIONAL,
167 OUT OC_PICKER_ENTRY **Entries,
168 OUT UINTN *NumEntries
169 )
170{
171 EFI_STATUS Status;
172 UINTN HandleCount;
173 EFI_HANDLE *HandleBuffer;
174 UINTN Index;
175 CHAR16 *NetworkDescription;
176 CHAR16 *IdStr;
177 OC_FLEX_ARRAY *FlexPickerEntries;
178 BOOLEAN IsIPv4;
179 BOOLEAN IsHttpBoot;
180
181 //
182 // Here we produce custom entries only, not entries found on filesystems.
183 //
184 if (Device != NULL) {
185 return EFI_NOT_FOUND;
186 }
187
188 Status = gBS->LocateHandleBuffer (
189 ByProtocol,
190 &gEfiLoadFileProtocolGuid,
191 NULL,
192 &HandleCount,
193 &HandleBuffer
194 );
195
196 if (EFI_ERROR (Status)) {
197 DEBUG ((DEBUG_INFO, "NETB: Load file protocol - %r\n", Status));
198 return Status;
199 }
200
202 if (FlexPickerEntries == NULL) {
203 return EFI_OUT_OF_RESOURCES;
204 }
205
206 for (Index = 0; Index < HandleCount; ++Index) {
207 NetworkDescription = BmGetNetworkDescription (HandleBuffer[Index]);
208 if (NetworkDescription == NULL) {
209 DebugPrintDevicePathForHandle (DEBUG_INFO, "NETB: LoadFile handle not PXE/HTTP boot DP", HandleBuffer[Index]);
210 } else {
211 //
212 // Use fixed format network description which we control as shortcut
213 // to identify PXE/HTTP and IPv4/6.
214 //
215 if ((IdStr = StrStr (NetworkDescription, PxeBootId)) != NULL) {
216 IsIPv4 = IdStr[L_STR_LEN (PxeBootId)] == L'4';
217 ASSERT (IsIPv4 || (IdStr[L_STR_LEN (PxeBootId)] == L'6'));
218 IsHttpBoot = FALSE;
219 } else if ((IdStr = StrStr (NetworkDescription, HttpBootId)) != NULL) {
220 IsIPv4 = IdStr[L_STR_LEN (HttpBootId)] == L'4';
221 ASSERT (IsIPv4 || (IdStr[L_STR_LEN (HttpBootId)] == L'6'));
222 IsHttpBoot = TRUE;
223 }
224
225 if ( (IdStr != NULL)
226 && ((IsIPv4 && mAllowIpv4) || (!IsIPv4 && mAllowIpv6))
227 && ((IsHttpBoot && mAllowHttpBoot) || (!IsHttpBoot && mAllowPxeBoot))
228 )
229 {
230 DEBUG ((DEBUG_INFO, "NETB: Adding %s\n", NetworkDescription));
231 Status = InternalAddEntry (
232 FlexPickerEntries,
233 NetworkDescription,
234 HandleBuffer[Index],
235 IsHttpBoot ? mHttpBootUri : NULL,
236 IsIPv4,
237 IsHttpBoot
238 );
239 } else {
240 DEBUG ((DEBUG_INFO, "NETB: Ignoring %s\n", NetworkDescription));
241 }
242
243 FreePool (NetworkDescription);
244 }
245
246 if (EFI_ERROR (Status)) {
247 break;
248 }
249 }
250
251 FreePool (HandleBuffer);
252
253 if (EFI_ERROR (Status)) {
254 OcFlexArrayFree (&FlexPickerEntries);
255 return Status;
256 }
257
258 OcFlexArrayFreeContainer (&FlexPickerEntries, (VOID **)Entries, NumEntries);
259
260 if (*NumEntries == 0) {
261 return EFI_NOT_FOUND;
262 }
263
264 return EFI_SUCCESS;
265}
266
267STATIC
268EFI_STATUS
270 OC_FLEX_ARRAY *ParsedLoadOptions
271 )
272{
273 EFI_STATUS Status;
274 UINTN Index;
275 OC_PARSED_VAR *Option;
276 EFI_GUID *OwnerGuid;
277 UINTN CertSize;
278 CHAR8 *CertData;
279 BOOLEAN EnrollCert;
280 BOOLEAN DeleteCert;
281 BOOLEAN DeleteAllCerts;
282 UINTN OptionLen;
283 UINTN DeletedCount;
284
285 Status = EFI_SUCCESS;
286
287 //
288 // Find certs in options.
289 //
290 for (Index = 0; Index < ParsedLoadOptions->Count; ++Index) {
291 Option = OcFlexArrayItemAt (ParsedLoadOptions, Index);
292
293 EnrollCert = FALSE;
294 DeleteCert = FALSE;
295 DeleteAllCerts = FALSE;
296
297 if (OcUnicodeStartsWith (Option->Unicode.Name, ENROLL_CERT, TRUE)) {
298 EnrollCert = TRUE;
299 OptionLen = L_STR_LEN (ENROLL_CERT);
300 } else if (OcUnicodeStartsWith (Option->Unicode.Name, DELETE_CERT, TRUE)) {
301 DeleteCert = TRUE;
302 OptionLen = L_STR_LEN (DELETE_CERT);
303 } else if (OcUnicodeStartsWith (Option->Unicode.Name, DELETE_ALL_CERTS, TRUE)) {
304 DeleteAllCerts = TRUE;
305 OptionLen = L_STR_LEN (DELETE_ALL_CERTS);
306 }
307
308 if ( (EnrollCert || DeleteCert || DeleteAllCerts)
309 && (Option->Unicode.Name[OptionLen] != CHAR_NULL)
310 && (Option->Unicode.Name[OptionLen] != L':')
311 )
312 {
313 EnrollCert = FALSE;
314 DeleteCert = FALSE;
315 DeleteAllCerts = FALSE;
316 }
317
318 if ((EnrollCert || DeleteCert) && (Option->Unicode.Value == NULL)) {
319 DEBUG ((DEBUG_INFO, "NETB: Ignoring %s option with no cert value\n", Option->Unicode.Name));
320 EnrollCert = FALSE;
321 DeleteCert = FALSE;
322 }
323
324 if (EnrollCert || DeleteCert || DeleteAllCerts) {
325 OwnerGuid = AllocateZeroPool (sizeof (EFI_GUID));
326 if (OwnerGuid == NULL) {
327 Status = EFI_OUT_OF_RESOURCES;
328 break;
329 }
330
331 //
332 // Use all zeros GUID if no user value supplied.
333 //
334 if (Option->Unicode.Name[OptionLen] == L':') {
335 Status = StrToGuid (&Option->Unicode.Name[OptionLen + 1], OwnerGuid);
336 if (EFI_ERROR (Status)) {
337 DEBUG ((DEBUG_WARN, "NETB: Cannot parse cert owner GUID from %s - %r\n", Option->Unicode.Name, Status));
338 break;
339 }
340 }
341
342 if (DeleteAllCerts) {
343 Status = DeleteCertsForOwner (
344 EFI_TLS_CA_CERTIFICATE_VARIABLE,
345 &gEfiTlsCaCertificateGuid,
346 OwnerGuid,
347 0,
348 NULL,
349 &DeletedCount
350 );
351 DEBUG ((DEBUG_INFO, "NETB: %s %u deleted - %r\n", Option->Unicode.Name, DeletedCount, Status));
352 } else {
353 //
354 // We do not include the terminating '\0' in the stored certificate,
355 // which matches how stored by e.g. OVMF when loaded from file;
356 // but we must allocate space for '\0' for Unicode to ASCII conversion.
357 //
358 CertSize = StrLen (Option->Unicode.Value);
359 CertData = AllocateZeroPool (CertSize + 1);
360 if (CertData == NULL) {
361 Status = EFI_OUT_OF_RESOURCES;
362 break;
363 }
364
365 UnicodeStrToAsciiStrS (Option->Unicode.Value, CertData, CertSize + 1);
366
367 if (DeleteCert) {
368 Status = DeleteCertsForOwner (
369 EFI_TLS_CA_CERTIFICATE_VARIABLE,
370 &gEfiTlsCaCertificateGuid,
371 OwnerGuid,
372 CertSize,
373 CertData,
374 &DeletedCount
375 );
376 DEBUG ((DEBUG_INFO, "NETB: %s %u deleted - %r\n", Option->Unicode.Name, DeletedCount, Status));
377 } else {
378 Status = CertIsPresent (
379 EFI_TLS_CA_CERTIFICATE_VARIABLE,
380 &gEfiTlsCaCertificateGuid,
381 OwnerGuid,
382 CertSize,
383 CertData
384 );
385 if (EFI_ERROR (Status)) {
386 if (Status == EFI_ALREADY_STARTED) {
387 DEBUG ((DEBUG_INFO, "NETB: %s already present\n", Option->Unicode.Name));
388 Status = EFI_SUCCESS;
389 } else {
390 DEBUG ((DEBUG_INFO, "NETB: Error checking for cert presence - %r\n", Status));
391 }
392 } else {
393 Status = EnrollX509toVariable (
394 EFI_TLS_CA_CERTIFICATE_VARIABLE,
395 &gEfiTlsCaCertificateGuid,
396 OwnerGuid,
397 CertSize,
398 CertData
399 );
400 DEBUG ((DEBUG_INFO, "NETB: %s - %r\n", Option->Unicode.Name, Status));
401 }
402 }
403
404 FreePool (CertData);
405 }
406
407 FreePool (OwnerGuid);
408
409 if (EFI_ERROR (Status)) {
410 break;
411 }
412 }
413 }
414
415 return Status;
416}
417
418STATIC
426
427EFI_STATUS
428EFIAPI
430 IN EFI_HANDLE ImageHandle,
431 IN EFI_SYSTEM_TABLE *SystemTable
432 )
433{
434 EFI_STATUS Status;
435 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
436 OC_FLEX_ARRAY *ParsedLoadOptions;
437 CHAR16 *TempUri;
438
439 Status = gBS->HandleProtocol (
440 ImageHandle,
442 (VOID **)&LoadedImage
443 );
444 if (EFI_ERROR (Status)) {
445 return Status;
446 }
447
448 mAllowIpv4 = FALSE;
449 mAllowIpv6 = FALSE;
450 mAllowPxeBoot = FALSE;
451 mAllowHttpBoot = FALSE;
452 gRequireHttpsUri = FALSE;
453 mHttpBootUri = NULL;
454
455 Status = OcParseLoadOptions (LoadedImage, &ParsedLoadOptions);
456 if (EFI_ERROR (Status)) {
457 if (Status != EFI_NOT_FOUND) {
458 return Status;
459 }
460
461 Status = EFI_SUCCESS;
462 } else {
463 //
464 // e.g. --https --uri=https://imageserver.org/OpenShell.efi
465 //
466 mAllowIpv4 = OcHasParsedVar (ParsedLoadOptions, L"ipv4", OcStringFormatUnicode);
467 mAllowIpv6 = OcHasParsedVar (ParsedLoadOptions, L"ipv6", OcStringFormatUnicode);
468 mAllowPxeBoot = OcHasParsedVar (ParsedLoadOptions, L"pxe", OcStringFormatUnicode);
469 mAllowHttpBoot = OcHasParsedVar (ParsedLoadOptions, L"http", OcStringFormatUnicode);
470 mAuxEntries = OcHasParsedVar (ParsedLoadOptions, L"aux", OcStringFormatUnicode);
471 gRequireHttpsUri = OcHasParsedVar (ParsedLoadOptions, L"https", OcStringFormatUnicode);
472
473 TempUri = NULL;
474 OcParsedVarsGetUnicodeStr (ParsedLoadOptions, L"uri", &TempUri);
475 if (TempUri != NULL) {
476 mHttpBootUri = AllocateCopyPool (StrSize (TempUri), TempUri);
477 if (mHttpBootUri == NULL) {
478 Status = EFI_OUT_OF_RESOURCES;
479 }
480 }
481
482 if (!EFI_ERROR (Status)) {
483 Status = EnrollCerts (ParsedLoadOptions);
484 if (EFI_ERROR (Status)) {
485 DEBUG ((DEBUG_WARN, "NETB: Failed to enroll certs - %r\n", Status));
486 }
487
488 DEBUG_CODE_BEGIN ();
489 LogInstalledCerts (EFI_TLS_CA_CERTIFICATE_VARIABLE, &gEfiTlsCaCertificateGuid);
490 DEBUG_CODE_END ();
491 }
492
493 if (!EFI_ERROR (Status)) {
494 Status = AddRemoveStaticIPs (ParsedLoadOptions);
495 if (EFI_ERROR (Status)) {
496 DEBUG ((DEBUG_WARN, "NETB: Failed to update static IPs - %r\n", Status));
497 }
498 }
499 }
500
501 if (!EFI_ERROR (Status)) {
502 if (!mAllowIpv4 && !mAllowIpv6) {
503 mAllowIpv4 = TRUE;
504 mAllowIpv6 = TRUE;
505 }
506
508 mAllowHttpBoot = TRUE;
509 mAllowPxeBoot = TRUE;
510 }
511
512 if (gRequireHttpsUri) {
513 mAllowHttpBoot = TRUE;
514 }
515
516 if (mHttpBootUri != NULL) {
517 if (!mAllowHttpBoot) {
518 DEBUG ((DEBUG_INFO, "NETB: URI specified but HTTP boot is disabled\n"));
519 } else {
521 DEBUG ((DEBUG_WARN, "NETB: Invalid URI https:// is required\n"));
522 mAllowHttpBoot = FALSE;
523 }
524 }
525 }
526
527 Status = gBS->InstallMultipleProtocolInterfaces (
528 &ImageHandle,
531 NULL
532 );
533 }
534
535 if (ParsedLoadOptions != NULL) {
536 OcFlexArrayFree (&ParsedLoadOptions);
537 }
538
539 if (EFI_ERROR (Status) && (mHttpBootUri != NULL)) {
540 FreePool (mHttpBootUri);
541 }
542
543 return Status;
544}
CHAR16 * BmGetNetworkDescription(IN EFI_HANDLE Handle)
EFI_STATUS EFIAPI PxeBootCustomRead(IN OC_STORAGE_CONTEXT *Storage, IN OC_BOOT_ENTRY *ChosenEntry, OUT VOID **Data, OUT UINT32 *DataSize, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN OC_DMG_LOADING_SUPPORT DmgLoading, OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext, OUT VOID **Context)
EFI_STATUS EFIAPI HttpBootCustomRead(IN OC_STORAGE_CONTEXT *Storage, IN OC_BOOT_ENTRY *ChosenEntry, OUT VOID **Data, OUT UINT32 *DataSize, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN OC_DMG_LOADING_SUPPORT DmgLoading, OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext, OUT VOID **Context)
EFI_STATUS EFIAPI HttpBootCustomFree(IN VOID *Context)
EFI_STATUS LogInstalledCerts(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid)
EFI_STATUS AddRemoveStaticIPs(OC_FLEX_ARRAY *ParsedLoadOptions)
Definition StaticIp4.c:142
EFI_STATUS EnrollX509toVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data)
EFI_STATUS DeleteCertsForOwner(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data, OUT UINTN *DeletedCount)
EFI_STATUS HttpBootAddUri(EFI_DEVICE_PATH_PROTOCOL *DevicePath, VOID *Uri, OC_STRING_FORMAT StringFormat, EFI_DEVICE_PATH_PROTOCOL **UriDevicePath)
Definition Uri.c:231
EFI_STATUS CertIsPresent(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data)
BOOLEAN HasHttpsUri(CHAR16 *Uri)
Definition Uri.c:20
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
Definition OcBootEntry.h:31
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
#define OC_FLAVOUR_HTTP_BOOT6
BOOLEAN OcHasParsedVar(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, IN CONST OC_STRING_FORMAT StringFormat)
BOOLEAN OcParsedVarsGetUnicodeStr(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST CHAR16 *Name, OUT CHAR16 **StrValue)
#define OC_FLAVOUR_PXE_BOOT6
#define OC_FLAVOUR_HTTP_BOOT4
#define OC_FLAVOUR_PXE_BOOT4
EFI_BOOT_SERVICES * gBS
VOID DebugPrintDevicePathForHandle(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_HANDLE Handle OPTIONAL)
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
Definition FlexArray.c:31
VOID(* OC_FLEX_ARRAY_FREE_ITEM)(IN VOID *Item)
VOID OcFlexArrayFreeContainer(IN OUT OC_FLEX_ARRAY **FlexArray, IN OUT VOID **Items, IN OUT UINTN *Count)
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
Definition FlexArray.c:136
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
Definition FlexArray.c:189
#define L_STR_LEN(String)
Definition OcStringLib.h:26
@ OcStringFormatUnicode
Definition OcStringLib.h:51
BOOLEAN EFIAPI OcUnicodeStartsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
STATIC BOOLEAN mAllowIpv4
#define ENROLL_CERT
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_STATUS EnrollCerts(OC_FLEX_ARRAY *ParsedLoadOptions)
STATIC VOID InternalFreePickerEntry(IN OC_PICKER_ENTRY *Entry)
STATIC OC_BOOT_ENTRY_PROTOCOL mNetworkBootEntryProtocol
#define DELETE_ALL_CERTS
#define DELETE_CERT
STATIC CHAR16 * mHttpBootUri
STATIC CHAR16 HttpBootId[]
STATIC BOOLEAN mAllowIpv6
STATIC VOID EFIAPI FreeNetworkBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
STATIC BOOLEAN mAllowPxeBoot
STATIC BOOLEAN mAllowHttpBoot
STATIC EFI_STATUS InternalAddEntry(OC_FLEX_ARRAY *FlexPickerEntries, CHAR16 *Description, EFI_HANDLE Handle, CHAR16 *HttpBootUri, BOOLEAN IsIPv4, BOOLEAN IsHttpBoot)
STATIC EFI_STATUS EFIAPI GetNetworkBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
STATIC CHAR16 PxeBootId[]
STATIC BOOLEAN mAuxEntries
BOOLEAN gRequireHttpsUri
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
#define ASSERT(x)
Definition coder.h:55
OC_CUSTOM_READ CustomRead
EFI_DEVICE_PATH_PROTOCOL * UnmanagedDevicePath
OC_CUSTOM_FREE CustomFree
OC_PARSED_VAR_UNICODE Unicode