From 14c7f45cdae826f88dc539c8c38dd95caf305731 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Fri, 11 Jul 2008 15:50:46 +0000 Subject: Add zook's ZenUtils to SVN git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18010 a1c6a512-1295-4272-9138-f99709370657 --- .../libraries/pelib-0.9/pelib/DebugDirectory.cpp | 383 +++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100755 utils/zenutils/libraries/pelib-0.9/pelib/DebugDirectory.cpp (limited to 'utils/zenutils/libraries/pelib-0.9/pelib/DebugDirectory.cpp') diff --git a/utils/zenutils/libraries/pelib-0.9/pelib/DebugDirectory.cpp b/utils/zenutils/libraries/pelib-0.9/pelib/DebugDirectory.cpp new file mode 100755 index 0000000000..eb3d5c5600 --- /dev/null +++ b/utils/zenutils/libraries/pelib-0.9/pelib/DebugDirectory.cpp @@ -0,0 +1,383 @@ +/* +* DebugDirectory.cpp - Part of the PeLib library. +* +* Copyright (c) 2004 - 2005 Sebastian Porst (webmaster@the-interweb.com) +* All rights reserved. +* +* This software is licensed under the zlib/libpng License. +* For more details see http://www.opensource.org/licenses/zlib-license.php +* or the license information file (license.htm) in the root directory +* of PeLib. +*/ + +#include "PeLibInc.h" +#include "DebugDirectory.h" + +namespace PeLib +{ + void DebugDirectory::clear() + { + m_vDebugInfo.clear(); + } + + std::vector DebugDirectory::read(InputBuffer& ibBuffer, unsigned int uiSize) + { + std::vector currDebugInfo; + + PELIB_IMG_DEBUG_DIRECTORY iddCurr; + + for (unsigned int i=0;i> iddCurr.idd.Characteristics; + ibBuffer >> iddCurr.idd.TimeDateStamp; + ibBuffer >> iddCurr.idd.MajorVersion; + ibBuffer >> iddCurr.idd.MinorVersion; + ibBuffer >> iddCurr.idd.Type; + ibBuffer >> iddCurr.idd.SizeOfData; + ibBuffer >> iddCurr.idd.AddressOfRawData; + ibBuffer >> iddCurr.idd.PointerToRawData; + + currDebugInfo.push_back(iddCurr); + } + + return currDebugInfo; + } + + int DebugDirectory::read(unsigned char* buffer, unsigned int buffersize) + { + // XXX: Note, debug data is not read at all. This might or might not change + // in the future. + + std::vector vDebugDirectory(buffer, buffer + buffersize); + + InputBuffer ibBuffer(vDebugDirectory); + + std::vector currDebugInfo = read(ibBuffer, buffersize); + + std::swap(currDebugInfo, m_vDebugInfo); + + return NO_ERROR; + } + + /** + * @param strFilename Name of the file which will be read. + * @param uiOffset File offset of the Debug directory. + * @param uiSize Size of the Debug directory. + **/ + int DebugDirectory::read(const std::string& strFilename, unsigned int uiOffset, unsigned int uiSize) + { + std::ifstream ifFile(strFilename.c_str(), std::ios::binary); + unsigned int ulFileSize = fileSize(ifFile); + + if (!ifFile) + { + return ERROR_OPENING_FILE; + } + + if (ulFileSize < uiOffset + uiSize) + { + return ERROR_INVALID_FILE; + } + + ifFile.seekg(uiOffset, std::ios::beg); + + std::vector vDebugDirectory(uiSize); + ifFile.read(reinterpret_cast(&vDebugDirectory[0]), uiSize); + + InputBuffer ibBuffer(vDebugDirectory); + + std::vector currDebugInfo = read(ibBuffer, uiSize); + + for (unsigned int i=0;i(&currDebugInfo[i].data[0]), currDebugInfo[i].idd.SizeOfData); + if (!ifFile) return ERROR_INVALID_FILE; + } + + std::swap(currDebugInfo, m_vDebugInfo); + + return NO_ERROR; + } + + /** + * Rebuilds the current debug directory. + * @param vBuffer Buffer where the rebuilt directory is stored. + **/ + void DebugDirectory::rebuild(std::vector& vBuffer) const + { + OutputBuffer obBuffer(vBuffer); + + for (unsigned int i=0;i(m_vDebugInfo.size()) * PELIB_IMAGE_DEBUG_DIRECTORY::size(); + } + + /** + * @param strFilename Name of the file which will be written. + * @param uiOffset File offset where the debug directory will be stored. + **/ + int DebugDirectory::write(const std::string& strFilename, unsigned int uiOffset) const + { + std::fstream ofFile(strFilename.c_str(), std::ios_base::in); + + if (!ofFile) + { + ofFile.clear(); + ofFile.open(strFilename.c_str(), std::ios_base::out | std::ios_base::binary); + } + else + { + ofFile.close(); + ofFile.open(strFilename.c_str(), std::ios_base::in | std::ios_base::out | std::ios_base::binary); + } + + if (!ofFile) + { + return ERROR_OPENING_FILE; + } + + ofFile.seekp(uiOffset, std::ios::beg); + + std::vector vBuffer; + rebuild(vBuffer); + + ofFile.write(reinterpret_cast(&vBuffer[0]), static_cast(vBuffer.size())); + + ofFile.close(); + + return NO_ERROR; + } + + /** + * @return Number of debug structures in the current Debug directory. + **/ + unsigned int DebugDirectory::calcNumberOfEntries() const + { + return static_cast(m_vDebugInfo.size()); + } + + /** + * Adds a new debug structure to the debug directory. The initial values of all members of the structure + * are undefined. + **/ + void DebugDirectory::addEntry() + { + PELIB_IMG_DEBUG_DIRECTORY p; + m_vDebugInfo.push_back(p); + } + + /** + * Removes a debug structure from the current debug directory. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + **/ + void DebugDirectory::removeEntry(unsigned int uiIndex) + { + m_vDebugInfo.erase(m_vDebugInfo.begin() + uiIndex); + } + + /** + * Returns the Characteristics value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return Characteristics value of the debug structure. + **/ + dword DebugDirectory::getCharacteristics(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.Characteristics; + } + + /** + * Returns the TimeDateStamp value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return TimeDateStamp value of the debug structure. + **/ + dword DebugDirectory::getTimeDateStamp(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.TimeDateStamp; + } + + /** + * Returns the MajorVersion value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return MajorVersion value of the debug structure. + **/ + word DebugDirectory::getMajorVersion(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.MajorVersion; + } + + /** + * Returns the MinorVersion value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return MinorVersion value of the debug structure. + **/ + word DebugDirectory::getMinorVersion(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.MinorVersion; + } + + /** + * Returns the Type value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return Type value of the debug structure. + **/ + dword DebugDirectory::getType(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.Type; + } + + /** + * Returns the SizeOfData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return SizeOfData value of the debug structure. + **/ + dword DebugDirectory::getSizeOfData(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.SizeOfData; + } + + /** + * Returns the AddressOfRawData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return AddressOfRawData value of the debug structure. + **/ + dword DebugDirectory::getAddressOfRawData(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.AddressOfRawData; + } + + /** + * Returns the PointerToRawData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @return PointerToRawData value of the debug structure. + **/ + dword DebugDirectory::getPointerToRawData(unsigned int uiIndex) const + { + return m_vDebugInfo[uiIndex].idd.PointerToRawData; + } + + std::vector DebugDirectory::getData(unsigned int index) const + { + return m_vDebugInfo[index].data; + } + + /** + * Changes the Characteristics value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the Characteristics value of the debug structure. + **/ + void DebugDirectory::setCharacteristics(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.Characteristics = dwValue; + } + + /** + * Changes the TimeDateStamp value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the TimeDateStamp value of the debug structure. + **/ + void DebugDirectory::setTimeDateStamp(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.TimeDateStamp = dwValue; + } + + /** + * Changes the MajorVersion value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param wValue New value of the MajorVersion value of the debug structure. + **/ + void DebugDirectory::setMajorVersion(unsigned int uiIndex, word wValue) + { + m_vDebugInfo[uiIndex].idd.MajorVersion = wValue; + } + + /** + * Changes the MinorVersion value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param wValue New value of the MinorVersion value of the debug structure. + **/ + void DebugDirectory::setMinorVersion(unsigned int uiIndex, word wValue) + { + m_vDebugInfo[uiIndex].idd.MinorVersion = wValue; + } + + /** + * Changes the Type value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the Type value of the debug structure. + **/ + void DebugDirectory::setType(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.Type = dwValue; + } + + /** + * Changes the SizeOfData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the SizeOfData value of the debug structure. + **/ + void DebugDirectory::setSizeOfData(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.SizeOfData = dwValue; + } + + /** + * Changes the AddressOfRawData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the AddressOfRawData value of the debug structure. + **/ + void DebugDirectory::setAddressOfRawData(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.AddressOfRawData = dwValue; + } + + /** + * Changes the PointerToRawData value of a debug structure. If an invalid structure is specified + * by the parameter uiIndex the result will be undefined behaviour. + * @param uiIndex Identifies the debug structure. + * @param dwValue New value of the PointerToRawData value of the debug structure. + **/ + void DebugDirectory::setPointerToRawData(unsigned int uiIndex, dword dwValue) + { + m_vDebugInfo[uiIndex].idd.PointerToRawData = dwValue; + } + + void DebugDirectory::setData(unsigned int index, const std::vector& data) + { + m_vDebugInfo[index].data = data; + } +} -- cgit v1.2.3