| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * @author Alexander V. Astapchuk |
| */ |
| |
| /** |
| * @file |
| * @brief Main decoding (disassembling) routines and structures. |
| * |
| * @note Quick and rough implementation, subject for a change. |
| */ |
| |
| #ifndef __DEC_BASE_H_INCLUDED__ |
| #define __DEC_BASE_H_INCLUDED__ |
| |
| |
| #include "enc_base.h" |
| #include "enc_prvt.h" |
| |
| #ifdef ENCODER_ISOLATE |
| using namespace enc_ia32; |
| #endif |
| |
| #define IF_CONDITIONAL (0x00000000) |
| #define IF_SYMMETRIC (0x00000000) |
| #define IF_BRANCH (0x00000000) |
| |
| struct Inst { |
| Inst() { |
| mn = Mnemonic_Null; |
| prefc = 0; |
| size = 0; |
| flags = 0; |
| //offset = 0; |
| //direct_addr = NULL; |
| argc = 0; |
| for(int i = 0; i < 4; ++i) |
| { |
| pref[i] = InstPrefix_Null; |
| } |
| } |
| /** |
| * Mnemonic of the instruction.s |
| */ |
| Mnemonic mn; |
| /** |
| * Enumerating of indexes in the pref array. |
| */ |
| enum PrefGroups |
| { |
| Group1 = 0, |
| Group2, |
| Group3, |
| Group4 |
| }; |
| /** |
| * Number of prefixes (1 byte each). |
| */ |
| unsigned int prefc; |
| /** |
| * Instruction prefixes. Prefix should be placed here according to its group. |
| */ |
| InstPrefix pref[4]; |
| /** |
| * Size, in bytes, of the instruction. |
| */ |
| unsigned size; |
| /** |
| * Flags of the instruction. |
| * @see MF_ |
| */ |
| unsigned flags; |
| /** |
| * An offset of target address, in case of 'CALL offset', |
| * 'JMP/Jcc offset'. |
| */ |
| //int offset; |
| /** |
| * Direct address of the target (on Intel64/IA-32 is 'instruction IP' + |
| * 'instruction length' + offset). |
| */ |
| //void * direct_addr; |
| /** |
| * Number of arguments of the instruction. |
| */ |
| unsigned argc; |
| // |
| EncoderBase::Operand operands[3]; |
| // |
| const EncoderBase::OpcodeDesc * odesc; |
| }; |
| |
| inline bool is_jcc(Mnemonic mn) |
| { |
| return Mnemonic_JO <= mn && mn<=Mnemonic_JG; |
| } |
| |
| class DecoderBase { |
| public: |
| static unsigned decode(const void * addr, Inst * pinst); |
| private: |
| static bool decodeModRM(const EncoderBase::OpcodeDesc& odesc, |
| const unsigned char ** pbuf, Inst * pinst |
| #ifdef _EM64T_ |
| , const Rex *rex |
| #endif |
| ); |
| static bool decode_aux(const EncoderBase::OpcodeDesc& odesc, |
| unsigned aux, const unsigned char ** pbuf, |
| Inst * pinst |
| #ifdef _EM64T_ |
| , const Rex *rex |
| #endif |
| ); |
| static bool try_mn(Mnemonic mn, const unsigned char ** pbuf, Inst * pinst); |
| static unsigned int fill_prefs( const unsigned char * bytes, Inst * pinst); |
| static bool is_prefix(const unsigned char * bytes); |
| }; |
| |
| #endif // ~ __DEC_BASE_H_INCLUDED__ |
| |