OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
Header.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16
19
20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/BaseOverflowLib.h>
23#include <Library/DebugLib.h>
24#include <Library/OcMachoLib.h>
25
26#include "OcMachoLibInternal.h"
27
28BOOLEAN
30 OUT OC_MACHO_CONTEXT *Context,
31 IN VOID *FileData,
32 IN UINT32 FileSize,
33 IN UINT32 HeaderOffset,
34 IN UINT32 InnerSize,
35 IN BOOLEAN Is32Bit
36 )
37{
38 return Is32Bit ?
39 MachoInitializeContext32 (Context, FileData, FileSize, HeaderOffset, InnerSize) :
40 MachoInitializeContext64 (Context, FileData, FileSize, HeaderOffset, InnerSize);
41}
42
45 IN OUT OC_MACHO_CONTEXT *Context
46 )
47{
48 ASSERT (Context != NULL);
49 ASSERT (Context->MachHeader != NULL);
50
51 return Context->MachHeader;
52}
53
54UINT32
56 IN OUT OC_MACHO_CONTEXT *Context
57 )
58{
59 ASSERT (Context != NULL);
60 ASSERT (Context->InnerSize != 0);
61
62 return Context->InnerSize;
63}
64
65VOID *
67 IN OUT OC_MACHO_CONTEXT *Context
68 )
69{
70 ASSERT (Context != NULL);
71 ASSERT (Context->FileData != NULL);
72
73 return Context->FileData;
74}
75
76UINT32
78 IN OUT OC_MACHO_CONTEXT *Context
79 )
80{
81 ASSERT (Context != NULL);
82 ASSERT (Context->FileSize != 0);
83
84 return Context->FileSize;
85}
86
87UINT32
89 IN OUT OC_MACHO_CONTEXT *Context
90 )
91{
92 ASSERT (Context != NULL);
93
94 return Context->Is32Bit ?
96}
97
98UINT64
100 IN OUT OC_MACHO_CONTEXT *Context
101 )
102{
103 ASSERT (Context != NULL);
104
105 return Context->Is32Bit ?
107}
108
111 IN OUT OC_MACHO_CONTEXT *Context,
112 IN MACH_LOAD_COMMAND_TYPE LoadCommandType,
113 IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL
114 )
115{
116 ASSERT (Context != NULL);
117
118 return Context->Is32Bit ?
119 InternalMachoGetNextCommand32 (Context, LoadCommandType, LoadCommand) :
120 InternalMachoGetNextCommand64 (Context, LoadCommandType, LoadCommand);
121}
122
125 IN OUT OC_MACHO_CONTEXT *Context
126 )
127{
128 MACH_UUID_COMMAND *UuidCommand;
129
130 ASSERT (Context != NULL);
131
132 //
133 // Context initialisation guarantees the command size is a multiple of 4 or 8.
134 //
135 if (Context->Is32Bit) {
137 BASE_ALIGNOF (MACH_UUID_COMMAND) <= sizeof (UINT32),
138 "Alignment is not guaranteed."
139 );
140 } else {
142 BASE_ALIGNOF (MACH_UUID_COMMAND) <= sizeof (UINT64),
143 "Alignment is not guaranteed."
144 );
145 }
146
147 UuidCommand = (MACH_UUID_COMMAND *)(VOID *)MachoGetNextCommand (
148 Context,
150 NULL
151 );
152 if ((UuidCommand == NULL) || (UuidCommand->CommandSize != sizeof (*UuidCommand))) {
153 return NULL;
154 }
155
156 return UuidCommand;
157}
158
161 IN OUT OC_MACHO_CONTEXT *Context,
162 IN CONST MACH_SEGMENT_COMMAND_ANY *Segment OPTIONAL
163 )
164{
165 ASSERT (Context != NULL);
166
167 return Context->Is32Bit ?
168 (MACH_SEGMENT_COMMAND_ANY *)MachoGetNextSegment32 (Context, Segment != NULL ? &Segment->Segment32 : NULL) :
169 (MACH_SEGMENT_COMMAND_ANY *)MachoGetNextSegment64 (Context, Segment != NULL ? &Segment->Segment64 : NULL);
170}
171
174 IN OUT OC_MACHO_CONTEXT *Context,
175 IN MACH_SEGMENT_COMMAND_ANY *Segment,
176 IN MACH_SECTION_ANY *Section OPTIONAL
177 )
178{
179 ASSERT (Context != NULL);
180 ASSERT (Segment != NULL);
181
182 return Context->Is32Bit ?
183 (MACH_SECTION_ANY *)MachoGetNextSection32 (Context, &Segment->Segment32, Section != NULL ? &Section->Section32 : NULL) :
184 (MACH_SECTION_ANY *)MachoGetNextSection64 (Context, &Segment->Segment64, Section != NULL ? &Section->Section64 : NULL);
185}
186
189 IN OUT OC_MACHO_CONTEXT *Context,
190 IN UINT32 Index
191 )
192{
193 ASSERT (Context != NULL);
194
195 return Context->Is32Bit ?
196 (MACH_SECTION_ANY *)MachoGetSectionByIndex32 (Context, Index) :
197 (MACH_SECTION_ANY *)MachoGetSectionByIndex64 (Context, Index);
198}
199
202 IN OUT OC_MACHO_CONTEXT *Context,
203 IN CONST CHAR8 *SegmentName
204 )
205{
206 ASSERT (Context != NULL);
207
208 return Context->Is32Bit ?
209 (MACH_SEGMENT_COMMAND_ANY *)MachoGetSegmentByName32 (Context, SegmentName) :
210 (MACH_SEGMENT_COMMAND_ANY *)MachoGetSegmentByName64 (Context, SegmentName);
211}
212
215 IN OUT OC_MACHO_CONTEXT *Context,
216 IN MACH_SEGMENT_COMMAND_ANY *Segment,
217 IN CONST CHAR8 *SectionName
218 )
219{
220 ASSERT (Context != NULL);
221
222 return Context->Is32Bit ?
223 (MACH_SECTION_ANY *)MachoGetSectionByName32 (Context, &Segment->Segment32, SectionName) :
224 (MACH_SECTION_ANY *)MachoGetSectionByName64 (Context, &Segment->Segment64, SectionName);
225}
226
229 IN OUT OC_MACHO_CONTEXT *Context,
230 IN CONST CHAR8 *SegmentName,
231 IN CONST CHAR8 *SectionName
232 )
233{
234 ASSERT (Context != NULL);
235
236 return Context->Is32Bit ?
237 (MACH_SECTION_ANY *)MachoGetSegmentSectionByName32 (Context, SegmentName, SectionName) :
238 (MACH_SECTION_ANY *)MachoGetSegmentSectionByName64 (Context, SegmentName, SectionName);
239}
240
251STATIC
252BOOLEAN
254 IN OUT OC_MACHO_CONTEXT *Context,
255 IN MACH_SYMTAB_COMMAND *Symtab,
256 IN MACH_DYSYMTAB_COMMAND *DySymtab
257 )
258{
259 UINTN FileDataAddress;
260 CHAR8 *StringTable;
261 UINT32 FileSize;
262 UINT32 OffsetTop;
263 BOOLEAN Result;
264
265 MACH_NLIST_ANY *SymbolTable;
266 MACH_NLIST_ANY *IndirectSymtab;
267 MACH_RELOCATION_INFO *LocalRelocations;
268 MACH_RELOCATION_INFO *ExternRelocations;
269
270 VOID *Tmp;
271
272 ASSERT (Context != NULL);
273 ASSERT (Context->MachHeader != NULL);
274 ASSERT (Context->FileSize > 0);
275 ASSERT (Context->SymbolTable == NULL);
276
277 FileSize = Context->FileSize;
278
279 Result = BaseOverflowMulAddU32 (
280 Symtab->NumSymbols,
281 Context->Is32Bit ? sizeof (MACH_NLIST) : sizeof (MACH_NLIST_64),
282 Symtab->SymbolsOffset,
283 &OffsetTop
284 );
285 if (Result || (OffsetTop > FileSize)) {
286 return FALSE;
287 }
288
289 Result = BaseOverflowAddU32 (
290 Symtab->StringsOffset,
291 Symtab->StringsSize,
292 &OffsetTop
293 );
294 if (Result || (OffsetTop > FileSize)) {
295 return FALSE;
296 }
297
298 FileDataAddress = (UINTN)Context->FileData;
299 StringTable = (CHAR8 *)(FileDataAddress + Symtab->StringsOffset);
300
301 if ((Symtab->StringsSize == 0) || (StringTable[Symtab->StringsSize - 1] != '\0')) {
302 return FALSE;
303 }
304
305 SymbolTable = NULL;
306
307 Tmp = (VOID *)(FileDataAddress + Symtab->SymbolsOffset);
308 if (!(Context->Is32Bit ? BASE_TYPE_ALIGNED (MACH_NLIST, Tmp) : BASE_TYPE_ALIGNED (MACH_NLIST_64, Tmp))) {
309 return FALSE;
310 }
311
312 SymbolTable = (MACH_NLIST_ANY *)Tmp;
313 IndirectSymtab = NULL;
314 LocalRelocations = NULL;
315 ExternRelocations = NULL;
316
317 if (DySymtab != NULL) {
318 Result = BaseOverflowAddU32 (
319 DySymtab->LocalSymbolsIndex,
320 DySymtab->NumLocalSymbols,
321 &OffsetTop
322 );
323 if (Result || (OffsetTop > Symtab->NumSymbols)) {
324 return FALSE;
325 }
326
327 Result = BaseOverflowAddU32 (
328 DySymtab->ExternalSymbolsIndex,
329 DySymtab->NumExternalSymbols,
330 &OffsetTop
331 );
332 if (Result || (OffsetTop > Symtab->NumSymbols)) {
333 return FALSE;
334 }
335
336 Result = BaseOverflowAddU32 (
337 DySymtab->UndefinedSymbolsIndex,
338 DySymtab->NumUndefinedSymbols,
339 &OffsetTop
340 );
341 if (Result || (OffsetTop > Symtab->NumSymbols)) {
342 return FALSE;
343 }
344
345 //
346 // We additionally check for offset validity here, as KC kexts have some garbage
347 // in their DySymtab, but it is "valid" for symbols.
348 //
349 if ((DySymtab->NumIndirectSymbols > 0) && (DySymtab->IndirectSymbolsOffset != 0)) {
350 Result = BaseOverflowMulAddU32 (
351 DySymtab->NumIndirectSymbols,
352 Context->Is32Bit ? sizeof (MACH_NLIST) : sizeof (MACH_NLIST_64),
353 DySymtab->IndirectSymbolsOffset,
354 &OffsetTop
355 );
356 if (Result || (OffsetTop > FileSize)) {
357 return FALSE;
358 }
359
360 Tmp = (VOID *)(FileDataAddress + DySymtab->IndirectSymbolsOffset);
361 if (!(Context->Is32Bit ? BASE_TYPE_ALIGNED (MACH_NLIST, Tmp) : BASE_TYPE_ALIGNED (MACH_NLIST_64, Tmp))) {
362 return FALSE;
363 }
364
365 IndirectSymtab = (MACH_NLIST_ANY *)Tmp;
366 }
367
368 if ((DySymtab->NumOfLocalRelocations > 0) && (DySymtab->LocalRelocationsOffset != 0)) {
369 Result = BaseOverflowMulAddU32 (
370 DySymtab->NumOfLocalRelocations,
371 sizeof (MACH_RELOCATION_INFO),
372 DySymtab->LocalRelocationsOffset,
373 &OffsetTop
374 );
375 if (Result || (OffsetTop > FileSize)) {
376 return FALSE;
377 }
378
379 Tmp = (VOID *)(FileDataAddress + DySymtab->LocalRelocationsOffset);
380 if (!BASE_TYPE_ALIGNED (MACH_RELOCATION_INFO, Tmp)) {
381 return FALSE;
382 }
383
384 LocalRelocations = (MACH_RELOCATION_INFO *)Tmp;
385 }
386
387 if ((DySymtab->NumExternalRelocations > 0) && (DySymtab->ExternalRelocationsOffset != 0)) {
388 Result = BaseOverflowMulAddU32 (
389 DySymtab->NumExternalRelocations,
390 sizeof (MACH_RELOCATION_INFO),
391 DySymtab->ExternalRelocationsOffset,
392 &OffsetTop
393 );
394 if (Result || (OffsetTop > FileSize)) {
395 return FALSE;
396 }
397
398 Tmp = (VOID *)(FileDataAddress + DySymtab->ExternalRelocationsOffset);
399 if (!BASE_TYPE_ALIGNED (MACH_RELOCATION_INFO, Tmp)) {
400 return FALSE;
401 }
402
403 ExternRelocations = (MACH_RELOCATION_INFO *)Tmp;
404 }
405 }
406
407 //
408 // Store the symbol information.
409 //
410 Context->Symtab = Symtab;
411 Context->StringTable = StringTable;
412 Context->DySymtab = DySymtab;
413
414 Context->LocalRelocations = LocalRelocations;
415 Context->ExternRelocations = ExternRelocations;
416 Context->SymbolTable = SymbolTable;
417 Context->IndirectSymbolTable = IndirectSymtab;
418
419 return TRUE;
420}
421
422BOOLEAN
424 IN OUT OC_MACHO_CONTEXT *Context,
425 IN OC_MACHO_CONTEXT *SymsContext
426 )
427{
428 MACH_SYMTAB_COMMAND *Symtab;
429 MACH_DYSYMTAB_COMMAND *DySymtab;
430 BOOLEAN IsDyld;
431 MACH_HEADER_FLAGS MachFlags;
432 MACH_HEADER_FLAGS SymsMachFlags;
433
434 ASSERT (Context != NULL);
435 ASSERT (Context->MachHeader != NULL);
436 ASSERT (SymsContext != NULL);
437
438 if (Context->SymbolTable != NULL) {
439 return TRUE;
440 }
441
442 MachFlags = Context->Is32Bit ?
443 Context->MachHeader->Header32.Flags :
444 Context->MachHeader->Header64.Flags;
445 SymsMachFlags = SymsContext->Is32Bit ?
446 SymsContext->MachHeader->Header32.Flags :
447 SymsContext->MachHeader->Header64.Flags;
448
449 //
450 // We cannot use SymsContext's symbol tables if Context is flagged for DYLD
451 // and SymsContext is not.
452 //
453 IsDyld = (MachFlags & MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK) != 0;
454 if ( IsDyld
455 && ((SymsMachFlags & MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK) == 0))
456 {
457 return FALSE;
458 }
459
460 //
461 // Context initialisation guarantees the command size is a multiple of 8.
462 //
464 BASE_ALIGNOF (MACH_SYMTAB_COMMAND) <= sizeof (UINT64),
465 "Alignment is not guaranteed."
466 );
467
468 //
469 // Retrieve SYMTAB.
470 //
471 Symtab = (MACH_SYMTAB_COMMAND *)(VOID *)MachoGetNextCommand (
472 SymsContext,
474 NULL
475 );
476 if ((Symtab == NULL) || (Symtab->CommandSize != sizeof (*Symtab))) {
477 return FALSE;
478 }
479
480 DySymtab = NULL;
481
482 if (IsDyld) {
483 //
484 // Context initialisation guarantees the command size is a multiple of 8.
485 //
487 BASE_ALIGNOF (MACH_DYSYMTAB_COMMAND) <= sizeof (UINT64),
488 "Alignment is not guaranteed."
489 );
490
491 //
492 // Retrieve DYSYMTAB.
493 //
494 DySymtab = (MACH_DYSYMTAB_COMMAND *)(VOID *)MachoGetNextCommand (
495 SymsContext,
497 NULL
498 );
499 if ((DySymtab == NULL) || (DySymtab->CommandSize != sizeof (*DySymtab))) {
500 return FALSE;
501 }
502 }
503
504 return InternalInitialiseSymtabs (Context, Symtab, DySymtab);
505}
506
507BOOLEAN
509 IN OUT OC_MACHO_CONTEXT *Context
510 )
511{
512 //
513 // Retrieve the symbol information for Context from itself.
514 //
515 return MachoInitialiseSymtabsExternal (Context, Context);
516}
517
518UINT32
520 IN OUT OC_MACHO_CONTEXT *Context,
521 OUT CONST MACH_NLIST_ANY **SymbolTable,
522 OUT CONST CHAR8 **StringTable OPTIONAL,
523 OUT CONST MACH_NLIST_ANY **LocalSymbols OPTIONAL,
524 OUT UINT32 *NumLocalSymbols OPTIONAL,
525 OUT CONST MACH_NLIST_ANY **ExternalSymbols OPTIONAL,
526 OUT UINT32 *NumExternalSymbols OPTIONAL,
527 OUT CONST MACH_NLIST_ANY **UndefinedSymbols OPTIONAL,
528 OUT UINT32 *NumUndefinedSymbols OPTIONAL
529 )
530{
531 ASSERT (Context != NULL);
532
533 return Context->Is32Bit ?
535 Context,
536 (CONST MACH_NLIST **)SymbolTable,
537 StringTable,
538 (CONST MACH_NLIST **)LocalSymbols,
539 NumLocalSymbols,
540 (CONST MACH_NLIST **)ExternalSymbols,
541 NumExternalSymbols,
542 (CONST MACH_NLIST **)UndefinedSymbols,
543 NumUndefinedSymbols
544 ) :
546 Context,
547 (CONST MACH_NLIST_64 **)SymbolTable,
548 StringTable,
549 (CONST MACH_NLIST_64 **)LocalSymbols,
550 NumLocalSymbols,
551 (CONST MACH_NLIST_64 **)ExternalSymbols,
552 NumExternalSymbols,
553 (CONST MACH_NLIST_64 **)UndefinedSymbols,
554 NumUndefinedSymbols
555 );
556}
557
558UINT32
560 IN OUT OC_MACHO_CONTEXT *Context,
561 OUT CONST MACH_NLIST_ANY **SymbolTable
562 )
563{
564 ASSERT (Context != NULL);
565
566 return Context->Is32Bit ?
567 MachoGetIndirectSymbolTable32 (Context, (CONST MACH_NLIST **)SymbolTable) :
568 MachoGetIndirectSymbolTable64 (Context, (CONST MACH_NLIST_64 **)SymbolTable);
569}
570
571UINT64
573 IN VOID *Image
574 )
575{
577 BOOLEAN Is64Bit;
578 UINT32 NumCmds;
580 UINTN Index;
581 MACH_THREAD_COMMAND *ThreadCmd;
582 MACH_X86_THREAD_STATE *ThreadState;
583 UINT64 Address;
584
585 Address = 0;
586 Header = (MACH_HEADER_ANY *)Image;
587
588 if (Header->Signature == MACH_HEADER_SIGNATURE) {
589 //
590 // 32-bit header.
591 //
592 Is64Bit = FALSE;
593 NumCmds = Header->Header32.NumCommands;
594 Cmd = &Header->Header32.Commands[0];
595 } else if (Header->Signature == MACH_HEADER_64_SIGNATURE) {
596 //
597 // 64-bit header.
598 //
599 Is64Bit = TRUE;
600 NumCmds = Header->Header64.NumCommands;
601 Cmd = &Header->Header64.Commands[0];
602 } else {
603 //
604 // Invalid Mach-O image.
605 //
606 return Address;
607 }
608
609 //
610 // Iterate over load commands.
611 //
612 for (Index = 0; Index < NumCmds; ++Index) {
613 if (Cmd->CommandType == MACH_LOAD_COMMAND_UNIX_THREAD) {
614 ThreadCmd = (MACH_THREAD_COMMAND *)Cmd;
615 ThreadState = (MACH_X86_THREAD_STATE *)&ThreadCmd->ThreadState[0];
616 Address = Is64Bit ? ThreadState->State64.rip : ThreadState->State32.eip;
617 break;
618 }
619
620 Cmd = NEXT_MACH_LOAD_COMMAND (Cmd);
621 }
622
623 return Address;
624}
625
626VOID *
628 IN OUT OC_MACHO_CONTEXT *Context,
629 IN UINT64 Address,
630 OUT UINT32 *MaxSize OPTIONAL
631 )
632{
633 ASSERT (Context != NULL);
634
635 if (Context->Is32Bit) {
636 ASSERT (Address < MAX_UINT32);
637 }
638
639 return Context->Is32Bit ?
640 InternalMachoGetFilePointerByAddress32 (Context, (UINT32)Address, MaxSize) :
641 InternalMachoGetFilePointerByAddress64 (Context, Address, MaxSize);
642}
643
644UINT32
646 IN OC_MACHO_CONTEXT *Context,
647 OUT UINT8 *Destination,
648 IN UINT32 DestinationSize,
649 IN BOOLEAN Strip,
650 OUT UINT64 *FileOffset OPTIONAL
651 )
652{
653 ASSERT (Context != NULL);
654
655 return Context->Is32Bit ?
656 InternalMachoExpandImage32 (Context, FALSE, Destination, DestinationSize, Strip, FileOffset) :
657 InternalMachoExpandImage64 (Context, FALSE, Destination, DestinationSize, Strip, FileOffset);
658}
659
660UINT32
662 IN OC_MACHO_CONTEXT *Context
663 )
664{
665 ASSERT (Context != NULL);
666
667 return Context->Is32Bit ?
668 MACHO_ALIGN (InternalMachoExpandImage32 (Context, TRUE, NULL, 0, FALSE, NULL)) :
669 MACHO_ALIGN (InternalMachoExpandImage64 (Context, TRUE, NULL, 0, FALSE, NULL));
670}
671
672BOOLEAN
674 IN OUT OC_MACHO_CONTEXT *Context,
675 IN CONST CHAR8 *Prefix
676 )
677{
678 ASSERT (Context != NULL);
679
680 return Context->Is32Bit ?
681 InternalMachoMergeSegments32 (Context, Prefix) :
682 InternalMachoMergeSegments64 (Context, Prefix);
683}
VENDOR_DEVICE_PATH Header
#define MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK
UINT32 MACH_HEADER_FLAGS
#define MACH_LOAD_COMMAND_UUID
#define NEXT_MACH_LOAD_COMMAND(Command)
#define MACH_LOAD_COMMAND_DYSYMTAB
#define MACH_LOAD_COMMAND_UNIX_THREAD
#define MACH_LOAD_COMMAND_SYMTAB
UINT32 MACH_LOAD_COMMAND_TYPE
#define MACH_HEADER_SIGNATURE
the mach magic number
#define MACH_HEADER_64_SIGNATURE
the 64-bit mach magic number
UINT64 MachoRuntimeGetEntryAddress(IN VOID *Image)
Definition Header.c:572
UINT32 MachoGetInnerSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:55
STATIC BOOLEAN InternalInitialiseSymtabs(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SYMTAB_COMMAND *Symtab, IN MACH_DYSYMTAB_COMMAND *DySymtab)
Definition Header.c:253
UINT32 MachoGetFileSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:77
MACH_SECTION_ANY * MachoGetSectionByName(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_ANY *Segment, IN CONST CHAR8 *SectionName)
Definition Header.c:214
UINT64 MachoGetLastAddress(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:99
VOID * MachoGetFileData(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:66
VOID * MachoGetFilePointerByAddress(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
Definition Header.c:627
MACH_SEGMENT_COMMAND_ANY * MachoGetNextSegment(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_ANY *Segment OPTIONAL)
Definition Header.c:160
BOOLEAN MachoInitialiseSymtabsExternal(IN OUT OC_MACHO_CONTEXT *Context, IN OC_MACHO_CONTEXT *SymsContext)
Definition Header.c:423
UINT32 MachoExpandImage(IN OC_MACHO_CONTEXT *Context, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
Definition Header.c:645
MACH_HEADER_ANY * MachoGetMachHeader(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:44
BOOLEAN MachoInitializeContext(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize, IN BOOLEAN Is32Bit)
Definition Header.c:29
UINT32 MachoGetVmSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:88
UINT32 MachoGetSymbolTable(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_ANY **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST_ANY **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST_ANY **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST_ANY **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
Definition Header.c:519
BOOLEAN InternalRetrieveSymtabs(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:508
UINT32 MachoGetExpandedImageSize(IN OC_MACHO_CONTEXT *Context)
Definition Header.c:661
MACH_SECTION_ANY * MachoGetNextSection(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_ANY *Segment, IN MACH_SECTION_ANY *Section OPTIONAL)
Definition Header.c:173
UINT32 MachoGetIndirectSymbolTable(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_ANY **SymbolTable)
Definition Header.c:559
MACH_SEGMENT_COMMAND_ANY * MachoGetSegmentByName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
Definition Header.c:201
MACH_SECTION_ANY * MachoGetSectionByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
Definition Header.c:188
MACH_SECTION_ANY * MachoGetSegmentSectionByName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName, IN CONST CHAR8 *SectionName)
Definition Header.c:228
MACH_UUID_COMMAND * MachoGetUuid(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:124
MACH_LOAD_COMMAND * MachoGetNextCommand(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL)
Definition Header.c:110
BOOLEAN MachoMergeSegments(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Prefix)
Definition Header.c:673
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
MACH_SEGMENT_COMMAND_64 * MachoGetNextSegment64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL)
BOOLEAN MachoInitializeContext64(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize)
UINT32 MachoGetSymbolTable32(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
MACH_SECTION * MachoGetSectionByName32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND *Segment, IN CONST CHAR8 *SectionName)
MACH_SECTION_64 * MachoGetSegmentSectionByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName, IN CONST CHAR8 *SectionName)
MACH_SECTION * MachoGetNextSection32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND *Segment, IN MACH_SECTION *Section OPTIONAL)
MACH_SEGMENT_COMMAND * MachoGetSegmentByName32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
UINT32 MachoGetSymbolTable64(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_64 **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST_64 **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST_64 **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST_64 **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
UINT32 MachoGetIndirectSymbolTable32(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST **SymbolTable)
MACH_SECTION * MachoGetSegmentSectionByName32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName, IN CONST CHAR8 *SectionName)
BOOLEAN MachoInitializeContext32(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize)
MACH_SECTION_64 * MachoGetNextSection64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_64 *Segment, IN MACH_SECTION_64 *Section OPTIONAL)
MACH_SECTION_64 * MachoGetSectionByName64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_64 *Segment, IN CONST CHAR8 *SectionName)
MACH_SEGMENT_COMMAND * MachoGetNextSegment32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND *Segment OPTIONAL)
MACH_SECTION_64 * MachoGetSectionByIndex64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
MACH_SEGMENT_COMMAND_64 * MachoGetSegmentByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
#define MACHO_ALIGN(x)
Definition OcMachoLib.h:28
MACH_SECTION * MachoGetSectionByIndex32(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
UINT32 MachoGetIndirectSymbolTable64(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_64 **SymbolTable)
UINT32 InternalMachoExpandImage32(IN OC_MACHO_CONTEXT *Context, IN BOOLEAN CalculateSizeOnly, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
UINT32 InternalMachoGetLastAddress32(IN OUT OC_MACHO_CONTEXT *Context)
VOID * InternalMachoGetFilePointerByAddress64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
BOOLEAN InternalMachoMergeSegments32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Prefix)
UINT64 InternalMachoGetLastAddress64(IN OUT OC_MACHO_CONTEXT *Context)
UINT32 InternalMachoGetVmSize32(IN OUT OC_MACHO_CONTEXT *Context)
UINT32 InternalMachoExpandImage64(IN OC_MACHO_CONTEXT *Context, IN BOOLEAN CalculateSizeOnly, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
BOOLEAN InternalMachoMergeSegments64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Prefix)
MACH_LOAD_COMMAND * InternalMachoGetNextCommand64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL)
MACH_LOAD_COMMAND * InternalMachoGetNextCommand32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL)
UINT32 InternalMachoGetVmSize64(IN OUT OC_MACHO_CONTEXT *Context)
VOID * InternalMachoGetFilePointerByAddress32(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Address, OUT UINT32 *MaxSize OPTIONAL)
#define ASSERT(x)
Definition coder.h:55
MACH_X86_THREAD_STATE32 State32
MACH_X86_THREAD_STATE64 State64