implemented VXCustomSymbolResolver

made internal routines in VXInstructionFormatterC.c static
This commit is contained in:
Ende! 2015-03-16 00:09:31 +01:00
parent ff09bd32eb
commit d851e83a59
3 changed files with 115 additions and 44 deletions

View File

@ -45,12 +45,13 @@
/* VXBaseSymbolResolver ------------------------------------------------------------------------ */ /* VXBaseSymbolResolver ------------------------------------------------------------------------ */
typedef const char* (*VXBaseSymbolResolver_DestructionCallback)( typedef void (*VXBaseSymbolResolver_DestructionCallback)(
VXBaseSymbolResolverContext *ctx); VXBaseSymbolResolverContext *ctx);
typedef const char* (*VXBaseSymbolResolver_ResolveSymbolCallback)( typedef const char* (*VXBaseSymbolResolver_ResolveSymbolCallback)(
VXBaseSymbolResolverContext *ctx, VXBaseSymbolResolverContext *ctx,
const VXInstructionInfo *info, const VXInstructionInfo *info,
uint64_t address, uint64_t *offset); uint64_t address,
uint64_t *offset);
typedef struct _VXBaseSymbolResolver typedef struct _VXBaseSymbolResolver
{ {
@ -58,6 +59,8 @@ typedef struct _VXBaseSymbolResolver
VXBaseSymbolResolver_ResolveSymbolCallback resolveCallback; VXBaseSymbolResolver_ResolveSymbolCallback resolveCallback;
} VXBaseSymbolResolver; } VXBaseSymbolResolver;
void VXBaseSymbolResolver_Construct(VXBaseSymbolResolverContext *ctx);
void VXBaseSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx);
void VXBaseSymbolResolver_Release(VXBaseSymbolResolverContext *ctx); void VXBaseSymbolResolver_Release(VXBaseSymbolResolverContext *ctx);
const char* VXBaseSymbolResolver_ResolveSymbol(VXBaseSymbolResolverContext *ctx, const VXInstructionInfo *info, uint64_t address, uint64_t *offset); const char* VXBaseSymbolResolver_ResolveSymbol(VXBaseSymbolResolverContext *ctx, const VXInstructionInfo *info, uint64_t address, uint64_t *offset);
@ -96,6 +99,20 @@ void VXBaseInstructionFormatter_OutputAppendAddress(VXBaseInstructionFormatterCo
void VXBaseInstructionFormatter_OutputAppendImmediate(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand, bool resolveSymbols); void VXBaseInstructionFormatter_OutputAppendImmediate(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand, bool resolveSymbols);
void VXBaseInstructionFormatter_OutputAppendDisplacement(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand); void VXBaseInstructionFormatter_OutputAppendDisplacement(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand);
/* VXCustomSymbolResolver ---------------------------------------------------------------------- */
typedef struct _VXCustomSymbolResolver
{
VXBaseSymbolResolver super;
VXCustomSymbolResolver_ResolveSymbolCallback resolve;
void *userData;
} VXCustomSymbolResolver;
void VXCustomSymbolResolver_Construct(VXBaseSymbolResolverContext *ctx, VXCustomSymbolResolver_ResolveSymbolCallback resolverCb, void *userData);
void VXCustomSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx);
VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create(VXCustomSymbolResolver_ResolveSymbolCallback resolverCb, void *userData);
const char* VXCustomSymbolResolver_Resolve(VXBaseSymbolResolverContext *ctx, const VXInstructionInfo *info, uint64_t address, uint64_t *offset);
/* VXIntelInstructionFormatter ----------------------------------------------------------------- */ /* VXIntelInstructionFormatter ----------------------------------------------------------------- */
typedef struct _VXIntelInstructionFormatter typedef struct _VXIntelInstructionFormatter
@ -109,19 +126,20 @@ void VXIntelInstructionFormatter_OutputAppendOperandCast(VXBaseInstructionFormat
void VXIntelInstructionFormatter_FormatOperand(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand); void VXIntelInstructionFormatter_FormatOperand(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXOperandInfo *operand);
void VXIntelInstructionFormatter_InternalFormatInstruction(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info); void VXIntelInstructionFormatter_InternalFormatInstruction(VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info);
/* VXExactSymbolResolver ----------------------------------------------------------------------- */
typedef struct _VXExactSymbolResolver
{
VXBaseSymbolResolver super;
} VXExactSymbolResolver;
// TODO
/* Implementation ============================================================================== */ /* Implementation ============================================================================== */
/* VXBaseSymbolResolver ------------------------------------------------------------------------ */ /* VXBaseSymbolResolver ------------------------------------------------------------------------ */
void VXBaseSymbolResolver_Construct(VXBaseSymbolResolverContext *ctx)
{
memset(VXBaseSymbolResolver_thiz(ctx), 0, sizeof(VXBaseSymbolResolver));
}
void VXBaseSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx)
{
}
void VXBaseSymbolResolver_Release( void VXBaseSymbolResolver_Release(
VXBaseSymbolResolverContext *ctx) VXBaseSymbolResolverContext *ctx)
{ {
@ -146,9 +164,54 @@ const char* VXBaseSymbolResolver_ResolveSymbol(
return VXBaseSymbolResolver_thiz(ctx)->resolveCallback(ctx, info, address, offset); return VXBaseSymbolResolver_thiz(ctx)->resolveCallback(ctx, info, address, offset);
} }
/* VXCustomSymbolResolver ---------------------------------------------------------------------- */
static void VXCustomSymbolResolver_Construct(
VXBaseSymbolResolverContext *ctx,
VXCustomSymbolResolver_ResolveSymbolCallback resolverCb,
void *userData)
{
VXBaseSymbolResolver_Construct(ctx);
VXCustomSymbolResolver *thiz = VXCustomSymbolResolver_thiz(ctx);
thiz->super.destruct = &VXCustomSymbolResolver_Destruct;
thiz->super.resolveCallback = &VXCustomSymbolResolver_Resolve;
thiz->resolve = resolverCb;
thiz->userData = userData;
}
static void VXCustomSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx)
{
VXBaseSymbolResolver_Destruct(ctx);
}
VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create(
VXCustomSymbolResolver_ResolveSymbolCallback resolverCb,
void *userData)
{
VXCustomSymbolResolver *thiz = malloc(sizeof(VXCustomSymbolResolver));
VXBaseSymbolResolverContext *ctx = malloc(sizeof(VXBaseSymbolResolverContext));
ctx->d.type = TYPE_CUSTOMSYMBOLRESOLVER;
ctx->d.ptr = thiz;
return ctx;
}
static const char* VXCustomSymbolResolver_Resolve(
VXBaseSymbolResolverContext *ctx,
const VXInstructionInfo *info,
uint64_t address,
uint64_t *offset)
{
VXCustomSymbolResolver *thiz = VXCustomSymbolResolver_thiz(ctx);
return thiz->resolve(info, address, offset, thiz->userData);
}
/* VXBaseInstructionFormatter ------------------------------------------------------------------ */ /* VXBaseInstructionFormatter ------------------------------------------------------------------ */
const char* VXBaseInstructionFormatter_registerStrings[] = static const char* VXBaseInstructionFormatter_registerStrings[] =
{ {
/* 8 bit general purpose registers */ /* 8 bit general purpose registers */
"al", "cl", "dl", "bl", "al", "cl", "dl", "bl",
@ -204,7 +267,7 @@ const char* VXBaseInstructionFormatter_registerStrings[] =
"rip" "rip"
}; };
void VXBaseInstructionFormatter_Construct( static void VXBaseInstructionFormatter_Construct(
VXBaseInstructionFormatterContext *ctx, VXBaseSymbolResolverContext *symbolResolver) VXBaseInstructionFormatterContext *ctx, VXBaseSymbolResolverContext *symbolResolver)
{ {
VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx); VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx);
@ -218,7 +281,7 @@ void VXBaseInstructionFormatter_Construct(
thiz->outputBuffer = malloc(thiz->outputBufferCapacity); thiz->outputBuffer = malloc(thiz->outputBufferCapacity);
} }
void VXBaseInstructionFormatter_Destruct(VXBaseInstructionFormatterContext *ctx) static void VXBaseInstructionFormatter_Destruct(VXBaseInstructionFormatterContext *ctx)
{ {
VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx); VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx);
@ -243,13 +306,13 @@ void VXBaseInstructionFormatter_Release(
free(ctx); free(ctx);
} }
void VXBaseInstructionFormatter_OutputSetUppercase(VXBaseInstructionFormatterContext *ctx, static void VXBaseInstructionFormatter_OutputSetUppercase(VXBaseInstructionFormatterContext *ctx,
bool uppercase) bool uppercase)
{ {
VXBaseInstructionFormatter_thiz(ctx)->outputUppercase = uppercase; VXBaseInstructionFormatter_thiz(ctx)->outputUppercase = uppercase;
} }
char const* VXBaseInstructionFormatter_RegisterToString( static char const* VXBaseInstructionFormatter_RegisterToString(
const VXBaseInstructionFormatterContext *ctx, VXRegister reg) const VXBaseInstructionFormatterContext *ctx, VXRegister reg)
{ {
if (reg == REG_NONE) if (reg == REG_NONE)
@ -259,7 +322,7 @@ char const* VXBaseInstructionFormatter_RegisterToString(
return VXBaseInstructionFormatter_registerStrings[reg - 1]; return VXBaseInstructionFormatter_registerStrings[reg - 1];
} }
char const* VXBaseInstructionFormatter_ResolveSymbol( static char const* VXBaseInstructionFormatter_ResolveSymbol(
const VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, const VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
uint64_t address, uint64_t *offset) uint64_t address, uint64_t *offset)
{ {
@ -307,17 +370,17 @@ const char* VXBaseInstructionFormatter_FormatInstruction(
return VXBaseInstructionFormatter_OutputString(ctx); return VXBaseInstructionFormatter_OutputString(ctx);
} }
void VXBaseInstructionFormatter_OutputClear(VXBaseInstructionFormatterContext *ctx) static void VXBaseInstructionFormatter_OutputClear(VXBaseInstructionFormatterContext *ctx)
{ {
VXBaseInstructionFormatter_thiz(ctx)->outputStringLen = 0; VXBaseInstructionFormatter_thiz(ctx)->outputStringLen = 0;
} }
char const* VXBaseInstructionFormatter_OutputString(VXBaseInstructionFormatterContext *ctx) static char const* VXBaseInstructionFormatter_OutputString(VXBaseInstructionFormatterContext *ctx)
{ {
return &VXBaseInstructionFormatter_thiz(ctx)->outputBuffer[0]; return &VXBaseInstructionFormatter_thiz(ctx)->outputBuffer[0];
} }
void VXBaseInstructionFormatter_OutputAppend( static void VXBaseInstructionFormatter_OutputAppend(
VXBaseInstructionFormatterContext *ctx, char const *text) VXBaseInstructionFormatterContext *ctx, char const *text)
{ {
VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx); VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx);
@ -356,7 +419,7 @@ void VXBaseInstructionFormatter_OutputAppend(
} }
} }
void VXBaseInstructionFormatter_OutputAppendFormatted( static void VXBaseInstructionFormatter_OutputAppendFormatted(
VXBaseInstructionFormatterContext *ctx, char const *format, ...) VXBaseInstructionFormatterContext *ctx, char const *format, ...)
{ {
VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx); VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx);
@ -410,7 +473,7 @@ void VXBaseInstructionFormatter_OutputAppendFormatted(
va_end(arguments); va_end(arguments);
} }
void VXBaseInstructionFormatter_OutputAppendAddress( static void VXBaseInstructionFormatter_OutputAppendAddress(
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
uint64_t address, bool resolveSymbols) uint64_t address, bool resolveSymbols)
{ {
@ -454,8 +517,11 @@ void VXBaseInstructionFormatter_OutputAppendAddress(
} }
} }
void VXBaseInstructionFormatter_OutputAppendImmediate(VXBaseInstructionFormatterContext *ctx, static void VXBaseInstructionFormatter_OutputAppendImmediate(
const VXInstructionInfo *info, const VXOperandInfo *operand, bool resolveSymbols) VXBaseInstructionFormatterContext *ctx,
const VXInstructionInfo *info,
const VXOperandInfo *operand,
bool resolveSymbols)
{ {
VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx); VXBaseInstructionFormatter *thiz = VXBaseInstructionFormatter_thiz(ctx);
@ -523,7 +589,7 @@ void VXBaseInstructionFormatter_OutputAppendImmediate(VXBaseInstructionFormatter
} }
} }
void VXBaseInstructionFormatter_OutputAppendDisplacement( static void VXBaseInstructionFormatter_OutputAppendDisplacement(
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
const VXOperandInfo *operand) const VXOperandInfo *operand)
{ {
@ -551,7 +617,8 @@ void VXBaseInstructionFormatter_OutputAppendDisplacement(
assert(0); assert(0);
} }
VXBaseInstructionFormatter_OutputAppendFormatted(ctx, "%.2llX", value); VXBaseInstructionFormatter_OutputAppendFormatted(ctx, "%.2llX", value);
} else }
else
{ {
// The displacement value might be negative // The displacement value might be negative
assert(operand->offset != 64); assert(operand->offset != 64);
@ -583,7 +650,7 @@ void VXBaseInstructionFormatter_OutputAppendDisplacement(
/* VXIntelInstructionFormatter ----------------------------------------------------------------- */ /* VXIntelInstructionFormatter ----------------------------------------------------------------- */
void VXIntelInstructionFormatter_Construct(VXBaseInstructionFormatterContext *ctx, static void VXIntelInstructionFormatter_Construct(VXBaseInstructionFormatterContext *ctx,
VXBaseSymbolResolverContext* symbolResolver) VXBaseSymbolResolverContext* symbolResolver)
{ {
VXBaseInstructionFormatter_Construct(ctx, symbolResolver); VXBaseInstructionFormatter_Construct(ctx, symbolResolver);
@ -593,7 +660,7 @@ void VXIntelInstructionFormatter_Construct(VXBaseInstructionFormatterContext *ct
thiz->super.internalFormat = &VXIntelInstructionFormatter_InternalFormatInstruction; thiz->super.internalFormat = &VXIntelInstructionFormatter_InternalFormatInstruction;
} }
void VXIntelInstructionFormatter_Destruct(VXBaseInstructionFormatterContext *ctx) static void VXIntelInstructionFormatter_Destruct(VXBaseInstructionFormatterContext *ctx)
{ {
VXBaseInstructionFormatter_Destruct(ctx); VXBaseInstructionFormatter_Destruct(ctx);
} }
@ -617,8 +684,9 @@ VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
return ctx; return ctx;
} }
void VXIntelInstructionFormatter_OutputAppendOperandCast( static void VXIntelInstructionFormatter_OutputAppendOperandCast(
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, VXBaseInstructionFormatterContext *ctx,
const VXInstructionInfo *info,
const VXOperandInfo *operand) const VXOperandInfo *operand)
{ {
switch(operand->size) switch(operand->size)
@ -649,8 +717,9 @@ void VXIntelInstructionFormatter_OutputAppendOperandCast(
} }
} }
void VXIntelInstructionFormatter_FormatOperand( static void VXIntelInstructionFormatter_FormatOperand(
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, VXBaseInstructionFormatterContext *ctx,
const VXInstructionInfo *info,
const VXOperandInfo *operand) const VXOperandInfo *operand)
{ {
switch (operand->type) switch (operand->type)
@ -738,7 +807,7 @@ void VXIntelInstructionFormatter_FormatOperand(
} }
} }
void VXIntelInstructionFormatter_InternalFormatInstruction( static void VXIntelInstructionFormatter_InternalFormatInstruction(
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info) VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info)
{ {
// Append string prefixes // Append string prefixes

View File

@ -73,7 +73,7 @@ const char* VXBaseSymbolResolver_ResolveSymbol(
/* VXCustomSymbolResolver ====================================================================== */ /* VXCustomSymbolResolver ====================================================================== */
typedef const char* (*VXResolveSymbol_t)( typedef const char* (*VXCustomSymbolResolver_ResolveSymbolCallback)(
const VXInstructionInfo *info, const VXInstructionInfo *info,
uint64_t address, uint64_t address,
uint64_t *offset, uint64_t *offset,
@ -87,7 +87,7 @@ typedef const char* (*VXResolveSymbol_t)(
* @return @c NULL if it fails, else a symbol resolver context. * @return @c NULL if it fails, else a symbol resolver context.
*/ */
VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create( VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create(
VXResolveSymbol_t resolverCb, VXCustomSymbolResolver_ResolveSymbolCallback resolverCb,
void *userData); void *userData);
/* VXBaseInstructionFormatter ================================================================== */ /* VXBaseInstructionFormatter ================================================================== */

View File

@ -49,7 +49,7 @@ typedef enum _VXTypeId
TYPE_MEMORYDATASOURCE, TYPE_MEMORYDATASOURCE,
TYPE_INSTRUCTIONDECODER, TYPE_INSTRUCTIONDECODER,
TYPE_BASESYMBOLRESOLVER, TYPE_BASESYMBOLRESOLVER,
TYPE_EXACTSYMBOLRESOLVER, TYPE_CUSTOMSYMBOLRESOLVER,
TYPE_BASEINSTRUCTIONFORMATTER, TYPE_BASEINSTRUCTIONFORMATTER,
TYPE_INTELINSTRUCTIONFORMATTER, TYPE_INTELINSTRUCTIONFORMATTER,
} VXTypeId; } VXTypeId;
@ -105,29 +105,31 @@ __inline const struct _VXInstructionDecoder* VXInstructionDecoder_cthiz(
__inline struct _VXBaseSymbolResolver* VXBaseSymbolResolver_thiz( __inline struct _VXBaseSymbolResolver* VXBaseSymbolResolver_thiz(
VXBaseSymbolResolverContext *ctx) VXBaseSymbolResolverContext *ctx)
{ {
assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER); assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER
|| ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (struct _VXBaseSymbolResolver*)ctx->d.ptr; return (struct _VXBaseSymbolResolver*)ctx->d.ptr;
} }
__inline const struct _VXBaseSymbolResolver* VXBaseSymbolResolver_cthiz( __inline const struct _VXBaseSymbolResolver* VXBaseSymbolResolver_cthiz(
const VXBaseSymbolResolverContext *ctx) const VXBaseSymbolResolverContext *ctx)
{ {
assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER); assert(ctx->d.type == TYPE_BASESYMBOLRESOLVER
|| ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (const struct _VXBaseSymbolResolver*)ctx->d.ptr; return (const struct _VXBaseSymbolResolver*)ctx->d.ptr;
} }
__inline struct _VXExactSymbolResolver* VXExactSymbolResolver_thiz( __inline struct _VXCustomSymbolResolver* VXCustomSymbolResolver_thiz(
VXBaseSymbolResolverContext *ctx) VXBaseSymbolResolverContext *ctx)
{ {
assert(ctx->d.type == TYPE_EXACTSYMBOLRESOLVER); assert(ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (struct _VXExactSymbolResolver*)ctx->d.ptr; return (struct _VXCustomSymbolResolver*)ctx->d.ptr;
} }
__inline const struct _VXExactSymbolResolver* VXExactSymbolResolver_cthiz( __inline const struct _VXCustomSymbolResolver* VXCustomSymbolResolver_cthiz(
const VXBaseSymbolResolverContext *ctx) const VXBaseSymbolResolverContext *ctx)
{ {
assert(ctx->d.type == TYPE_EXACTSYMBOLRESOLVER); assert(ctx->d.type == TYPE_CUSTOMSYMBOLRESOLVER);
return (const struct _VXExactSymbolResolver*)ctx->d.ptr; return (const struct _VXCustomSymbolResolver*)ctx->d.ptr;
} }
__inline struct _VXBaseInstructionFormatter* VXBaseInstructionFormatter_thiz( __inline struct _VXBaseInstructionFormatter* VXBaseInstructionFormatter_thiz(