packages feed

hurdle-0.3.0: src/Hurdle/Coff/Datatypes.hs

{-# OPTIONS -Wall #-}

--------------------------------------------------------------------------------
-- |
-- Module      :  Hurdle.Coff.Datatypes
-- Copyright   :  (c) Stephen Tetley 2009
-- License     :  BSD3
--
-- Maintainer  :  Stephen Tetley <stephen.tetley@gmail.com>
-- Stability   :  highly unstable
-- Portability :  to be determined.
--
-- 
--
--------------------------------------------------------------------------------

module Hurdle.Coff.Datatypes where

import Data.Map ( Map )
import Data.Word

data Image = Image 
      { image_dos_header            :: DOSHeader
      , image_signature             :: (Char,Char,Char,Char)
      , image_coff_header           :: COFFHeader
      , image_opt_header            :: ImageOptionalHeader
      , image_section_headers       :: SectionHeaders
      , image_export_data           :: Maybe ExportData
      }
  deriving Show

image_DOS_HEADER_size :: Int
image_DOS_HEADER_size = 64

data DOSHeader = DOSHeader 
      { dh_magic_number            :: Word16
      , dh_bytes_on_last_page      :: Word16
      , dh_pages_in_file           :: Word16
      , dh_relocations             :: Word16
      , dh_header_paras_size       :: Word16
      , dh_min_extra_paras         :: Word16
      , dh_max_extra_paras         :: Word16
      , dh_initial_relative_ss     :: Word16
      , dh_initial_sp              :: Word16
      , dh_header_checksum         :: Word16
      , dh_initial_ip              :: Word16   
      , dh_initial_relative_cs     :: Word16
      , dh_reltable_file_addr      :: Word16
      , dh_overlay_number          :: Word16
      , dh_reserved_words          :: (Word16,Word16,Word16,Word16)
      , dh_oem_identifier          :: Word16
      , dh_oem_info                :: Word16
      , dh_reserved_words_two      :: [Word16]   -- length 10
      , dh_new_exe_addr            :: Word32
      }  
  deriving Show



image_COFF_HEADER_size :: Int
image_COFF_HEADER_size = 20

data COFFHeader = COFFHeader 
      { ch_machine                  :: Word16
      , ch_num_sections             :: Word16
      , ch_timedate_stamp           :: Word32
      , ch_sym_table_ptr            :: Word32
      , ch_num_symbols              :: Word32
      , ch_opt_header_size          :: Word16
      , ch_characteristics          :: Word16
      }
   deriving Show


data ImageOptionalHeader = ImageOptionalHeader
      { ioh_header_std_fields       :: OptionalStandardHeader
      , ioh_nt_specific_fields      :: OptionalWindowsHeader
      , ioh_data_directory          :: [HeaderDataDirectory]
      }
  deriving Show
 

data OptionalStandardHeader = OptionalStandardHeader
      { osh_magic                   :: Word16
      , osh_major_linker_version    :: Word8
      , osh_minor_linker_version    :: Word8
      , osh_size_of_code            :: Word32
      , osh_size_of_inited_data     :: Word32
      , osh_size_of_uninited_data   :: Word32
      , osh_entry_point_addr        :: Word32
      , osh_base_of_code            :: Word32
      , osh_base_of_data            :: Word32
      }
   deriving Show

data OptionalWindowsHeader = OptionalWindowsHeader
      { owh_image_base              :: Word32
      , owh_section_alignment       :: Word32
      , owh_file_alignment          :: Word32
      , owh_major_os_version        :: Word16
      , owh_minor_os_version        :: Word16
      , owh_major_image_version     :: Word16
      , owh_minor_image_version     :: Word16
      , owh_major_subsys_version    :: Word16
      , owh_minor_subsys_version    :: Word16
      , owh_win32_version           :: Word32
      , owh_size_of_image           :: Word32
      , owh_size_of_headers         :: Word32
      , owh_checksum                :: Word32
      , owh_subsystem               :: Word16
      , owh_dll_characteristics     :: Word16
      , owh_size_stack_reserve      :: Word32
      , owh_size_stack_commit       :: Word32
      , owh_size_heap_reserve       :: Word32
      , owh_size_heap_commit        :: Word32
      , owh_loader_flags            :: Word32
      , owh_rva_num_and_sizes       :: Word32
      } 
  deriving Show

image_DATA_DIRECTORY_size :: Int
image_DATA_DIRECTORY_size = 4

data HeaderDataDirectory = HeaderDataDirectory
      { hdd_virtual_addr            :: Word32
      , hdd_size                    :: Word32
      }
  deriving Show


type SectionHeaders = Map String SectionHeader

data SectionHeader = SectionHeader 
      { sh_name                     :: String  -- 8 bytes
      , sh_virtual_size             :: Word32
      , sh_virtual_addr             :: Word32
      , sh_size_raw_data            :: Word32
      , sh_ptr_raw_data             :: Word32
      , sh_ptr_relocations          :: Word32
      , sh_ptr_linenums             :: Word32
      , sh_num_relocations          :: Word16
      , sh_num_linenums             :: Word16
      , sh_characteristics          :: Word32
      }
  deriving Show

-- | \'.edata\'
-- name_ptrs and ordinals should be zipped...
data ExportData = ExportData
      { ed_directory_table          :: ExportDirectoryTable
      , ed_export_address_table     :: ExportAddressTable
      , ed_name_ptr_table           :: [Word32]
      , ed_ordinal_table            :: [Word16]
      , ed_dll_name                 :: String
      , ed_name_table               :: [String]
      }
  deriving Show

data ExportDirectoryTable = ExportDirectoryTable
      { edt_export_flags            :: Word32
      , edt_timedate_stamp          :: Word32
      , edt_major_version           :: Word16
      , edt_minor_version           :: Word16
      , edt_name_rva                :: Word32
      , edt_ordinal_base            :: Word32
      , edt_num_addr_table_entries  :: Word32
      , edt_num_name_ptrs           :: Word32
      , edt_export_addr_table_rva   :: Word32
      , edt_name_ptr_table_rva      :: Word32
      , edt_ordinal_table_rva       :: Word32
      }
  deriving Show

newtype ExportAddressTable = ExportAddressTable 
          { getExportAddressTable :: [ExportAddress] }
   deriving Show


data ExportAddress = EA_Export_RVA     Word32
                   | EA_Forwarder_RVA  Word32    
  deriving Show