85 OUT UINT32 *PlistSize,
95 UINT32 PlistCompressedSize;
97 UINT32 PlistStoredSize;
101 UINT32 MkextInfoRootIndex;
102 UINT32 MkextInfoRootCount;
105 CONST CHAR8 *BundleArrayKey;
107 MkextBuffer = (UINT8 *)Mkext;
108 MkextLength = SwapBytes32 (Mkext->Header.Length);
109 PlistOffset = SwapBytes32 (Mkext->PlistOffset);
110 PlistCompressedSize = SwapBytes32 (Mkext->PlistCompressedSize);
111 PlistFullSize = SwapBytes32 (Mkext->PlistFullSize);
113 PlistStoredSize = PlistCompressedSize;
114 if (PlistStoredSize == 0) {
115 PlistStoredSize = PlistFullSize;
118 if (BaseOverflowAddU32 (PlistOffset, PlistStoredSize, &Tmp) || (Tmp > MkextLength)) {
122 PlistBuffer = AllocatePool (PlistFullSize);
123 if (PlistBuffer == NULL) {
130 if (PlistCompressedSize > 0) {
134 &MkextBuffer[PlistOffset],
138 FreePool (PlistBuffer);
142 CopyMem (PlistBuffer, &MkextBuffer[PlistOffset], PlistFullSize);
146 if (PlistXml == NULL) {
147 FreePool (PlistBuffer);
155 if (MkextInfoRoot == NULL) {
157 FreePool (PlistBuffer);
165 for (MkextInfoRootIndex = 0; MkextInfoRootIndex < MkextInfoRootCount; MkextInfoRootIndex++) {
167 if (BundleArrayKey == NULL) {
172 *Plist = PlistBuffer;
173 *PlistSize = PlistFullSize;
174 *PlistDoc = PlistXml;
175 *PlistBundles = PlistBundleArray;
185 FreePool (PlistBuffer);
298 IN CONST CHAR8 *Identifier,
299 OUT UINT32 *KextIndex,
300 OUT UINT32 *KextPlistOffset,
301 OUT UINT32 *KextPlistSize,
302 OUT UINT32 *KextBinOffset,
303 OUT UINT32 *KextBinSize
309 UINT32 PlistOffsetSize;
310 UINT32 BinOffsetSize;
319 UINT32 PlistBundleIndex;
320 UINT32 PlistBundleCount;
321 CONST CHAR8 *PlistBundleKey;
324 CONST CHAR8 *KextIdentifier;
330 MkextHeader = Context->MkextHeader;
337 for (Index = 0; Index < Context->NumKexts; Index++) {
356 if ( BaseOverflowAddU32 (PlistOffset, PlistSize, &PlistOffsetSize)
357 || (PlistOffsetSize > Context->MkextSize)
358 || BaseOverflowAddU32 (BinOffset, BinSize, &BinOffsetSize)
359 || (BinOffsetSize > Context->MkextSize))
361 return EFI_INVALID_PARAMETER;
364 PlistBuffer = AllocateCopyPool (PlistSize, &Context->Mkext[PlistOffset]);
365 if (PlistBuffer == NULL) {
366 return EFI_OUT_OF_RESOURCES;
370 if (PlistXml == NULL) {
371 FreePool (PlistBuffer);
372 return EFI_OUT_OF_RESOURCES;
376 if (PlistRoot == NULL) {
378 FreePool (PlistBuffer);
379 return EFI_OUT_OF_RESOURCES;
382 KextIdentifier = NULL;
384 for (PlistBundleIndex = 0; PlistBundleIndex < PlistBundleCount; PlistBundleIndex++) {
386 if ((PlistBundleKey == NULL) || (PlistBundleKeyValue == NULL)) {
396 IsKextMatch = KextIdentifier != NULL && AsciiStrCmp (KextIdentifier, Identifier) == 0;
398 FreePool (PlistBuffer);
400 if (IsKextMatch && (BinOffset > 0) && (BinSize > 0)) {
409 return EFI_NOT_FOUND;
413 *KextPlistOffset = PlistOffset;
414 *KextPlistSize = PlistSize;
415 *KextBinOffset = BinOffset;
416 *KextBinSize = BinSize;
424 IN CONST CHAR8 *Identifier
431 LIST_ENTRY *KextLink;
433 UINT32 BinOffsetSize;
439 UINT32 PlistBundlesCount;
441 UINT32 PlistBundleIndex;
442 UINT32 PlistBundleCount;
443 CONST CHAR8 *PlistBundleKey;
446 CONST CHAR8 *KextIdentifier;
447 UINT32 KextBinOffset;
453 KextLink = GetFirstNode (&Context->CachedKexts);
454 while (!IsNull (&Context->CachedKexts, KextLink)) {
457 if (AsciiStrCmp (Identifier, MkextKext->
Identifier) == 0) {
461 KextLink = GetNextNode (&Context->CachedKexts, KextLink);
474 if (Status != EFI_SUCCESS) {
482 KextIdentifier = NULL;
489 for (Index = 0; Index < PlistBundlesCount; Index++) {
491 if (PlistBundle == NULL) {
496 for (PlistBundleIndex = 0; PlistBundleIndex < PlistBundleCount; PlistBundleIndex++) {
498 if ((PlistBundleKey == NULL) || (PlistBundleKeyValue == NULL)) {
510 if (!
PlistIntegerValue (PlistBundleKeyValue, &KextBinOffset,
sizeof (KextBinOffset), TRUE)) {
516 if ( (KextIdentifier != NULL)
517 && (AsciiStrCmp (KextIdentifier, Identifier) == 0)
518 && (KextBinOffset > 0)
525 KextIdentifier = NULL;
546 KextBinSize = SwapBytes32 (MkextV2FileEntry->
FullSize);
551 if ( BaseOverflowAddU32 (KextBinOffset, KextBinSize, &BinOffsetSize)
552 || (BinOffsetSize > Context->MkextSize))
570 IN UINT32 BufferSize,
571 IN UINT32 NumReservedKexts,
572 IN OUT UINT8 *OutBuffer OPTIONAL,
573 IN UINT32 OutBufferSize OPTIONAL,
574 IN OUT UINT32 *OutMkextSize
588 UINT32 CurrentOffset;
591 UINT32 PlistCompSize;
592 UINT32 PlistFullSize;
593 UINT32 PlistFullSizeAligned;
597 UINT32 BinFullSizeAligned;
602 UINT32 PlistBundlesCount;
604 UINT32 PlistBundleIndex;
605 UINT32 PlistBundleCount;
606 CONST CHAR8 *PlistBundleKey;
611 CHAR8 *BinaryOffsetStrings;
612 UINT32 BinaryOffsetStringsSize;
619 ASSERT (OutBuffer != NULL);
620 ASSERT (OutMkextSize != NULL);
626 return EFI_INVALID_PARAMETER;
636 || (BufferSize != MkextSize)
637 || BaseOverflowAddU32 (NumKexts, NumReservedKexts, &NumMaxKexts))
639 return EFI_INVALID_PARAMETER;
642 MkextHeaderOut = NULL;
657 return EFI_INVALID_PARAMETER;
667 if (CurrentOffset > OutBufferSize) {
668 return EFI_BUFFER_TOO_SMALL;
681 for (Index = 0; Index < NumKexts; Index++) {
684 PlistFullSizeAligned =
MKEXT_ALIGN (PlistFullSize);
687 if ( (PlistFullSizeAligned < PlistFullSize)
688 || (BinFullSizeAligned < BinFullSize))
690 return EFI_INVALID_PARAMETER;
702 if (BaseOverflowTriAddU32 (CurrentOffset, PlistFullSizeAligned, BinFullSizeAligned, &Tmp)) {
703 return EFI_INVALID_PARAMETER;
706 if (Tmp > OutBufferSize) {
707 return EFI_BUFFER_TOO_SMALL;
713 if (PlistCompSize > 0) {
714 if ( BaseOverflowAddU32 (PlistOffset, PlistCompSize, &Tmp)
717 &OutBuffer[CurrentOffset],
719 &((UINT8 *)
Buffer)[PlistOffset],
723 return EFI_INVALID_PARAMETER;
726 if ( BaseOverflowAddU32 (PlistOffset, PlistFullSize, &Tmp)
727 || (Tmp > MkextSize))
729 return EFI_INVALID_PARAMETER;
732 CopyMem (&OutBuffer[CurrentOffset], &
Buffer[PlistOffset], PlistFullSize);
739 CurrentOffset += PlistFullSizeAligned;
741 if (BinFullSize > 0) {
745 if (BinCompSize > 0) {
746 if ( BaseOverflowAddU32 (BinOffset, BinCompSize, &Tmp)
749 &OutBuffer[CurrentOffset],
751 &((UINT8 *)
Buffer)[BinOffset],
755 return EFI_INVALID_PARAMETER;
758 if ( BaseOverflowAddU32 (BinOffset, BinFullSize, &Tmp)
759 || (Tmp > MkextSize))
761 return EFI_INVALID_PARAMETER;
764 CopyMem (&OutBuffer[CurrentOffset], &
Buffer[BinOffset], BinFullSize);
771 CurrentOffset += BinFullSizeAligned;
779 if (BaseOverflowTriAddU32 (
781 PlistFullSizeAligned,
786 return EFI_INVALID_PARAMETER;
791 *OutMkextSize = CurrentOffset;
798 return EFI_INVALID_PARAMETER;
808 if (CurrentOffset > OutBufferSize) {
809 return EFI_BUFFER_TOO_SMALL;
819 if (!
ParseMkextV2Plist (&MkextHeader->
V2, &PlistBuffer, &PlistFullSize, &PlistXml, &PlistBundles)) {
820 return EFI_INVALID_PARAMETER;
827 BinaryOffsetStrings = NULL;
830 if (BaseOverflowTriMulU32 (PlistBundlesCount,
KEXT_OFFSET_STR_LEN,
sizeof (CHAR8), &BinaryOffsetStringsSize)) {
832 FreePool (PlistBuffer);
833 return EFI_INVALID_PARAMETER;
836 BinaryOffsetStrings = AllocateZeroPool (BinaryOffsetStringsSize);
837 if (BinaryOffsetStrings == NULL) {
839 FreePool (PlistBuffer);
840 return EFI_OUT_OF_RESOURCES;
847 for (Index = 0; Index < PlistBundlesCount; Index++) {
849 if (PlistBundle == NULL) {
851 FreePool (PlistBuffer);
853 FreePool (BinaryOffsetStrings);
856 return EFI_INVALID_PARAMETER;
863 for (PlistBundleIndex = 0; PlistBundleIndex < PlistBundleCount; PlistBundleIndex++) {
865 if (PlistBundleKey == NULL) {
875 FreePool (PlistBuffer);
877 FreePool (BinaryOffsetStrings);
880 return EFI_INVALID_PARAMETER;
885 BinFullSize = SwapBytes32 (MkextExecutableEntry->
FullSize);
888 if (BaseOverflowTriAddU32 (CurrentOffset,
sizeof (
MKEXT_V2_FILE_ENTRY), BinFullSizeAligned, &NewOffset)) {
890 FreePool (PlistBuffer);
892 FreePool (BinaryOffsetStrings);
895 return EFI_INVALID_PARAMETER;
899 if (NewOffset > OutBufferSize) {
901 FreePool (PlistBuffer);
902 FreePool (BinaryOffsetStrings);
903 return EFI_BUFFER_TOO_SMALL;
908 MkextOutExecutableEntry->
FullSize = SwapBytes32 (BinFullSize);
913 if (BinCompSize > 0) {
914 if ( BaseOverflowAddU32 (BinOffset, BinCompSize, &Tmp)
917 MkextOutExecutableEntry->
Data,
919 MkextExecutableEntry->
Data,
924 FreePool (PlistBuffer);
925 FreePool (BinaryOffsetStrings);
926 return EFI_INVALID_PARAMETER;
929 if ( BaseOverflowAddU32 (BinOffset, BinFullSize, &Tmp)
933 FreePool (PlistBuffer);
934 FreePool (BinaryOffsetStrings);
935 return EFI_INVALID_PARAMETER;
938 CopyMem (MkextOutExecutableEntry->
Data, MkextExecutableEntry->
Data, BinFullSize);
948 FreePool (PlistBuffer);
949 FreePool (BinaryOffsetStrings);
950 return EFI_INVALID_PARAMETER;
959 CurrentOffset = NewOffset;
966 PlistFullSize =
UpdateMkextV2Plist (&MkextHeaderOut->
V2, OutBufferSize, PlistXml, CurrentOffset);
970 FreePool (PlistBuffer);
972 FreePool (BinaryOffsetStrings);
974 if ( (PlistFullSize == 0)
975 || BaseOverflowAddU32 (CurrentOffset, PlistFullSize, OutMkextSize))
977 return EFI_INVALID_PARAMETER;
985 if ( BaseOverflowAddU32 (CurrentOffset, PlistFullSize, &CurrentOffset)
986 || BaseOverflowMulAddU32 (PlistBundlesCount,
PLIST_EXPANSION_SIZE, CurrentOffset, &CurrentOffset)
987 || BaseOverflowMulAddU32 (NumReservedKexts,
sizeof (
MKEXT_V2_FILE_ENTRY), CurrentOffset, OutMkextSize))
989 return EFI_INVALID_PARAMETER;
997 return EFI_UNSUPPORTED;
1042 IN OUT UINT8 *Mkext,
1043 IN UINT32 MkextSize,
1044 IN UINT32 MkextAllocSize
1048 UINT32 MkextVersion;
1049 UINT32 MkextHeaderSize;
1057 UINT32 StartingOffset;
1058 UINT32 CurrentOffset;
1063 UINT32 PlistFullSize;
1074 ASSERT (Context != NULL);
1077 ASSERT (MkextAllocSize >= MkextSize);
1082 return EFI_INVALID_PARAMETER;
1092 || (MkextSize != SwapBytes32 (MkextHeader->
Common.
Length)))
1094 return EFI_INVALID_PARAMETER;
1102 return EFI_UNSUPPORTED;
1113 || (MkextHeaderSize > MkextSize))
1115 return EFI_INVALID_PARAMETER;
1125 for (Index = 0; Index < NumKexts; Index++) {
1127 if ((StartingOffset == 0) || (CurrentOffset < StartingOffset)) {
1128 StartingOffset = CurrentOffset;
1136 if (CurrentOffset < StartingOffset) {
1137 StartingOffset = CurrentOffset;
1142 if ( (StartingOffset < MkextHeaderSize)
1143 || (StartingOffset > MkextSize))
1145 return EFI_INVALID_PARAMETER;
1148 Tmp = (StartingOffset - MkextHeaderSize) /
sizeof (
MKEXT_V1_KEXT);
1149 if ( BaseOverflowAddU32 (Tmp, NumKexts, &NumMaxKexts)
1150 || (NumMaxKexts == MAX_UINT32))
1152 return EFI_INVALID_PARAMETER;
1160 || !
ParseMkextV2Plist (&MkextHeader->
V2, &PlistBuffer, &PlistFullSize, &PlistXml, &PlistBundles))
1162 return EFI_INVALID_PARAMETER;
1167 if ( BaseOverflowAddU32 (PlistOffset, PlistFullSize, &Tmp)
1168 || (Tmp != MkextSize))
1170 return EFI_INVALID_PARAMETER;
1177 return EFI_UNSUPPORTED;
1180 ZeroMem (Context,
sizeof (*Context));
1181 Context->Mkext = Mkext;
1182 Context->MkextSize = MkextSize;
1183 Context->MkextHeader = MkextHeader;
1184 Context->MkextAllocSize = MkextAllocSize;
1185 Context->MkextVersion = MkextVersion;
1186 Context->Is32Bit = Is32Bit;
1187 Context->NumKexts = NumKexts;
1188 InitializeListHead (&Context->CachedKexts);
1191 Context->NumMaxKexts = NumMaxKexts;
1193 Context->MkextInfoOffset = PlistOffset;
1194 Context->MkextInfo = PlistBuffer;
1195 Context->MkextInfoDocument = PlistXml;
1196 Context->MkextKexts = PlistBundles;
1276 IN CONST CHAR8 *Identifier OPTIONAL,
1277 IN CONST CHAR8 *BundlePath,
1278 IN CONST CHAR8 *InfoPlist,
1279 IN UINT32 InfoPlistSize,
1280 IN UINT8 *Executable OPTIONAL,
1281 IN UINT32 ExecutableSize OPTIONAL,
1285 UINT32 MkextNewSize;
1288 UINT32 InfoPlistSizeAligned;
1289 UINT32 ExecutableSizeAligned;
1292 CHAR8 *PlistExported;
1293 UINT32 PlistExportedSize;
1297 BOOLEAN PlistFailed;
1298 UINT32 PlistBundleIndex;
1299 UINT32 PlistBundleCount;
1300 CONST CHAR8 *PlistBundleKey;
1302 CONST CHAR8 *BundleVerStr;
1304 CONST CHAR8 *TmpKeyValue;
1308 CHAR8 ExecutableSourceAddrStr[24];
1311 ASSERT (Context != NULL);
1312 ASSERT (BundlePath != NULL);
1313 ASSERT (InfoPlist != NULL);
1314 ASSERT (InfoPlistSize > 0);
1321 if (Identifier != NULL) {
1323 DEBUG ((DEBUG_INFO,
"OCAK: Bundle %a is already present in mkext\n", Identifier));
1324 return EFI_ALREADY_STARTED;
1328 PlistBuffer = AllocateCopyPool (InfoPlistSize, InfoPlist);
1329 if (PlistBuffer == NULL) {
1330 return EFI_OUT_OF_RESOURCES;
1334 if (PlistXml == NULL) {
1335 FreePool (PlistBuffer);
1336 return EFI_INVALID_PARAMETER;
1340 if (PlistRoot == NULL) {
1342 FreePool (PlistBuffer);
1343 return EFI_INVALID_PARAMETER;
1351 DEBUG_CODE_BEGIN ();
1354 if (BundleVersion != NULL) {
1355 for (FieldIndex = 0; FieldIndex < FieldCount; ++FieldIndex) {
1357 if (TmpKeyValue == NULL) {
1376 if (Executable == NULL) {
1377 for (FieldIndex = 0; FieldIndex < FieldCount; ++FieldIndex) {
1379 if (TmpKeyValue == NULL) {
1395 for (PlistBundleIndex = 0; PlistBundleIndex < PlistBundleCount; PlistBundleIndex++) {
1397 if ((PlistBundleKey == NULL) || (PlistBundleKeyValue == NULL)) {
1407 if (Identifier == NULL) {
1409 FreePool (PlistBuffer);
1410 return EFI_INVALID_PARAMETER;
1418 FreePool (PlistBuffer);
1420 if (Context->NumKexts >= Context->NumMaxKexts) {
1421 return EFI_BUFFER_TOO_SMALL;
1424 InfoPlistSizeAligned =
MKEXT_ALIGN (InfoPlistSize);
1425 if (InfoPlistSizeAligned < InfoPlistSize) {
1426 return EFI_INVALID_PARAMETER;
1432 PlistOffset = Context->MkextSize;
1433 if (BaseOverflowAddU32 (PlistOffset, InfoPlistSizeAligned, &MkextNewSize)) {
1434 return EFI_INVALID_PARAMETER;
1437 if (MkextNewSize > Context->MkextAllocSize) {
1438 return EFI_BUFFER_TOO_SMALL;
1444 if (Executable != NULL) {
1445 ASSERT (ExecutableSize > 0);
1447 BinOffset = MkextNewSize;
1449 return EFI_INVALID_PARAMETER;
1452 ExecutableSizeAligned =
MKEXT_ALIGN (ExecutableSize);
1453 if ( (ExecutableSizeAligned < ExecutableSize)
1454 || BaseOverflowAddU32 (BinOffset, ExecutableSizeAligned, &MkextNewSize))
1456 return EFI_INVALID_PARAMETER;
1459 if (MkextNewSize > Context->MkextAllocSize) {
1460 return EFI_BUFFER_TOO_SMALL;
1463 CopyMem (&Context->Mkext[BinOffset], Executable, ExecutableSize);
1464 Context->MkextHeader->V1.Kexts[Context->NumKexts].Binary.Offset = SwapBytes32 (BinOffset);
1465 Context->MkextHeader->V1.Kexts[Context->NumKexts].Binary.CompressedSize = 0;
1466 Context->MkextHeader->V1.Kexts[Context->NumKexts].Binary.FullSize = SwapBytes32 (ExecutableSize);
1467 Context->MkextHeader->V1.Kexts[Context->NumKexts].Binary.ModifiedSeconds = 0;
1470 CopyMem (&Context->Mkext[PlistOffset], InfoPlist, InfoPlistSize);
1471 Context->MkextHeader->V1.Kexts[Context->NumKexts].Plist.Offset = SwapBytes32 (PlistOffset);
1472 Context->MkextHeader->V1.Kexts[Context->NumKexts].Plist.CompressedSize = 0;
1473 Context->MkextHeader->V1.Kexts[Context->NumKexts].Plist.FullSize = SwapBytes32 (InfoPlistSize);
1474 Context->MkextHeader->V1.Kexts[Context->NumKexts].Plist.ModifiedSeconds = 0;
1481 Context->MkextSize = MkextNewSize;
1482 Context->NumKexts++;
1491 PlistOffset = Context->MkextInfoOffset;
1492 PlistFailed = FALSE;
1493 if (Executable != NULL) {
1494 ASSERT (ExecutableSize > 0);
1496 BinOffset = PlistOffset;
1499 FreePool (PlistBuffer);
1500 return EFI_INVALID_PARAMETER;
1503 ExecutableSizeAligned =
MKEXT_ALIGN (ExecutableSize);
1504 if ( (ExecutableSizeAligned < ExecutableSize)
1505 || BaseOverflowTriAddU32 (BinOffset,
sizeof (
MKEXT_V2_FILE_ENTRY), ExecutableSizeAligned, &PlistOffset))
1508 FreePool (PlistBuffer);
1509 return EFI_INVALID_PARAMETER;
1512 if (PlistOffset >= Context->MkextAllocSize) {
1514 FreePool (PlistBuffer);
1515 return EFI_BUFFER_TOO_SMALL;
1518 PlistFailed |= !
AsciiUint64ToLowerHex (ExecutableSourceAddrStr,
sizeof (ExecutableSourceAddrStr), BinOffset);
1527 PlistFailed |=
XmlNodeAppend (PlistRoot,
"string", NULL, BundlePath) == NULL;
1530 FreePool (PlistBuffer);
1531 return EFI_OUT_OF_RESOURCES;
1539 FreePool (PlistBuffer);
1541 if (
XmlNodeAppend (Context->MkextKexts,
"dict", NULL, PlistExported) == NULL) {
1542 return EFI_OUT_OF_RESOURCES;
1545 Context->MkextInfoOffset = PlistOffset;
1547 if (Executable != NULL) {
1550 MkextExecutableEntry->
FullSize = SwapBytes32 (ExecutableSize);
1551 CopyMem (MkextExecutableEntry->
Data, Executable, ExecutableSize);
1561 FreePool (PlistBuffer);
1562 return EFI_UNSUPPORTED;
EFI_STATUS MkextContextApplyQuirk(IN OUT MKEXT_CONTEXT *Context, IN KERNEL_QUIRK_NAME Quirk, IN UINT32 KernelVersion)
MKEXT_KEXT * InternalCachedMkextKext(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier)
EFI_STATUS MkextContextBlock(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN BOOLEAN Exclude)
STATIC UINT32 UpdateMkextV2Plist(IN OUT MKEXT_V2_HEADER *Mkext, IN UINT32 AllocatedSize, IN XML_DOCUMENT *PlistDoc, IN UINT32 Offset)
EFI_STATUS MkextReserveKextSize(IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *ReservedExeSize, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, IN BOOLEAN Is32Bit)
BOOLEAN MkextCheckCpuType(IN UINT8 *Mkext, IN UINT32 MkextSize, IN MACH_CPU_TYPE CpuType)
STATIC BOOLEAN ParseMkextV2Plist(IN MKEXT_V2_HEADER *Mkext, OUT UINT8 **Plist, OUT UINT32 *PlistSize, OUT XML_DOCUMENT **PlistDoc, OUT XML_NODE **PlistBundles)
EFI_STATUS MkextContextApplyPatch(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN PATCHER_GENERIC_PATCH *Patch)
STATIC MKEXT_KEXT * InsertCachedMkextKext(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN UINT32 BinOffset, IN UINT32 BinSize)
EFI_STATUS InternalGetMkextV1KextOffsets(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, OUT UINT32 *KextIndex, OUT UINT32 *KextPlistOffset, OUT UINT32 *KextPlistSize, OUT UINT32 *KextBinOffset, OUT UINT32 *KextBinSize)
EFI_STATUS MkextContextInit(IN OUT MKEXT_CONTEXT *Context, IN OUT UINT8 *Mkext, IN UINT32 MkextSize, IN UINT32 MkextAllocSize)
BOOLEAN InternalParseKextBinary(IN OUT UINT8 **Buffer, IN OUT UINT32 *BufferSize, IN BOOLEAN Is32Bit)
EFI_STATUS MkextInjectKext(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier OPTIONAL, IN CONST CHAR8 *BundlePath, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
EFI_STATUS MkextDecompress(IN CONST UINT8 *Buffer, IN UINT32 BufferSize, IN UINT32 NumReservedKexts, IN OUT UINT8 *OutBuffer OPTIONAL, IN UINT32 OutBufferSize OPTIONAL, IN OUT UINT32 *OutMkextSize)