home *** CD-ROM | disk | FTP | other *** search
/ Programming Win32 Under the API / ProgrammingWin32UnderTheApiPatVillani.iso / pedasm.zip / DasmCode.h < prev    next >
C/C++ Source or Header  |  1998-10-23  |  5KB  |  196 lines

  1. /*        fichier DasmCode.h : fichier header
  2.  *
  3.  *    descr : classe automate desassembleur
  4.  *    projet : PEDasm
  5.  *    
  6.  *    rq:
  7.  *    Ce programme est libre de droits. Il peut etre distribue et/ou modifie
  8.  *  selon les termes de la licence 'GNU General Public License version 2'.
  9.  *    
  10.  *    Ce programme est distribue sans aucunes garanties, y compris d'utilite 
  11.  *    ni de risques encouru, quelle que soit son utilisation.
  12.  *
  13.  *    lire le fichier licence.txt fourni ou bien ecrire a :
  14.  *    the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15.  *    pour recevoir une copie de la licence.
  16.  *      
  17.  *    Copyright (C) 1997 - 1998 Nicolas Witczak <witczak@geocities.com> 
  18.  */
  19.  
  20. #ifndef DASM_CODE_H
  21.     #define DASM_CODE_H
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <vector>
  26. #include <set>
  27. #include <string>
  28.  
  29. #include "ExeRep.h"
  30. #include "DasmBase.h"
  31.  
  32. struct SOPContext ;
  33.  
  34. ///////////////////////////////////////////////////////////////
  35. /** class CDasmCode : desassemblage d'une portion de code
  36.  */
  37. class CDasmCode : public CDasm
  38. {
  39. public:
  40. // construction
  41.     /** ctor  */
  42.     CDasmCode(); 
  43.  
  44. // attributs
  45.  
  46.     /** mode de desassemblage par defaut 1 -> (32b), 0 ->(16b) */
  47.     BYTE        m_mode32 ;
  48.  
  49.     // prefixes
  50.  
  51.     /** prefix de repetition ou 0 si pas de repetition */
  52.     BYTE        m_repPrefix ;
  53.  
  54.     /** prefix de segment sreg3 ou ff si pas de surcharge */
  55.     BYTE         m_segPrefix ;
  56.  
  57.     /** operand size overide si == 1 */
  58.     BYTE        m_oprdSzOverd ; 
  59.     
  60.     /** adress size overide si == 1 */
  61.     BYTE        m_adrSzOverd ; 
  62.  
  63.     // mask
  64.     bool        m_dFlag , m_sFlag ;
  65.     BYTE        m_tttnFlag ;
  66.  
  67.     // pointeurs en cours
  68.  
  69.     /** ptr mem d'instruction  apres prefix */
  70.     BYTE *m_pvPrefix ;
  71.  
  72.     // operandes
  73.  
  74.     /** taille de l'operande (0 -> aucun , 1 ->8b , 2 ->16b , 3 -> 32b )
  75.      *        calc avec le mode processeur par defaut + operand size override     
  76.      *    traitement du bit w 
  77.      */
  78.     BYTE    m_OperandSize ;
  79.  
  80.     /** empacketage mmx 0 -> 3 
  81.      */
  82.     BYTE    m_mmxPack ;
  83.  
  84.     /** taille de l'adresse (0 -> aucun , 1 ->8b , 2 ->16b , 3 -> 32b )
  85.      *        calc avec le mode processeur par defaut + adresse size override
  86.      */
  87.     BYTE    m_AdresseSize ;
  88.     
  89.     /** partie ModR/M (optionnelle) */
  90.     BYTE    m_Mod , m_regOpCode , m_RM ;
  91.  
  92.     /** chaine de caractere rep ds l'ordre les 3 operande si m_bOutputDasm */
  93.     char_buff m_pszOperand[3] ;
  94.  
  95.     // instruction
  96.     /** chaine de caractere rep l'instruction */
  97.     char_buff    m_pszInstr ;
  98.  
  99.     /** dernier format reconnu */
  100.     const char*    m_pszFormat ;
  101.  
  102. // interface general
  103.  
  104.     /** fct ScanNext : interprete l'instruction suivante 
  105.      *    positionne les variables de cette classe
  106.      *        retourne false en cas d'erreur
  107.      */
  108.     bool ScanNext() ;
  109.  
  110.     /** fct ScanPrefix : interprete les prefixes
  111.      *        retourne false en cas d'erreur
  112.      */
  113.     bool ScanPrefix() ;
  114.  
  115.     /** Reset */
  116.     void Reset() ;
  117.  
  118. // interface op code
  119.     /** fct ScanOPCode : interprete le code op en fonction de la 
  120.      *        table globale pfnOPCodeMask
  121.      */
  122.     bool ScanOPCode( ) ;
  123.  
  124.  
  125.     /**  ProcessMask -> traite le ptr section courant en regard a la chaine de mask
  126.      *    retourne  false en cas de non reconnaissance
  127.      *              true en cas de reconnaissance correcte
  128.      */
  129.     bool ProcessMask( const char* pszMask );
  130.     
  131.     /** PrintInstr : ecrit l'instruction ds le buffer membre m_pszInstr
  132.      *        param pszFormat : format d'impression
  133.      */
  134.     void PrintInstr() ;
  135.  
  136. // fonctions d'aide
  137.     
  138.     /** traitement par defaut d'une operande memoire     
  139.      *        lit le SIB si besoin
  140.      *    -> resultat ds pszBuff
  141.      */
  142.     bool ModMProcess( char* pszBuff );
  143.  
  144.     /** traitement du SIB : renseigne les champs oprd    
  145.      *        interprete le SIB -> appele par DefModRMProcess
  146.      *    -> resultat ds pszBuff
  147.      */
  148.     bool SIBProcess( char* pszBuff );
  149.  
  150.     /** reordonne le tableau pfnOPCodeMask en fonction de la frequence d'utilisation
  151.      *    des instructions , accelere le desassemblage
  152.      *    ->utilise pour cela le champs m_iStat de SOPContext
  153.      */
  154.     void SortInstr() ;
  155. };
  156.  
  157. ///////////////////////////////////////////////////////////
  158. /** type SOPContext : association masque code op -> handler
  159.  */
  160.  
  161. struct SOPContext 
  162. {
  163. // donnees
  164.     /** mask de cod op ou 0 pour fin de tab */
  165.     const char* m_pszMask ;
  166.  
  167.     /** chaine de caractere de code op
  168.      *        format de la chaine "operd % ..."
  169.      *        %0 , %1 , %2 -> operandes
  170.      *        %p -> qualif ptr , %c -> condition
  171.      *        %r_ , %rz -> prefix de repetition : rep | repz
  172.      *        %g -> empacketage mmx
  173.      */
  174.     const char* m_pszCodeOP ;
  175.  
  176.     /** m_iStat : nombre d'occurence de cette instruction rencontree dans le binaire 
  177.      *        sert a optimiser le desassemblage
  178.      */
  179.     int            m_iStat ;
  180. };
  181.  
  182.  
  183. //////////////////////////////////////////////////////////////////
  184. // fonctions globales
  185. //        (aucunes)
  186.  
  187. /** operateurs servant pour le trie des SOPContext
  188.  */
  189. inline bool operator<(const SOPContext &op1, const SOPContext &op2)
  190. {    return op1.m_iStat > op2.m_iStat; }
  191.  
  192. inline bool operator==(const SOPContext &op1, const SOPContext &op2)
  193. {    return op1.m_iStat == op2.m_iStat;    }
  194.  
  195.  
  196. #endif //DASM_CODE_H