summaryrefslogtreecommitdiff
path: root/utils/zenutils/source/shared/pe.cpp
blob: 10070074dd34609e08ab4c072921dc1f27353936 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
#   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
#   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
#   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
#                     \/            \/     \/    \/            \/
# $Id$
#

PDBOXSRCDIR := $(APPSDIR)/plugins/pdbox
PDBOXBUILDDIR := $(BUILDDIR)/apps/plugins/pdbox

ROCKS += $(PDBOXBUILDDIR)/pdbox.rock

PDBOX_SRC := $(call preprocess, $(PDBOXSRCDIR)/SOURCES)
PDBOX_OBJ := $(call c2obj, $(PDBOX_SRC))

# add source files to OTHERSRC to get automatic dependencies
OTHER_SRC += $(PDBOX_SRC)

$(PDBOXBUILDDIR)/pdbox.rock: $(PDBOX_OBJ) $(MPEG_OBJ)

PDBOXFLAGS = $(PLUGINFLAGS) -fno-strict-aliasing
PDBOXLDFLAGS = $(PLUGINLDFLAGS) 
ifdef APP_TYPE
PDBOXLDFLAGS += -lm
endif

$(PDBOXBUILDDIR)/pdbox.rock: $(PDBOX_OBJ) $(TLSFLIB)

# Compile PDBox with extra flags (adapted from ZXBox)
$(PDBOXBUILDDIR)/%.o: $(PDBOXSRCDIR)/%.c $(PDBOXSRCDIR)/pdbox.make
	$(SILENT)mkdir -p $(dir $@)
	$(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) -I$(dir $<) $(PDBOXFLAGS) -c $< -o $@
/* zenutils - Utilities for working with creative firmwares. * Copyright 2007 (c) Rasmus Ry <rasmus.ry{at}gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "pe.h" shared::pe_file::pe_file(PeLib::PeFile* pef) : _pef(pef) { } shared::pe_file::~pe_file() { if (_pef != NULL) delete _pef; } bool shared::pe_file::is_valid() const { if (_pef->getBits() == 32) { PeLib::PeHeader32& pef32 = static_cast<PeLib::PeFile32*>(_pef)->peHeader(); if (!pef32.isValid()) return false; return true; } else if (_pef->getBits() == 64) { PeLib::PeHeader64& pef64 = static_cast<PeLib::PeFile64*>(_pef)->peHeader(); if (!pef64.isValid()) return false; return true; } return false; } bool shared::pe_file::read(const std::string& filename) { if (_pef != NULL) { delete _pef; _pef = NULL; } _pef = PeLib::openPeFile(filename); if (!_pef) { return false; } if (_pef->readMzHeader()) { delete _pef; return false; } if (!_pef->mzHeader().isValid()) { delete _pef; return false; } if (_pef->readPeHeader()) { delete _pef; return false; } if (!is_valid()) { delete _pef; return false; } return true; } bool shared::pe_file::find_section(const std::string& name, section_info& info) const { if (_pef->getBits() == 32) return find_section(static_cast<PeLib::PeFile32*>(_pef), name, info); else if (_pef->getBits() == 64) return find_section(static_cast<PeLib::PeFile64*>(_pef), name, info); return false; } bool shared::pe_file::add_section(const std::string& name, const bytes& buffer, section_info& info) { if (_pef->getBits() == 32) { return add_section(static_cast<PeLib::PeFile32*>(_pef), name, buffer, info); } else if (_pef->getBits() == 64) { return add_section(static_cast<PeLib::PeFile64*>(_pef), name, buffer, info); } return false; } dword shared::pe_file::get_image_base() const { if (_pef->getBits() == 32) return static_cast<PeLib::PeFile32*>(_pef)->peHeader().getImageBase(); else return static_cast<PeLib::PeFile64*>(_pef)->peHeader().getImageBase(); return 0; } dword shared::pe_file::pa_to_va(dword pa) const { if (_pef->getBits() == 32) return static_cast<PeLib::PeFile32*>(_pef)->peHeader().offsetToVa(pa); else return static_cast<PeLib::PeFile64*>(_pef)->peHeader().offsetToVa(pa); return 0; }