Ignore:
Timestamp:
Feb 24, 2002, 3:47:28 AM (24 years ago)
Author:
bird
Message:

New kFile* classes; now in sync with os2tools.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/common/kFilePE.cpp

    r5531 r8003  
    1 /*
     1/* $Id: kFilePE.cpp,v 1.5 2002-02-24 02:47:26 bird Exp $
     2 *
    23 * kFilePE - PE files.
    34 *
     
    67 */
    78
    8 /*******************************************************************************
    9 *   Defined Constants                                                          *
    10 *******************************************************************************/
    11 /* emx fixups */
    12 #ifdef __EMX__
    13     #define __stdcall
    14      #define max(a,b) (((a) > (b)) ? (a) : (b))
    15      #define min(a,b) (((a) < (b)) ? (a) : (b))
    16 #endif
    17 
    189/******************************************************************************
    1910*   Header Files                                                              *
    2011******************************************************************************/
    21 #ifdef __EMX__
    22 #define INT INT_
    23 #define PCHAR PCHAR_
    24 #endif
    25 #include <os2.h>
    26 #ifdef __EMX__
    27 #undef PCHAR
    28 #undef INT
    29 #endif
    30 #include <stdio.h>
    31 #include <stdlib.h>
    3212#include <string.h>
    33 #include <malloc.h>
    34 #include <assert.h>
    35 #include <peexe.h>
     13
     14#include "MZexe.h"
     15#include "PEexe.h"
     16
     17#include "kTypes.h"
     18#include "kError.h"
    3619#include "kFile.h"
    3720#include "kFileFormatBase.h"
    38 #include "kInterfaces.h"
    39 #include "kFilePe.h"
     21#include "kFileInterfaces.h"
     22#include "kFilePE.h"
     23
    4024
    4125/*******************************************************************************
     
    4630#endif
    4731
     32
    4833/**
    4934 * Constructs a kFilePE object for a file.
    5035 * @param     pFile     File to create object from.
    51  * @remark    throws errorcode (TODO: errorhandling.)
    52  */
    53 kFilePE::kFilePE(kFile *pFile) throw(int) : pvBase(NULL),
     36 * @remark    throws errorcode
     37 */
     38kFilePE::kFilePE(kFile *pFile) :
     39    kFileFormatBase(pFile),
     40    pvBase(NULL),
    5441    pDosHdr(NULL), pFileHdr(NULL), pOptHdr(NULL), paDataDir(NULL), paSectionHdr(NULL),
    5542    pExportDir(NULL),
     
    6754{
    6855    IMAGE_DOS_HEADER doshdr;
    69 
    70     /* read dos-header - assumes there is one */
    71     if (   pFile->readAt(&doshdr, sizeof(doshdr), 0)
    72         && doshdr.e_magic == IMAGE_DOS_SIGNATURE
    73         && doshdr.e_lfanew > sizeof(doshdr)
    74         )
    75     {
    76         IMAGE_NT_HEADERS pehdr;
    77 
    78         /* read pe headers */
    79         if (   pFile->readAt(&pehdr, sizeof(pehdr), doshdr.e_lfanew)
    80             && pehdr.Signature == IMAGE_NT_SIGNATURE
    81             && pehdr.FileHeader.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER)
    82             && pehdr.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR_MAGIC)
    83         {
     56    long                offPEHdr = 0;
     57    IMAGE_NT_HEADERS pehdr;
     58
     59    /* read dos-header (If tehre is one) */
     60    pFile->setThrowOnErrors();
     61    pFile->readAt(&doshdr, sizeof(doshdr), 0);
     62    if (doshdr.e_magic == IMAGE_DOS_SIGNATURE)
     63    {
     64        if (doshdr.e_lfanew <= sizeof(doshdr))
     65            throw(kError(kError::INVALID_EXE_SIGNATURE));
     66        offPEHdr = doshdr.e_lfanew;
     67    }
     68
     69    /* read pe headers and do minor verifications */
     70    pFile->readAt(&pehdr, sizeof(pehdr), offPEHdr);
     71    if (pehdr.Signature != IMAGE_NT_SIGNATURE)
     72        throw(kError(kError::INVALID_EXE_SIGNATURE));
     73    if (   pehdr.FileHeader.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER)
     74        || pehdr.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
     75        throw(kError(kError::BAD_EXE_FORMAT));
     76
    8477            /* create mapping */
    85             pvBase = calloc((size_t)pehdr.OptionalHeader.SizeOfImage, 1);
    86             if (pvBase != NULL)
    87             {
     78   pvBase = new char [pehdr.OptionalHeader.SizeOfImage];
     79   if (pvBase == NULL)
     80       throw(kError(kError::NOT_ENOUGH_MEMORY));
     81   memset(pvBase, 0, pehdr.OptionalHeader.SizeOfImage);
     82
    8883                /*
    8984                printf("%ld\n", pehdr.OptionalHeader.SizeOfHeaders);
    9085                printf("%ld\n", sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * pehdr.FileHeader.NumberOfSections);
    91                 assert(pehdr.OptionalHeader.SizeOfHeaders ==
     86   kASSERT(pehdr.OptionalHeader.SizeOfHeaders ==
    9287                       sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * pehdr.FileHeader.NumberOfSections);
    9388                */
    94                 if (pFile->readAt(pvBase, pehdr.OptionalHeader.SizeOfHeaders, 0))
     89   try
    9590                {
     91       /* read optional header */
     92       pFile->readAt(pvBase, pehdr.OptionalHeader.SizeOfHeaders, 0);
     93
    9694                    /* read sections */
    9795                    for (int i = 0; i < pehdr.FileHeader.NumberOfSections; i++)
    9896                    {
    99                         ULONG  cbSection;
     97           unsigned long  cbSection;
    10098                        PIMAGE_SECTION_HEADER pSectionHdr =
    10199                        #if 0
    102                             IMAGE_FIRST_SECTION(((ULONG)pvBase + ((PIMAGE_DOS_HEADER)pvBase)->e_lfanew));
     100               IMAGE_FIRST_SECTION(((unsigned long)pvBase + ((PIMAGE_DOS_HEADER)pvBase)->e_lfanew));
    103101                        #else
    104                             (PIMAGE_SECTION_HEADER) ( (ULONG)pvBase + doshdr.e_lfanew + sizeof(IMAGE_NT_HEADERS) );
     102               (PIMAGE_SECTION_HEADER) ( (unsigned long)pvBase + doshdr.e_lfanew + sizeof(IMAGE_NT_HEADERS) );
    105103                        #endif
    106104                        pSectionHdr += i;
    107105
    108                         cbSection = min(pSectionHdr->Misc.VirtualSize, pSectionHdr->SizeOfRawData);
    109                         if (    cbSection
    110                             &&  !pFile->readAt((char*)pvBase + pSectionHdr->VirtualAddress,
    111                                                cbSection,
    112                                                pSectionHdr->PointerToRawData)
    113                             )
    114                         {
    115                             /* error */
    116                             free(pvBase);
    117                             pvBase = NULL;
    118                             throw(6);
    119                         }
    120                     }
     106           cbSection = KMIN(pSectionHdr->Misc.VirtualSize, pSectionHdr->SizeOfRawData);
     107           if (cbSection)
     108               pFile->readAt((char*)pvBase + pSectionHdr->VirtualAddress,
     109                             cbSection, pSectionHdr->PointerToRawData);
     110       }
    121111
    122112                    /* set pointers */
     
    124114                    {
    125115                        pDosHdr = (PIMAGE_DOS_HEADER)pvBase;
    126                         pFileHdr = (PIMAGE_FILE_HEADER)((DWORD)pvBase + pDosHdr->e_lfanew + 4);
     116           pFileHdr = (PIMAGE_FILE_HEADER)((char*)pvBase + pDosHdr->e_lfanew + 4);
    127117                    }
    128118                    else
    129                         pFileHdr = (PIMAGE_FILE_HEADER)((DWORD)pvBase + 4);
     119           pFileHdr = (PIMAGE_FILE_HEADER)((char*)pvBase + 4);
    130120
    131121                    pOptHdr = (PIMAGE_OPTIONAL_HEADER)((int)pFileHdr + sizeof(*pFileHdr));
     
    142132                        {
    143133                            if (paDataDir[i].VirtualAddress < pOptHdr->SizeOfImage)
    144                                 ((PULONG)&this->pExportDir)[i] = (int)pvBase + paDataDir[i].VirtualAddress;
    145                             #ifdef DEBUG
    146                             else
    147                                 fprintf(stderr, "bad directory pointer %d\n", i);
    148                             #endif
     134                   ((unsigned long*)&this->pExportDir)[i] = (int)pvBase + paDataDir[i].VirtualAddress;
    149135                        }
    150136                    }
    151137                }
    152                 else
    153                     throw(4);
    154             }
    155             else
    156                 throw(3);
    157         }
    158         else
    159             throw(2);
    160     }
    161     else
    162         throw(1);
     138   catch (kError err)
     139   {
     140       delete(pvBase);
     141       pvBase = NULL;
     142       throw(err);
     143    }
    163144}
    164145
     
    170151{
    171152    if (pvBase)
    172         delete pvBase;
     153        delete(pvBase);
    173154}
    174155
     
    180161 * @param   cchBuffer   Size of the buffer (defaults to 260 chars).
    181162 */
    182 BOOL  kFilePE::moduleGetName(char *pszBuffer, int cchSize/* = 260*/)
     163KBOOL  kFilePE::moduleGetName(char *pszBuffer, int cchSize/* = 260*/)
    183164{
    184165    if (pExportDir && pExportDir->Name)
     
    203184 * @remark
    204185 */
    205 BOOL  kFilePE::exportFindFirst(kExportEntry *pExport)
     186KBOOL   kFilePE::exportFindFirst(kExportEntry *pExport)
    206187{
    207188    if (pExportDir && pExportDir->NumberOfFunctions)
     
    222203 * @remark
    223204 */
    224 BOOL  kFilePE::exportFindNext(kExportEntry *pExport)
     205KBOOL   kFilePE::exportFindNext(kExportEntry *pExport)
    225206{
    226207    if (pExportDir && pExportDir->NumberOfFunctions)
     
    283264 * @remark  stub
    284265 */
    285 BOOL kFilePE::exportLookup(unsigned long ulOrdinal, kExportEntry *pExport)
    286 {
    287     assert(!"not implemented.");
     266KBOOL kFilePE::exportLookup(unsigned long ulOrdinal, kExportEntry *pExport)
     267{
     268    kASSERT(!"not implemented.");
    288269    ulOrdinal = ulOrdinal;
    289270    pExport = pExport;
     
    298279 * @remark  stub
    299280 */
    300 BOOL kFilePE::exportLookup(const char *  pszName, kExportEntry *pExport)
    301 {
    302     assert(!"not implemented.");
     281KBOOL kFilePE::exportLookup(const char *  pszName, kExportEntry *pExport)
     282{
     283    kASSERT(!"not implemented.");
    303284    pszName = pszName;
    304285    pExport = pExport;
     
    310291 * Mini dump function.
    311292 */
    312 BOOL  kFilePE::dump(kFile *pOut)
     293KBOOL  kFilePE::dump(kFile *pOut)
    313294{
    314295    int i,j,k;
     
    428409            if (pTLSDir[i].AddressOfCallBacks)
    429410            {
    430                 PULONG paulIndex;
    431                 PULONG paulCallback;
    432                 ULONG   ulBorlandRVAFix = 0UL;
     411                unsigned long * paulIndex;
     412                unsigned long * paulCallback;
     413                unsigned long   ulBorlandRVAFix = 0UL;
    433414
    434415                /* Check if the addresses in the TLSDir is RVAs or real addresses */
     
    437418
    438419                j = 0;
    439                 paulIndex    = (PULONG)((ULONG)pTLSDir[i].AddressOfIndex - ulBorlandRVAFix + (ULONG)this->pvBase);
    440                 paulCallback = (PULONG)((ULONG)pTLSDir[i].AddressOfCallBacks - ulBorlandRVAFix + (ULONG)this->pvBase);
     420                paulIndex    = (unsigned long *)((unsigned long)pTLSDir[i].AddressOfIndex - ulBorlandRVAFix + (unsigned long)this->pvBase);
     421                paulCallback = (unsigned long *)((unsigned long)pTLSDir[i].AddressOfCallBacks - ulBorlandRVAFix + (unsigned long)this->pvBase);
    441422                if (*paulCallback)
    442423                {
Note: See TracChangeset for help on using the changeset viewer.