19#include <Library/BaseLib.h>
20#include <Library/BaseMemoryLib.h>
21#include <Library/BaseOverflowLib.h>
22#include <Library/DebugLib.h>
26#define CXX_PREFIX "__Z"
27#define VTABLE_PREFIX CXX_PREFIX "TV"
28#define OSOBJ_PREFIX CXX_PREFIX "N"
29#define RESERVED_TOKEN "_RESERVED"
30#define METACLASS_TOKEN "10gMetaClassE"
31#define SMCP_TOKEN "10superClassE"
32#define METACLASS_VTABLE_PREFIX VTABLE_PREFIX "N"
33#define METACLASS_VTABLE_SUFFIX "9MetaClassE"
34#define CXX_PURE_VIRTUAL "___cxa_pure_virtual"
35#define FINAL_CLASS_TOKEN "14__OSFinalClassEv"
37#define VTABLE_ENTRY_SIZE_64 8U
38#define VTABLE_HEADER_LEN_64 2U
39#define VTABLE_HEADER_SIZE_64 (VTABLE_HEADER_LEN_64 * VTABLE_ENTRY_SIZE_64)
62 IN CONST CHAR8 *SymbolName
68 ASSERT (SymbolName != NULL);
90 IN CONST CHAR8 *SymbolName
96 ASSERT (SymbolName != NULL);
105 if ( (Suffix == NULL)
118 IN CONST CHAR8 *SmcpName,
119 IN UINTN ClassNameSize,
128 ASSERT (SmcpName != NULL);
129 ASSERT (ClassNameSize > 0);
130 ASSERT (ClassName != NULL);
132 ASSERT (Context->StringTable != NULL);
139 OutputSize = (AsciiStrLen (SmcpName) - PrefixSize - SuffixSize);
141 if ((OutputSize + 1) > ClassNameSize) {
145 CopyMem (ClassName, &SmcpName[PrefixSize], OutputSize);
146 ClassName[OutputSize] =
'\0';
153 IN CONST CHAR8 *VtableName
156 ASSERT (VtableName != NULL);
166 IN CONST CHAR8 *ClassName,
167 IN UINTN FunctionPrefixSize,
168 OUT CHAR8 *FunctionPrefix
176 ASSERT (ClassName != NULL);
177 ASSERT (FunctionPrefixSize > 0);
178 ASSERT (FunctionPrefix != NULL);
180 BodySize = AsciiStrSize (ClassName);
182 if (Result || (FunctionPrefixSize < TotalSize)) {
188 &FunctionPrefix[Index],
195 &FunctionPrefix[Index],
206 IN CONST CHAR8 *MetaClassName,
207 IN UINTN ClassNameSize,
213 UINTN ClassNameLength;
216 ASSERT (MetaClassName != NULL);
217 ASSERT (ClassNameSize > 0);
218 ASSERT (ClassName != NULL);
220 ASSERT (Context->StringTable != NULL);
227 ClassNameLength = (AsciiStrLen (MetaClassName) - PrefixSize - SuffixSize);
228 if ((ClassNameLength + 1) > ClassNameSize) {
232 CopyMem (ClassName, &MetaClassName[PrefixSize], ClassNameLength);
233 ClassName[ClassNameLength] =
'\0';
240 IN CONST CHAR8 *ClassName,
241 IN UINTN VtableNameSize,
242 OUT CHAR8 *VtableName
250 ASSERT (ClassName != NULL);
251 ASSERT (VtableNameSize > 0);
252 ASSERT (VtableName != NULL);
254 BodySize = AsciiStrSize (ClassName);
256 Result = BaseOverflowAddUN (
261 if (Result || (VtableNameSize < TotalSize)) {
273 CopyMem (&VtableName[Index], ClassName, BodySize);
280 IN CONST CHAR8 *ClassName,
281 IN UINTN VtableNameSize,
282 OUT CHAR8 *VtableName
290 ASSERT (ClassName != NULL);
291 ASSERT (VtableNameSize > 0);
292 ASSERT (VtableName != NULL);
294 BodyLength = AsciiStrLen (ClassName);
296 Result = BaseOverflowTriAddUN (
302 if (Result || (VtableNameSize < TotalSize)) {
314 CopyMem (&VtableName[Index], ClassName, BodyLength);
328 IN CONST CHAR8 *ClassName,
329 IN UINTN FinalSymbolNameSize,
330 OUT CHAR8 *FinalSymbolName
338 ASSERT (ClassName != NULL);
339 ASSERT (FinalSymbolNameSize > 0);
340 ASSERT (FinalSymbolName != NULL);
342 BodyLength = AsciiStrLen (ClassName);
344 Result = BaseOverflowTriAddUN (
350 if (Result || (FinalSymbolNameSize < TotalSize)) {
356 &FinalSymbolName[Index],
363 &FinalSymbolName[Index],
370 &FinalSymbolName[Index],
380 IN CONST CHAR8 *SymbolName
383 ASSERT (SymbolName != NULL);
407 return Context->Is32Bit ?
415 IN CONST CHAR8 *SmcpName,
422 return Context->Is32Bit ?
BOOLEAN MachoSymbolNameIsCxx(IN CONST CHAR8 *Name)
BOOLEAN MachoSymbolNameIsPadslot(IN CONST CHAR8 *Name)
BOOLEAN MachoGetClassNameFromMetaClassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *MetaClassName, IN UINTN ClassNameSize, OUT CHAR8 *ClassName)
BOOLEAN MachoGetClassNameFromSuperMetaClassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, IN UINTN ClassNameSize, OUT CHAR8 *ClassName)
#define FINAL_CLASS_TOKEN
CONST CHAR8 * MachoGetClassNameFromVtableName(IN CONST CHAR8 *VtableName)
BOOLEAN MachoGetVtableSymbolsFromSmcp(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, OUT CONST MACH_NLIST_ANY **Vtable, OUT CONST MACH_NLIST_ANY **MetaVtable)
BOOLEAN MachoGetFunctionPrefixFromClassName(IN CONST CHAR8 *ClassName, IN UINTN FunctionPrefixSize, OUT CHAR8 *FunctionPrefix)
#define METACLASS_VTABLE_PREFIX
BOOLEAN MachoGetFinalSymbolNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN FinalSymbolNameSize, OUT CHAR8 *FinalSymbolName)
MACH_NLIST_ANY * MachoGetMetaclassSymbolFromSmcpSymbol(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_ANY *Smcp)
BOOLEAN MachoSymbolNameIsMetaclassPointer(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SymbolName)
BOOLEAN MachoSymbolNameIsVtable(IN CONST CHAR8 *SymbolName)
BOOLEAN MachoGetVtableNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN VtableNameSize, OUT CHAR8 *VtableName)
BOOLEAN MachoSymbolNameIsSmcp(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SymbolName)
BOOLEAN MachoSymbolNameIsPureVirtual(IN CONST CHAR8 *Name)
BOOLEAN MachoGetMetaVtableNameFromClassName(IN CONST CHAR8 *ClassName, IN UINTN VtableNameSize, OUT CHAR8 *VtableName)
#define METACLASS_VTABLE_SUFFIX
MACH_NLIST_64 * MachoGetMetaclassSymbolFromSmcpSymbol64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_64 *Smcp)
BOOLEAN MachoGetVtableSymbolsFromSmcp32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, OUT CONST MACH_NLIST **Vtable, OUT CONST MACH_NLIST **MetaVtable)
MACH_NLIST * MachoGetMetaclassSymbolFromSmcpSymbol32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST *Smcp)
BOOLEAN MachoGetVtableSymbolsFromSmcp64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SmcpName, OUT CONST MACH_NLIST_64 **Vtable, OUT CONST MACH_NLIST_64 **MetaVtable)
#define L_STR_LEN(String)
#define L_STR_SIZE(String)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)