OpenCore  1.0.5
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_RELOCATION_INFO *LocalRelocations;
267 MACH_RELOCATION_INFO *ExternRelocations;
268
269 VOID *Tmp;
270
271 ASSERT (Context != NULL);
272 ASSERT (Context->MachHeader != NULL);
273 ASSERT (Context->FileSize > 0);
274 ASSERT (Context->SymbolTable == NULL);
275
276 FileSize = Context->FileSize;
277
278 Result = BaseOverflowMulAddU32 (
279 Symtab->NumSymbols,
280 Context->Is32Bit ? sizeof (MACH_NLIST) : sizeof (MACH_NLIST_64),
281 Symtab->SymbolsOffset,
282 &OffsetTop
283 );
284 if (Result || (OffsetTop > FileSize)) {
285 return FALSE;
286 }
287
288 Result = BaseOverflowAddU32 (
289 Symtab->StringsOffset,
290 Symtab->StringsSize,
291 &OffsetTop
292 );
293 if (Result || (OffsetTop > FileSize)) {
294 return FALSE;
295 }
296
297 FileDataAddress = (UINTN)Context->FileData;
298 StringTable = (CHAR8 *)(FileDataAddress + Symtab->StringsOffset);
299
300 if ((Symtab->StringsSize == 0) || (StringTable[Symtab->StringsSize - 1] != '\0')) {
301 return FALSE;
302 }
303
304 SymbolTable = NULL;
305
306 Tmp = (VOID *)(FileDataAddress + Symtab->SymbolsOffset);
307 if (!(Context->Is32Bit ? BASE_TYPE_ALIGNED (MACH_NLIST, Tmp) : BASE_TYPE_ALIGNED (MACH_NLIST_64, Tmp))) {
308 return FALSE;
309 }
310
311 SymbolTable = (MACH_NLIST_ANY *)Tmp;
312 LocalRelocations = NULL;
313 ExternRelocations = NULL;
314
315 if (DySymtab != NULL) {
316 Result = BaseOverflowAddU32 (
317 DySymtab->LocalSymbolsIndex,
318 DySymtab->NumLocalSymbols,
319 &OffsetTop
320 );
321 if (Result || (OffsetTop > Symtab->NumSymbols)) {
322 return FALSE;
323 }
324
325 Result = BaseOverflowAddU32 (
326 DySymtab->ExternalSymbolsIndex,
327 DySymtab->NumExternalSymbols,
328 &OffsetTop
329 );
330 if (Result || (OffsetTop > Symtab->NumSymbols)) {
331 return FALSE;
332 }
333
334 Result = BaseOverflowAddU32 (
335 DySymtab->UndefinedSymbolsIndex,
336 DySymtab->NumUndefinedSymbols,
337 &OffsetTop
338 );
339 if (Result || (OffsetTop > Symtab->NumSymbols)) {
340 return FALSE;
341 }
342
343 if ((DySymtab->NumOfLocalRelocations > 0) && (DySymtab->LocalRelocationsOffset != 0)) {
344 Result = BaseOverflowMulAddU32 (
345 DySymtab->NumOfLocalRelocations,
346 sizeof (MACH_RELOCATION_INFO),
347 DySymtab->LocalRelocationsOffset,
348 &OffsetTop
349 );
350 if (Result || (OffsetTop > FileSize)) {
351 return FALSE;
352 }
353
354 Tmp = (VOID *)(FileDataAddress + DySymtab->LocalRelocationsOffset);
355 if (!BASE_TYPE_ALIGNED (MACH_RELOCATION_INFO, Tmp)) {
356 return FALSE;
357 }
358
359 LocalRelocations = (MACH_RELOCATION_INFO *)Tmp;
360 }
361
362 if ((DySymtab->NumExternalRelocations > 0) && (DySymtab->ExternalRelocationsOffset != 0)) {
363 Result = BaseOverflowMulAddU32 (
364 DySymtab->NumExternalRelocations,
365 sizeof (MACH_RELOCATION_INFO),
366 DySymtab->ExternalRelocationsOffset,
367 &OffsetTop
368 );
369 if (Result || (OffsetTop > FileSize)) {
370 return FALSE;
371 }
372
373 Tmp = (VOID *)(FileDataAddress + DySymtab->ExternalRelocationsOffset);
374 if (!BASE_TYPE_ALIGNED (MACH_RELOCATION_INFO, Tmp)) {
375 return FALSE;
376 }
377
378 ExternRelocations = (MACH_RELOCATION_INFO *)Tmp;
379 }
380 }
381
382 //
383 // Store the symbol information.
384 //
385 Context->Symtab = Symtab;
386 Context->StringTable = StringTable;
387 Context->DySymtab = DySymtab;
388
389 Context->LocalRelocations = LocalRelocations;
390 Context->ExternRelocations = ExternRelocations;
391 Context->SymbolTable = SymbolTable;
392
393 return TRUE;
394}
395
396BOOLEAN
398 IN OUT OC_MACHO_CONTEXT *Context,
399 IN OC_MACHO_CONTEXT *SymsContext
400 )
401{
402 MACH_SYMTAB_COMMAND *Symtab;
403 MACH_DYSYMTAB_COMMAND *DySymtab;
404 BOOLEAN IsDyld;
405 MACH_HEADER_FLAGS MachFlags;
406 MACH_HEADER_FLAGS SymsMachFlags;
407
408 ASSERT (Context != NULL);
409 ASSERT (Context->MachHeader != NULL);
410 ASSERT (SymsContext != NULL);
411
412 if (Context->SymbolTable != NULL) {
413 return TRUE;
414 }
415
416 MachFlags = Context->Is32Bit ?
417 Context->MachHeader->Header32.Flags :
418 Context->MachHeader->Header64.Flags;
419 SymsMachFlags = SymsContext->Is32Bit ?
420 SymsContext->MachHeader->Header32.Flags :
421 SymsContext->MachHeader->Header64.Flags;
422
423 //
424 // We cannot use SymsContext's symbol tables if Context is flagged for DYLD
425 // and SymsContext is not.
426 //
427 IsDyld = (MachFlags & MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK) != 0;
428 if ( IsDyld
429 && ((SymsMachFlags & MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK) == 0))
430 {
431 return FALSE;
432 }
433
434 //
435 // Context initialisation guarantees the command size is a multiple of 8.
436 //
438 BASE_ALIGNOF (MACH_SYMTAB_COMMAND) <= sizeof (UINT64),
439 "Alignment is not guaranteed."
440 );
441
442 //
443 // Retrieve SYMTAB.
444 //
445 Symtab = (MACH_SYMTAB_COMMAND *)(VOID *)MachoGetNextCommand (
446 SymsContext,
448 NULL
449 );
450 if ((Symtab == NULL) || (Symtab->CommandSize != sizeof (*Symtab))) {
451 return FALSE;
452 }
453
454 DySymtab = NULL;
455
456 if (IsDyld) {
457 //
458 // Context initialisation guarantees the command size is a multiple of 8.
459 //
461 BASE_ALIGNOF (MACH_DYSYMTAB_COMMAND) <= sizeof (UINT64),
462 "Alignment is not guaranteed."
463 );
464
465 //
466 // Retrieve DYSYMTAB.
467 //
468 DySymtab = (MACH_DYSYMTAB_COMMAND *)(VOID *)MachoGetNextCommand (
469 SymsContext,
471 NULL
472 );
473 if ((DySymtab == NULL) || (DySymtab->CommandSize != sizeof (*DySymtab))) {
474 return FALSE;
475 }
476 }
477
478 return InternalInitialiseSymtabs (Context, Symtab, DySymtab);
479}
480
481BOOLEAN
483 IN OUT OC_MACHO_CONTEXT *Context
484 )
485{
486 //
487 // Retrieve the symbol information for Context from itself.
488 //
489 return MachoInitialiseSymtabsExternal (Context, Context);
490}
491
492UINT32
494 IN OUT OC_MACHO_CONTEXT *Context,
495 OUT CONST MACH_NLIST_ANY **SymbolTable,
496 OUT CONST CHAR8 **StringTable OPTIONAL,
497 OUT CONST MACH_NLIST_ANY **LocalSymbols OPTIONAL,
498 OUT UINT32 *NumLocalSymbols OPTIONAL,
499 OUT CONST MACH_NLIST_ANY **ExternalSymbols OPTIONAL,
500 OUT UINT32 *NumExternalSymbols OPTIONAL,
501 OUT CONST MACH_NLIST_ANY **UndefinedSymbols OPTIONAL,
502 OUT UINT32 *NumUndefinedSymbols OPTIONAL
503 )
504{
505 ASSERT (Context != NULL);
506
507 return Context->Is32Bit ?
509 Context,
510 (CONST MACH_NLIST **)SymbolTable,
511 StringTable,
512 (CONST MACH_NLIST **)LocalSymbols,
513 NumLocalSymbols,
514 (CONST MACH_NLIST **)ExternalSymbols,
515 NumExternalSymbols,
516 (CONST MACH_NLIST **)UndefinedSymbols,
517 NumUndefinedSymbols
518 ) :
520 Context,
521 (CONST MACH_NLIST_64 **)SymbolTable,
522 StringTable,
523 (CONST MACH_NLIST_64 **)LocalSymbols,
524 NumLocalSymbols,
525 (CONST MACH_NLIST_64 **)ExternalSymbols,
526 NumExternalSymbols,
527 (CONST MACH_NLIST_64 **)UndefinedSymbols,
528 NumUndefinedSymbols
529 );
530}
531
532UINT64
534 IN VOID *Image
535 )
536{
538 BOOLEAN Is64Bit;
539 UINT32 NumCmds;
541 UINTN Index;
542 MACH_THREAD_COMMAND *ThreadCmd;
543 MACH_X86_THREAD_STATE *ThreadState;
544 UINT64 Address;
545
546 Address = 0;
547 Header = (MACH_HEADER_ANY *)Image;
548
549 if (Header->Signature == MACH_HEADER_SIGNATURE) {
550 //
551 // 32-bit header.
552 //
553 Is64Bit = FALSE;
554 NumCmds = Header->Header32.NumCommands;
555 Cmd = &Header->Header32.Commands[0];
556 } else if (Header->Signature == MACH_HEADER_64_SIGNATURE) {
557 //
558 // 64-bit header.
559 //
560 Is64Bit = TRUE;
561 NumCmds = Header->Header64.NumCommands;
562 Cmd = &Header->Header64.Commands[0];
563 } else {
564 //
565 // Invalid Mach-O image.
566 //
567 return Address;
568 }
569
570 //
571 // Iterate over load commands.
572 //
573 for (Index = 0; Index < NumCmds; ++Index) {
574 if (Cmd->CommandType == MACH_LOAD_COMMAND_UNIX_THREAD) {
575 ThreadCmd = (MACH_THREAD_COMMAND *)Cmd;
576 ThreadState = (MACH_X86_THREAD_STATE *)&ThreadCmd->ThreadState[0];
577 Address = Is64Bit ? ThreadState->State64.rip : ThreadState->State32.eip;
578 break;
579 }
580
581 Cmd = NEXT_MACH_LOAD_COMMAND (Cmd);
582 }
583
584 return Address;
585}
586
587VOID *
589 IN OUT OC_MACHO_CONTEXT *Context,
590 IN UINT64 Address,
591 OUT UINT32 *MaxSize OPTIONAL
592 )
593{
594 ASSERT (Context != NULL);
595
596 if (Context->Is32Bit) {
597 ASSERT (Address < MAX_UINT32);
598 }
599
600 return Context->Is32Bit ?
601 InternalMachoGetFilePointerByAddress32 (Context, (UINT32)Address, MaxSize) :
602 InternalMachoGetFilePointerByAddress64 (Context, Address, MaxSize);
603}
604
605UINT32
607 IN OC_MACHO_CONTEXT *Context,
608 OUT UINT8 *Destination,
609 IN UINT32 DestinationSize,
610 IN BOOLEAN Strip,
611 OUT UINT64 *FileOffset OPTIONAL
612 )
613{
614 ASSERT (Context != NULL);
615
616 return Context->Is32Bit ?
617 InternalMachoExpandImage32 (Context, FALSE, Destination, DestinationSize, Strip, FileOffset) :
618 InternalMachoExpandImage64 (Context, FALSE, Destination, DestinationSize, Strip, FileOffset);
619}
620
621UINT32
623 IN OC_MACHO_CONTEXT *Context
624 )
625{
626 ASSERT (Context != NULL);
627
628 return Context->Is32Bit ?
629 MACHO_ALIGN (InternalMachoExpandImage32 (Context, TRUE, NULL, 0, FALSE, NULL)) :
630 MACHO_ALIGN (InternalMachoExpandImage64 (Context, TRUE, NULL, 0, FALSE, NULL));
631}
632
633BOOLEAN
635 IN OUT OC_MACHO_CONTEXT *Context,
636 IN CONST CHAR8 *Prefix
637 )
638{
639 ASSERT (Context != NULL);
640
641 return Context->Is32Bit ?
642 InternalMachoMergeSegments32 (Context, Prefix) :
643 InternalMachoMergeSegments64 (Context, Prefix);
644}
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:533
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:588
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:397
UINT32 MachoExpandImage(IN OC_MACHO_CONTEXT *Context, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
Definition Header.c:606
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:493
BOOLEAN InternalRetrieveSymtabs(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:482
UINT32 MachoGetExpandedImageSize(IN OC_MACHO_CONTEXT *Context)
Definition Header.c:622
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
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:634
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)
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 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