OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcVariableRuntimeLib.c
Go to the documentation of this file.
1
8#include <Library/BaseLib.h>
9#include <Library/DebugLib.h>
10#include <Library/MemoryAllocationLib.h>
11#include <Library/OcFileLib.h>
14#include <Library/UefiBootServicesTableLib.h>
15#include <Library/UefiRuntimeServicesTableLib.h>
16
18
19#define BASE64_CHUNK_SIZE (52)
20#define NVRAM_PLIST_MAX_SIZE (BASE_1MB)
21
22typedef struct {
23 UINT8 *DataBuffer;
29 OC_NVRAM_LEGACY_ENTRY *SchemaEntry;
30 EFI_STATUS Status;
32
36#define OC_NVRAM_STORAGE_VERSION 1
37
41#define OC_NVRAM_STORAGE_MAP_FIELDS(_, __) \
42 OC_MAP (OC_STRING, OC_ASSOC, _, __)
43OC_DECLARE (OC_NVRAM_STORAGE_MAP)
44
45#define OC_NVRAM_STORAGE_FIELDS(_, __) \
46 _(UINT32 , Version , , 0 , () ) \
47 _(OC_NVRAM_STORAGE_MAP , Add , , OC_CONSTR (OC_NVRAM_STORAGE_MAP, _, __) , OC_DESTR (OC_NVRAM_STORAGE_MAP))
48OC_DECLARE (OC_NVRAM_STORAGE)
49
50OC_MAP_STRUCTORS (OC_NVRAM_STORAGE_MAP)
51OC_STRUCTORS (OC_NVRAM_STORAGE, ())
52
53
56STATIC
59
60STATIC
63
64STATIC
67 OC_SCHEMA_MAP_IN ("Add", OC_NVRAM_STORAGE, Add, &mNvramStorageAddSchema),
68 OC_SCHEMA_INTEGER_IN ("Version", OC_NVRAM_STORAGE, Version),
69};
70
71STATIC
76
77STATIC
80
81STATIC
82OC_NVRAM_LEGACY_MAP
83*mLegacyMap = NULL;
84
85STATIC
86EFI_STATUS
88 OUT EFI_FILE_PROTOCOL **NvramDir
89 )
90{
91 EFI_STATUS Status;
92 EFI_FILE_PROTOCOL *Root;
93
94 if ((mStorageContext == NULL) || (mLegacyMap == NULL)) {
95 return EFI_NOT_READY;
96 }
97
98 if (mStorageContext->FileSystem == NULL) {
99 return EFI_NOT_FOUND;
100 }
101
102 Status = mStorageContext->FileSystem->OpenVolume (mStorageContext->FileSystem, &Root);
103 if (EFI_ERROR (Status)) {
104 return EFI_NOT_FOUND;
105 }
106
107 Status = OcSafeFileOpen (
108 Root,
109 NvramDir,
111 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
112 EFI_FILE_DIRECTORY
113 );
114
115 return Status;
116}
117
118STATIC
119EFI_STATUS
120EFIAPI
122 IN OC_STORAGE_CONTEXT *StorageContext,
123 IN OC_NVRAM_LEGACY_MAP *LegacyMap,
124 IN BOOLEAN LegacyOverwrite
125 )
126{
127 EFI_STATUS Status;
128 EFI_FILE_PROTOCOL *NvramDir;
129 UINT8 *FileBuffer;
130 UINT32 FileSize;
131 BOOLEAN IsValid;
132 OC_NVRAM_STORAGE NvramStorage;
133 UINT32 GuidIndex;
134 UINT32 VariableIndex;
135 GUID VariableGuid;
136 OC_ASSOC *VariableMap;
137 OC_NVRAM_LEGACY_ENTRY *SchemaEntry;
138
139 if ((mStorageContext != NULL) || (mLegacyMap != NULL)) {
140 return EFI_ALREADY_STARTED;
141 }
142
143 if ((StorageContext == NULL) || (LegacyMap == NULL)) {
144 return EFI_INVALID_PARAMETER;
145 }
146
147 mStorageContext = StorageContext;
148 mLegacyMap = LegacyMap;
149
150 Status = LocateNvramDir (&NvramDir);
151 if (EFI_ERROR (Status)) {
152 return Status;
153 }
154
155 FileBuffer = OcReadFileFromDirectory (NvramDir, OPEN_CORE_NVRAM_FILENAME, &FileSize, NVRAM_PLIST_MAX_SIZE);
156 if (FileBuffer == NULL) {
158 }
159
160 NvramDir->Close (NvramDir);
161 if (FileBuffer == NULL) {
162 return EFI_NOT_FOUND;
163 }
164
165 OC_NVRAM_STORAGE_CONSTRUCT (&NvramStorage, sizeof (NvramStorage));
166 IsValid = ParseSerialized (&NvramStorage, &mNvramStorageRootSchema, FileBuffer, FileSize, NULL);
167 FreePool (FileBuffer);
168
169 if (!IsValid) {
170 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage, sizeof (NvramStorage));
171 return EFI_UNSUPPORTED;
172 }
173
174 if (NvramStorage.Version != OC_NVRAM_STORAGE_VERSION) {
175 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage, sizeof (NvramStorage));
176 return EFI_UNSUPPORTED;
177 }
178
179 for (GuidIndex = 0; GuidIndex < NvramStorage.Add.Count; ++GuidIndex) {
180 Status = OcProcessVariableGuid (
181 OC_BLOB_GET (NvramStorage.Add.Keys[GuidIndex]),
182 &VariableGuid,
184 &SchemaEntry
185 );
186
187 if (EFI_ERROR (Status)) {
188 continue;
189 }
190
191 VariableMap = NvramStorage.Add.Values[GuidIndex];
192
193 //
194 // Note 1: LegacyOverwrite remains useful here, even though we know we are writing to
195 // emulated NVRAM which 'starts off empty'; both for any variables set by the emulated
196 // NVRAM driver itself, and for those set by any part of OpenDuet when that is in use.
197 //
198 // Note 2: If we obey WriteFlash here, then when it is TRUE the SaveNvram method fails
199 // to save anything to nvram.plist, since everything is marked volatile. As we are in a
200 // context where emulated NVRAM must be present, we always write non-volatile here.
201 // (This issue was only not relevant prior to implementation of the emulated NVRAM
202 // protocol because the previous and current scripts for saving NVRAM variables from
203 // within macOS do not check whether the variables they are saving are non-volatile.)
204 //
205 for (VariableIndex = 0; VariableIndex < VariableMap->Count; ++VariableIndex) {
207 OC_BLOB_GET (VariableMap->Keys[VariableIndex]),
208 &VariableGuid,
210 VariableMap->Values[VariableIndex]->Size,
211 OC_BLOB_GET (VariableMap->Values[VariableIndex]),
212 SchemaEntry,
213 LegacyOverwrite
214 );
215 }
216 }
217
218 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage, sizeof (NvramStorage));
219
220 return EFI_SUCCESS;
221}
222
223STATIC
224EFI_STATUS
226 IN EFI_FILE_PROTOCOL *Directory,
227 IN CONST CHAR16 *FileName
228 )
229{
230 EFI_STATUS Status;
231
232 Status = OcDeleteFile (Directory, FileName);
233 if (EFI_ERROR (Status)) {
234 if (Status == EFI_NOT_FOUND) {
235 Status = EFI_SUCCESS;
236 }
237 }
238
239 return Status;
240}
241
242//
243// Serialize one section at a time, NVRAM scan per section.
244//
245STATIC
247EFIAPI
249 IN EFI_GUID *Guid,
250 IN CHAR16 *Name,
251 IN VOID *Context
252 )
253{
254 EFI_STATUS Status;
255 NVRAM_SAVE_CONTEXT *SaveContext;
256 UINT32 Attributes;
257 UINTN DataSize;
258 UINTN Base64Size;
259 UINTN Base64Pos;
260
261 ASSERT (Context != NULL);
262 SaveContext = Context;
263
264 if (!CompareGuid (Guid, &SaveContext->SectionGuid)) {
266 }
267
268 if (!OcVariableIsAllowedBySchemaEntry (SaveContext->SchemaEntry, Guid, Name, OcStringFormatUnicode)) {
270 }
271
272 do {
273 DataSize = SaveContext->DataBufferSize;
274 Status = gRT->GetVariable (
275 Name,
276 Guid,
277 &Attributes,
278 &DataSize,
279 SaveContext->DataBuffer
280 );
281 if (Status == EFI_BUFFER_TOO_SMALL) {
282 while (DataSize > SaveContext->DataBufferSize) {
283 if (BaseOverflowMulUN (SaveContext->DataBufferSize, 2, &SaveContext->DataBufferSize)) {
284 SaveContext->Status = EFI_OUT_OF_RESOURCES;
286 }
287 }
288
289 FreePool (SaveContext->DataBuffer);
290 SaveContext->DataBuffer = AllocatePool (SaveContext->DataBufferSize);
291 if (SaveContext->DataBuffer == NULL) {
292 SaveContext->Status = EFI_OUT_OF_RESOURCES;
294 }
295 }
296 } while (Status == EFI_BUFFER_TOO_SMALL);
297
298 if (EFI_ERROR (Status)) {
299 SaveContext->Status = Status;
301 }
302
303 //
304 // Only save non-volatile variables; also, match launchd script and only save
305 // variables which it can save, i.e. runtime accessible.
306 //
307 if ( ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)
308 || ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0))
309 {
310 DEBUG ((DEBUG_VERBOSE, "NVRAM %g:%s skipped w/ attributes 0x%X\n", Guid, Name, Attributes));
312 }
313
314 Base64Size = 0;
315 Base64Encode (SaveContext->DataBuffer, DataSize, NULL, &Base64Size);
316 if (Base64Size > SaveContext->Base64BufferSize) {
317 while (Base64Size > SaveContext->Base64BufferSize) {
318 if (BaseOverflowMulUN (SaveContext->Base64BufferSize, 2, &SaveContext->Base64BufferSize)) {
319 SaveContext->Status = EFI_OUT_OF_RESOURCES;
321 }
322 }
323
324 FreePool (SaveContext->Base64Buffer);
325 SaveContext->Base64Buffer = AllocatePool (SaveContext->Base64BufferSize);
326 if (SaveContext->Base64Buffer == NULL) {
327 SaveContext->Status = EFI_OUT_OF_RESOURCES;
329 }
330 }
331
332 Base64Encode (SaveContext->DataBuffer, DataSize, SaveContext->Base64Buffer, &Base64Size);
333
334 //
335 // %c works around BasePrintLibSPrintMarker converting \n to \r\n.
336 //
338 SaveContext->StringBuffer,
339 "\t\t\t<key>%s</key>%c"
340 "\t\t\t<data>%c",
341 Name,
342 '\n',
343 '\n'
344 );
345 if (EFI_ERROR (Status)) {
346 SaveContext->Status = Status;
348 }
349
350 for (Base64Pos = 0; Base64Pos < (Base64Size - 1); Base64Pos += BASE64_CHUNK_SIZE) {
352 SaveContext->StringBuffer,
353 "\t\t\t"
354 );
355 if (EFI_ERROR (Status)) {
356 SaveContext->Status = Status;
358 }
359
361 SaveContext->StringBuffer,
362 &SaveContext->Base64Buffer[Base64Pos],
364 );
365 if (EFI_ERROR (Status)) {
366 SaveContext->Status = Status;
368 }
369
371 SaveContext->StringBuffer,
372 "\n"
373 );
374 if (EFI_ERROR (Status)) {
375 SaveContext->Status = Status;
377 }
378 }
379
381 SaveContext->StringBuffer,
382 "\t\t\t</data>\n"
383 );
384 if (EFI_ERROR (Status)) {
385 SaveContext->Status = Status;
387 }
388
390}
391
392STATIC
393EFI_STATUS
394EFIAPI
396 VOID
397 )
398{
399 EFI_STATUS Status;
400 EFI_FILE_PROTOCOL *NvramDir;
401 UINT32 GuidIndex;
402 NVRAM_SAVE_CONTEXT Context;
403
404 Status = LocateNvramDir (&NvramDir);
405 if (EFI_ERROR (Status)) {
406 return Status;
407 }
408
409 Context.Status = EFI_SUCCESS;
410
411 Context.DataBufferSize = BASE_1KB;
412 Context.DataBuffer = AllocatePool (Context.DataBufferSize);
413 if (Context.DataBuffer == NULL) {
414 NvramDir->Close (NvramDir);
415 return EFI_OUT_OF_RESOURCES;
416 }
417
418 Context.Base64BufferSize = BASE_1KB;
419 Context.Base64Buffer = AllocatePool (Context.Base64BufferSize);
420 if (Context.Base64Buffer == NULL) {
421 NvramDir->Close (NvramDir);
422 FreePool (Context.DataBuffer);
423 return EFI_OUT_OF_RESOURCES;
424 }
425
427 if (Context.StringBuffer == NULL) {
428 NvramDir->Close (NvramDir);
429 FreePool (Context.DataBuffer);
430 FreePool (Context.Base64Buffer);
431 return EFI_OUT_OF_RESOURCES;
432 }
433
435 Context.StringBuffer,
436 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
437 "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
438 "<plist version=\"1.0\">\n"
439 "<dict>\n"
440 "\t<key>Add</key>\n"
441 "\t<dict>\n"
442 );
443
444 if (EFI_ERROR (Status)) {
445 NvramDir->Close (NvramDir);
446 FreePool (Context.DataBuffer);
447 FreePool (Context.Base64Buffer);
449 return Status;
450 }
451
452 for (GuidIndex = 0; GuidIndex < mLegacyMap->Count; ++GuidIndex) {
453 Status = OcProcessVariableGuid (
454 OC_BLOB_GET (mLegacyMap->Keys[GuidIndex]),
455 &Context.SectionGuid,
457 &Context.SchemaEntry
458 );
459 if (EFI_ERROR (Status)) {
460 Status = EFI_SUCCESS;
461 continue;
462 }
463
465 Context.StringBuffer,
466 "\t\t<key>%g</key>%c"
467 "\t\t<dict>%c",
468 &Context.SectionGuid,
469 '\n',
470 '\n'
471 );
472 if (EFI_ERROR (Status)) {
473 break;
474 }
475
477 Status = Context.Status;
478 if (EFI_ERROR (Status)) {
479 break;
480 }
481
483 Context.StringBuffer,
484 "\t\t</dict>\n"
485 );
486 if (EFI_ERROR (Status)) {
487 break;
488 }
489 }
490
491 FreePool (Context.DataBuffer);
492 FreePool (Context.Base64Buffer);
493
494 if (!EFI_ERROR (Status)) {
496 Context.StringBuffer,
497 "\t</dict>%c"
498 "\t<key>Version</key>%c"
499 "\t<integer>%u</integer>%c"
500 "</dict>%c"
501 "</plist>%c",
502 '\n',
503 '\n',
505 '\n',
506 '\n',
507 '\n'
508 );
509 }
510
511 if (EFI_ERROR (Status)) {
512 NvramDir->Close (NvramDir);
514 return Status;
515 }
516
518 STATIC_ASSERT (NVRAM_PLIST_MAX_SIZE <= MAX_UINT32, "NVRAM_PLIST_MAX_SIZE must be less than or equal to UINT32_MAX");
520 Status = EFI_OUT_OF_RESOURCES;
521 } else {
522 Status = OcSetFileData (
523 NvramDir,
525 Context.StringBuffer->String,
526 (UINT32)Context.StringBuffer->StringLength
527 );
528 }
529
531 NvramDir->Close (NvramDir);
532
533 return Status;
534}
535
536STATIC
537EFI_STATUS
538EFIAPI
540 VOID
541 )
542{
543 EFI_STATUS Status;
544 EFI_STATUS AltStatus;
545 EFI_FILE_PROTOCOL *NvramDir;
546
547 Status = LocateNvramDir (&NvramDir);
548 if (EFI_ERROR (Status)) {
549 return Status;
550 }
551
552 Status = DeleteFile (NvramDir, OPEN_CORE_NVRAM_FILENAME);
553 AltStatus = DeleteFile (NvramDir, OPEN_CORE_NVRAM_FALLBACK_FILENAME);
554
555 NvramDir->Close (NvramDir);
556
557 return EFI_ERROR (Status) ? Status : AltStatus;
558}
559
560//
561// If Luanchd.command is installed this should correctly handle reboots during full or partial OTA updates.
562// When installing from USB we will likely go to the wrong OS after first reboot: the one in nvram.fallback,
563// if present (which might or might not be the drive we installed to); otherwise the empty NVRAM default OS
564// (likewise). Apart from needing to manually select that, at some point, the install should otherwise be correct.
565//
566STATIC
567EFI_STATUS
568EFIAPI
570 VOID
571 )
572{
573 EFI_STATUS Status;
574 EFI_FILE_PROTOCOL *NvramDir;
575 UINT8 *FileBuffer;
576 UINT32 FileSize;
577
578 Status = LocateNvramDir (&NvramDir);
579 if (EFI_ERROR (Status)) {
580 return Status;
581 }
582
583 //
584 // Given that this approach is designed to avoid continually displaying 'macOS Installer' option,
585 // we want to switch back to empty NVRAM defaults even if nvram.fallback does not exist, so we
586 // do not check that.
587 //
588 FileBuffer = OcReadFileFromDirectory (NvramDir, OPEN_CORE_NVRAM_FILENAME, &FileSize, NVRAM_PLIST_MAX_SIZE);
589 if (FileBuffer == NULL) {
590 NvramDir->Close (NvramDir);
591 return EFI_ALREADY_STARTED;
592 }
593
596 Status = OcSetFileData (
597 NvramDir,
599 FileBuffer,
600 FileSize
601 );
602
603 NvramDir->Close (NvramDir);
604 FreePool (FileBuffer);
605
606 return Status;
607}
608
609STATIC
618
619EFI_STATUS
620EFIAPI
622 IN EFI_HANDLE ImageHandle,
623 IN EFI_SYSTEM_TABLE *SystemTable
624 )
625{
626 return gBS->InstallMultipleProtocolInterfaces (
627 &ImageHandle,
630 NULL
631 );
632}
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
UINT32 Version
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_BOOT_SERVICES * gBS
VOID * OcReadFileFromDirectory(IN CONST EFI_FILE_PROTOCOL *RootDirectory, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN UINT32 MaxFileSize OPTIONAL)
Definition ReadFile.c:155
EFI_STATUS OcDeleteFile(IN EFI_FILE_PROTOCOL *Directory, IN CONST CHAR16 *FileName)
Definition FileMisc.c:49
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
Definition OpenFile.c:29
EFI_STATUS OcAsciiStringBufferAppendN(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString, OPTIONAL IN CONST UINTN Length)
EFI_STATUS OcAsciiStringBufferAppend(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString OPTIONAL)
EFI_STATUS EFIAPI OcAsciiStringBufferSPrint(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *FormatString,...)
OC_ASCII_STRING_BUFFER * OcAsciiStringBufferInit(VOID)
VOID OcAsciiStringBufferFree(IN OUT OC_ASCII_STRING_BUFFER **StringBuffer)
#define OC_SCHEMA_MAP(Name, ChildSchema)
#define OC_SCHEMA_MAP_IN(Name, Type, Field, ChildSchema)
#define OC_SCHEMA_MDATA(Name)
BOOLEAN ParseSerialized(OUT VOID *Serialized, IN OC_SCHEMA_INFO *RootSchema, IN VOID *PlistBuffer, IN UINT32 PlistSize, IN OUT UINT32 *ErrorCount OPTIONAL)
#define OC_SCHEMA_INTEGER_IN(Name, Type, Field)
@ OcStringFormatUnicode
Definition OcStringLib.h:51
#define OC_STRUCTORS(Name, Destructor)
#define OC_MAP_STRUCTORS(Name)
#define OC_DECLARE(Name)
#define OC_BLOB_GET(Blob)
#define OPEN_CORE_NVRAM_ROOT_PATH
enum _OC_PROCESS_VARIABLE_RESULT OC_PROCESS_VARIABLE_RESULT
BOOLEAN OcVariableIsAllowedBySchemaEntry(IN OC_NVRAM_LEGACY_ENTRY *SchemaEntry, IN EFI_GUID *VariableGuid OPTIONAL, IN CONST VOID *VariableName, IN OC_STRING_FORMAT StringFormat)
VOID OcScanVariables(IN OC_PROCESS_VARIABLE ProcessVariable, IN VOID *Context)
VOID OcSetNvramVariable(IN CONST CHAR8 *AsciiVariableName, IN EFI_GUID *VariableGuid, IN UINT32 Attributes, IN UINT32 VariableSize, IN VOID *VariableData, IN OC_NVRAM_LEGACY_ENTRY *SchemaEntry OPTIONAL, IN BOOLEAN Overwrite)
EFI_STATUS OcProcessVariableGuid(IN CONST CHAR8 *AsciiVariableGuid, OUT GUID *VariableGuid, IN OC_NVRAM_LEGACY_MAP *Schema OPTIONAL, OUT OC_NVRAM_LEGACY_ENTRY **SchemaEntry OPTIONAL)
#define OPEN_CORE_NVRAM_NV_ATTR
#define OPEN_CORE_NVRAM_FILENAME
@ OcProcessVariableContinue
@ OcProcessVariableAbort
#define OPEN_CORE_NVRAM_FALLBACK_FILENAME
#define OPEN_CORE_NVRAM_USED_FILENAME
EFI_GUID gOcVariableRuntimeProtocolGuid
#define OC_VARIABLE_RUNTIME_PROTOCOL_REVISION
STATIC EFI_STATUS EFIAPI LoadNvram(IN OC_STORAGE_CONTEXT *StorageContext, IN OC_NVRAM_LEGACY_MAP *LegacyMap, IN BOOLEAN LegacyOverwrite)
#define OC_NVRAM_STORAGE_VERSION
#define BASE64_CHUNK_SIZE
STATIC EFI_STATUS EFIAPI SwitchToFallback(VOID)
STATIC OC_SCHEMA mNvramStorageEntrySchema
STATIC OC_SCHEMA mNvramStorageAddSchema
STATIC OC_VARIABLE_RUNTIME_PROTOCOL mOcVariableRuntimeProtocol
STATIC EFI_STATUS EFIAPI ResetNvram(VOID)
STATIC EFI_STATUS DeleteFile(IN EFI_FILE_PROTOCOL *Directory, IN CONST CHAR16 *FileName)
STATIC EFI_STATUS LocateNvramDir(OUT EFI_FILE_PROTOCOL **NvramDir)
STATIC OC_PROCESS_VARIABLE_RESULT EFIAPI SerializeSectionVariables(IN EFI_GUID *Guid, IN CHAR16 *Name, IN VOID *Context)
STATIC EFI_STATUS EFIAPI SaveNvram(VOID)
STATIC OC_SCHEMA_INFO mNvramStorageRootSchema
STATIC OC_NVRAM_LEGACY_MAP * mLegacyMap
#define NVRAM_PLIST_MAX_SIZE
EFI_STATUS EFIAPI OcVariableRuntimeLibConstructor(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC OC_STORAGE_CONTEXT * mStorageContext
STATIC OC_SCHEMA mNvramStorageNodesSchema[]
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_RUNTIME_SERVICES * gRT
#define ASSERT(x)
Definition coder.h:55
OC_NVRAM_LEGACY_ENTRY * SchemaEntry
OC_ASCII_STRING_BUFFER * StringBuffer
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * FileSystem