TBool ELFFile::Init(const TText * const aFileName) // // Read the ELF file into memory // { delete [] iFileName; iFileName = new TText[strlen((const char *)aFileName)+1]; strcpy ((char *)iFileName, (const char *)aFileName); TInt error = HFile::Open(iFileName, &iFileHandle); if (error!=0) return EFalse; TInt flength = HFile::GetLength(iFileHandle); iElfFile = (Elf32_Ehdr *)HMem::Alloc(0,flength); if (!iElfFile) { Print(EPeError,"Failed to allocate memory to read in file.\n"); Close(); return EFalse; } if (!HFile::Read(iFileHandle,iElfFile,flength)) { Print(EPeError,"Unable to read file %s.\n",iFileName); Close(); return EFalse; } Close(); if (!IsValidFileHeader(iElfFile)) { Print(EPeError,"Invalid file header.\n"); return EFalse; } // we only support this....for the moment iCpu = ECpuArmV4; if (!InitHeaders()) return EFalse; if (!InitDllData()) return EFalse; iEntryPoint = iElfFile->e_entry; iCodeSize = GetCodeSize(); iDataSize = GetDataSize(); iBssSize = GetBssSize(); iStackReservedSize = 0x2000; iStackCommittedSize = 0x2000; iLinkedBase = iCodeSegmentHdr->p_vaddr; iImageIsDll = iDllData->ImageIsDll(); return ETrue; }
TBool PEFile::Init(const TText * const aFileName) // // Reads the PE headers to fill in lots of nice instance variables with info about the file // { delete [] iFileName; iFileName = new TText[strlen((const char *)aFileName)+1]; strcpy ((char *)iFileName, (const char *)aFileName); iHeader = (PIMAGE_NT_HEADERS)(HMem::Alloc(0,sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS))); if (!iHeader) { Print(EPeError,"Failed to allocate memory for headers.\n"); return EFalse; } TInt error = HFile::Open(iFileName, &iFileHandle); if (error!=0) return EFalse; if (!HFile::Read(iFileHandle,iHeader,sizeof(IMAGE_DOS_HEADER))) { Print(EPeError,"Unable to read file %s.\n",iFileName); HFile::Close(iFileHandle); return EFalse; } if (IsValidDOSHeader((PIMAGE_DOS_HEADER)iHeader)) // read in the rest, overwriting the DOS header iStartOfHeaders = ((PIMAGE_DOS_HEADER)iHeader)->e_lfanew; else iStartOfHeaders = 0; if (!HFile::Seek(iFileHandle, iStartOfHeaders)) { Print(EPeError,"File %s is not large enough to contain valid headers.\n",iFileName); HFile::Close(iFileHandle); return EFalse; } if (!HFile::Read(iFileHandle,iHeader,sizeof(IMAGE_NT_HEADERS))) { Print(EPeError,"Unable to read NT headers.\n"); HFile::Close(iFileHandle); return EFalse; } if (!IsValidNTHeader(iHeader)) { Print(EPeError,"Invalid NT header.\n"); HFile::Close(iFileHandle); return EFalse; } if (!(IsValidFileHeader((PIMAGE_FILE_HEADER)&iHeader->FileHeader))) { Print(EPeError,"Invalid file header.\n"); HFile::Close(iFileHandle); return EFalse; } // PIMAGE_NT_HEADERS pNTHeader = iHeader; PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)&iHeader->FileHeader; PIMAGE_OPTIONAL_HEADER pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)&iHeader->OptionalHeader; // PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)(iHeader+1); iImageSize = pOptionalHeader->SizeOfImage; iCodeSize = pOptionalHeader->SizeOfCode; iDataSize = pOptionalHeader->SizeOfInitializedData; iEntryPoint = pOptionalHeader->AddressOfEntryPoint; iHeapReservedSize = pOptionalHeader->SizeOfHeapReserve; iHeapCommittedSize = pOptionalHeader->SizeOfHeapCommit; iStackReservedSize = 0x2000; iStackCommittedSize = 0x2000; iBssSize = pOptionalHeader->SizeOfUninitializedData; iSectionAlign = pOptionalHeader->SectionAlignment; if (pFileHeader->Characteristics & IMAGE_FILE_DLL) iImageIsDll = ETrue; else iImageIsDll = EFalse; iLinkedBase=pOptionalHeader->ImageBase; iNumSections = pFileHeader->NumberOfSections; iSizeOfHeaders = pOptionalHeader->SizeOfHeaders; iExportDataDir=pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; iExportDirSize=pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; // iCpu=pFileHeader->Machine; HMem::Free(iHeader); iHeader=0; return ETrue; }