15#include <Protocol/SimpleFileSystem.h>
17#include <Library/BaseLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/BaseOverflowLib.h>
20#include <Library/DebugLib.h>
21#include <Library/MemoryAllocationLib.h>
45 UINT64 DataForkOffset;
46 UINT64 DataForkLength;
59 if (FileSize <=
sizeof (Trailer)) {
62 "OCDI: DMG file size error: %u/%u\n",
64 (UINT32)
sizeof (Trailer)
71 TrailerOffset = (FileSize -
sizeof (Trailer));
79 if (!Result || (Trailer.
Signature != SwappedSig)) {
82 "OCDI: DMG trailer error: %d - %Lx/%Lx - %X/%X\n",
84 (UINT64)TrailerOffset,
101 if ( (HeaderSize !=
sizeof (Trailer))
103 || (XmlLength > MAX_UINT32)
104 || (DataForkChecksum.
Size > (sizeof (DataForkChecksum.
Data) * 8))
105 || (SectorCount == 0))
109 "OCDI: DMG context error: %u/%Lu/%Lu/%u/%u\n",
113 DataForkChecksum.
Size
118 if ((SegmentCount != 0) && (SegmentCount != 1)) {
119 DEBUG ((DEBUG_ERROR,
"OCDI: Multiple segments are unsupported\n"));
123 Result = BaseOverflowMulU64 (
128 if (Result || (OffsetTop > MAX_UINTN)) {
129 DEBUG ((DEBUG_INFO,
"OCDI: DMG sector error: %Lu %Lu\n", SectorCount, OffsetTop));
133 Result = BaseOverflowAddU64 (
138 if (Result || (OffsetTop > TrailerOffset)) {
139 DEBUG ((DEBUG_INFO,
"OCDI: DMG xml error: %Lu %Lu %Lu %Lu\n", XmlOffset, XmlLength, OffsetTop, TrailerOffset));
143 Result = BaseOverflowAddU64 (
148 if (Result || (OffsetTop > TrailerOffset)) {
149 DEBUG ((DEBUG_INFO,
"OCDI: DMG data error: %Lu %Lu %Lu %Lu\n", DataForkOffset, DataForkLength, OffsetTop, TrailerOffset));
153 PlistData = AllocatePool ((UINT32)XmlLength);
154 if (PlistData == NULL) {
155 DEBUG ((DEBUG_INFO,
"OCDI: DMG plist alloc error: %Lu\n", XmlLength));
166 DEBUG ((DEBUG_INFO,
"OCDI: DMG plist read error: %Lu %Lu\n", XmlOffset, XmlLength));
167 FreePool (PlistData);
175 (UINTN)DataForkOffset,
176 (UINTN)DataForkLength,
181 FreePool (PlistData);
184 DEBUG ((DEBUG_INFO,
"OCDI: DMG plist parse error: %Lu %Lu\n", XmlOffset, XmlLength));
189 Context->BlockCount = DmgBlockCount;
190 Context->Blocks = DmgBlocks;
199 IN EFI_FILE_PROTOCOL *File
212 if (EFI_ERROR (Status)) {
213 DEBUG ((DEBUG_INFO,
"OCDI: Failed to retrieve DMG file size\n"));
219 DEBUG ((DEBUG_INFO,
"OCDI: Failed to allocate DMG data\n"));
225 DEBUG ((DEBUG_INFO,
"OCDI: Failed to load DMG file\n"));
233 DEBUG ((DEBUG_INFO,
"OCDI: Failed to initialise DMG context\n"));
249 ASSERT (ChunklistContext != NULL);
266 for (Index = 0; Index < Context->BlockCount; ++Index) {
267 FreePool (Context->Blocks[Index]);
270 FreePool (Context->Blocks);
294 UINT64 ChunkTotalLength;
298 UINT8 *ChunkDataCompressed;
303 UINTN RemainingBufferSize;
304 UINTN BufferChunkSize;
305 UINT8 *BufferCurrent;
311 ASSERT (Lba < Context->SectorCount);
314 RemainingBufferSize = BufferSize;
317 while (RemainingBufferSize > 0) {
324 LbaLength = ((UINTN)Chunk->
SectorCount - LbaOffset);
326 Result = BaseOverflowMulU64 (
335 Result = BaseOverflowMulU64 (
344 ChunkLength = (ChunkTotalLength - ChunkOffset);
346 BufferChunkSize = (UINTN)
MIN (RemainingBufferSize, ChunkLength);
348 switch (Chunk->
Type) {
352 ZeroMem (BufferCurrent, BufferChunkSize);
359 Context->ExtentTable,
373 ChunkData = AllocatePool ((UINTN)(ChunkTotalLength + Chunk->
CompressedLength));
374 if (ChunkData == NULL) {
378 ChunkDataCompressed = (ChunkData + (UINTN)ChunkTotalLength);
380 Context->ExtentTable,
386 FreePool (ChunkData);
392 (UINTN)ChunkTotalLength,
396 if (OutSize != (UINTN)ChunkTotalLength) {
397 FreePool (ChunkData);
401 CopyMem (BufferCurrent, (ChunkData + ChunkOffset), BufferChunkSize);
402 FreePool (ChunkData);
410 "OCDI: Compression type %x unsupported\n",
417 RemainingBufferSize -= BufferChunkSize;
418 BufferCurrent += BufferChunkSize;
419 LbaCurrent += LbaLength;
APPLE_RAM_DISK_EXTENT_TABLE ExtentTable
PACKED struct @54 APPLE_RAM_DISK_EXTENT_TABLE
#define APPLE_DISK_IMAGE_CHUNK_TYPE_ZLIB
#define APPLE_DISK_IMAGE_CHUNK_TYPE_IGNORE
#define APPLE_DISK_IMAGE_MAGIC
#define APPLE_DISK_IMAGE_SECTOR_SIZE
#define APPLE_DISK_IMAGE_CHUNK_TYPE_ZERO
#define APPLE_DISK_IMAGE_CHUNK_TYPE_RAW
BOOLEAN OcAppleChunklistVerifyData(IN OUT OC_APPLE_CHUNKLIST_CONTEXT *Context, IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable)
BOOLEAN OcAppleDiskImageRead(IN OC_APPLE_DISK_IMAGE_CONTEXT *Context, IN UINTN Lba, IN UINTN BufferSize, OUT VOID *Buffer)
BOOLEAN OcAppleDiskImageVerifyData(IN OUT OC_APPLE_DISK_IMAGE_CONTEXT *Context, IN OUT OC_APPLE_CHUNKLIST_CONTEXT *ChunklistContext)
BOOLEAN OcAppleDiskImageInitializeContext(OUT OC_APPLE_DISK_IMAGE_CONTEXT *Context, IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN UINTN FileSize)
BOOLEAN OcAppleDiskImageInitializeFromFile(OUT OC_APPLE_DISK_IMAGE_CONTEXT *Context, IN EFI_FILE_PROTOCOL *File)
VOID OcAppleDiskImageFreeContext(IN OC_APPLE_DISK_IMAGE_CONTEXT *Context)
VOID OcAppleDiskImageFreeFile(IN OC_APPLE_DISK_IMAGE_CONTEXT *Context)
BOOLEAN InternalParsePlist(IN CHAR8 *Plist, IN UINT32 PlistSize, IN UINTN SectorCount, IN UINTN DataForkOffset, IN UINTN DataForkSize, OUT UINT32 *BlockCount, OUT APPLE_DISK_IMAGE_BLOCK_DATA ***Blocks)
BOOLEAN InternalGetBlockChunk(IN OC_APPLE_DISK_IMAGE_CONTEXT *Context, IN UINTN Lba, OUT APPLE_DISK_IMAGE_BLOCK_DATA **Data, OUT APPLE_DISK_IMAGE_CHUNK **Chunk)
#define DMG_SECTOR_START_ABS(b, c)
VOID OcAppleRamDiskFree(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable)
CONST APPLE_RAM_DISK_EXTENT_TABLE * OcAppleRamDiskAllocate(IN UINTN Size, IN EFI_MEMORY_TYPE MemoryType)
BOOLEAN OcAppleRamDiskRead(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN UINTN Offset, IN UINTN Size, OUT VOID *Buffer)
BOOLEAN OcAppleRamDiskLoadFile(IN OUT CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN EFI_FILE_PROTOCOL *File, IN UINTN FileSize)
UINTN DecompressZLIB(OUT UINT8 *Dst, IN UINTN DstLen, IN CONST UINT8 *Src, IN UINTN SrcLen)
EFI_STATUS OcGetFileSize(IN EFI_FILE_PROTOCOL *File, OUT UINT32 *Size)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT64 SwapBytes64(UINT64 Operand)
UINT32 Data[APPLE_DISK_IMAGE_CHECKSUM_SIZE]
APPLE_DISK_IMAGE_CHECKSUM DataForkChecksum