#ifndef __DATABASE_TYPES_H__ #define __DATABASE_TYPES_H__ #include /** The basic tags that describe the bytes of the database. The tag "CODE_FIRST_BYTE" is * mainly for multi-bytes instructions, in order to help the UI displaying * properly the instructions. */ enum basic_tags_t { TAG_UNKNOWN = 0, TAG_CODE, TAG_DATA, TAG_CODE_FIRST_BYTE, }; /** The 8-bits tag for a byte. The certitude part * A non-hollow database will be as big (at least) as the input file: in-memory-RLE is probably a good idea. */ struct memory_tags_t { unsigned short basic_tag: 2; unsigned short crawled: 1; /** -1..15, 15 being "user hinted", 14 being "external reference" (entry point, exported symbol, ...) * and -1 means something's fishy with that tag, and that it is probably completely wrong. * Certitude will grow down with distance from a certain piece of info when the crawler goes away jumping around. */ unsigned short certitude: 5; }; /** An absolute pointer can reference a segment from its ID, and a pointer within the segment. */ typedef union { Uint64 raw_ptr; struct { Uint32 segment_id; Uint32 ptr; }; } absolute_ptr; static inline Uint32 SEGID(absolute_ptr ptr) { return ptr.segment_id; } static inline Uint32 SEGOFFSET(absolute_ptr ptr) { return ptr.ptr; } static inline absolute_ptr ABSPTR(Uint32 id, Uint32 ptr) { absolute_ptr r; r.segment_id = id; r.ptr = ptr; return r; } static const absolute_ptr ABSNUL = { 0 }; /** A function description. */ struct function_t { absolute_ptr start; Uint32 size; }; #endif