SYNOPSIS

#include <libdis.h>

typedef void (*DISASM_REPORTER)( enum x86_report_codes code,

        void * data, void * arg );

int x86_init( enum x86_options options, DISASM_REPORTER reporter,

        void * arg);

int x86_cleanup(void);

DESCRIPTION

enum x86_options {

opt_none= 0,

opt_ignore_nulls=1, /* ignore sequences of > 4 NULL bytes */

opt_16_bit=2, /* 16-bit/DOS disassembly */

opt_unknown

};

enum x86_report_codes {

        report_disasm_bounds,
        report_insn_bounds,
        report_invalid_insn,
        report_unknown

};

EXAMPLES

The following provides a skeleton for initializing and terminating

libdisasm:

void reporter( enum x86_report_codes code, void *data, void *arg ) {

        char * str = NULL;
        FILE *stream = (FILE *) arg;
        if (! stream ) stream = stderr;
        /* here would could examine the error and do something useful;
         * instead we just print that an error occurred */
        switch ( code ) {
                case report_disasm_bounds:
                        str = "Attempt to disassemble RVA "
                              "beyond end of buffer";
                        break;
                case report_insn_bounds:
                        str = "Instruction at RVA extends "
                              "beyond buffer";
                        break;
                case report_invalid_insn:
                        str = "Invalid opcode at RVA";
                        break;
                case report_unknown:
                        str = "Unknown Error";
                        break;
        }
        fprintf(stream, "ERROR \'%s:\' %p\n", str, data);

}

int main( int argc, char **argv ) {

        x86_init(opt_none, reporter, stderr);
        /* disassembler code goes here */
        x86_cleanup();

}

RELATED TO x86_init…