mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-11 16:44:05 +02:00
263 lines
8.5 KiB
C
263 lines
8.5 KiB
C
// Copyright (c) 2014 Google Inc.
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// pecoff.h: PECOFF file format
|
|
//
|
|
|
|
#ifndef COMMON_PECOFF_PECOFF_H__
|
|
#define COMMON_PECOFF_PECOFF_H__
|
|
|
|
#include <stdint.h>
|
|
|
|
#define IMAGE_FILE_HEADER_OFFSET 0x3c
|
|
|
|
#define IMAGE_FILE_MAGIC 0x00004550 // "PE\0\0"
|
|
|
|
#define IMAGE_FILE_MACHINE_UNKNOWN 0x0000
|
|
#define IMAGE_FILE_MACHINE_ALPHA 0x0184
|
|
#define IMAGE_FILE_MACHINE_ALPHA64 0x0284
|
|
#define IMAGE_FILE_MACHINE_AM33 0x01d3
|
|
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
|
#define IMAGE_FILE_MACHINE_ARM 0x01c0
|
|
#define IMAGE_FILE_MACHINE_ARMV7 0x01c4
|
|
#define IMAGE_FILE_MACHINE_CEE 0xc0ee
|
|
#define IMAGE_FILE_MACHINE_CEF 0x0cef
|
|
#define IMAGE_FILE_MACHINE_EBC 0x0ebc
|
|
#define IMAGE_FILE_MACHINE_I386 0x014c
|
|
#define IMAGE_FILE_MACHINE_IA64 0x0200
|
|
#define IMAGE_FILE_MACHINE_M32R 0x9041
|
|
#define IMAGE_FILE_MACHINE_M68K 0x0268
|
|
#define IMAGE_FILE_MACHINE_MIPS16 0x0266
|
|
#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366
|
|
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466
|
|
#define IMAGE_FILE_MACHINE_POWERPC 0x01f0
|
|
#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
|
|
#define IMAGE_FILE_MACHINE_R10000 0x0168
|
|
#define IMAGE_FILE_MACHINE_R3000 0x0162
|
|
#define IMAGE_FILE_MACHINE_R4000 0x0166
|
|
#define IMAGE_FILE_MACHINE_SH3 0x01a2
|
|
#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
|
|
#define IMAGE_FILE_MACHINE_SH3E 0x01a4
|
|
#define IMAGE_FILE_MACHINE_SH4 0x01a6
|
|
#define IMAGE_FILE_MACHINE_SH5 0x01a8
|
|
#define IMAGE_FILE_MACHINE_THUMB 0x01c2
|
|
#define IMAGE_FILE_MACHINE_TRICORE 0x0520
|
|
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169
|
|
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
|
|
|
struct PeHeader {
|
|
uint32_t mMagic; // IMAGE_FILE_MAGIC
|
|
uint16_t mMachine; // IMAGE_FILE_MACHINE_* values
|
|
uint16_t mNumberOfSections;
|
|
uint32_t mTimeDateStamp;
|
|
uint32_t mPointerToSymbolTable;
|
|
uint32_t mNumberOfSymbols;
|
|
uint16_t mSizeOfOptionalHeader;
|
|
uint16_t mCharacteristics;
|
|
};
|
|
|
|
enum PeMagic {
|
|
PE32 = 0x010b, // 32 bit
|
|
PE32PLUS = 0x020b, // 64 bit address space, 2GB image size limit
|
|
};
|
|
|
|
struct PeDataDirectory {
|
|
uint32_t mVirtualAddress;
|
|
uint32_t mSize;
|
|
};
|
|
|
|
struct Pe32OptionalHeader {
|
|
uint16_t mMagic; // PeMagic
|
|
uint8_t mMajorLinkerVersion;
|
|
uint8_t mMinorLinkerVersion;
|
|
uint32_t mSizeOfCode;
|
|
uint32_t mSizeOfInitializedData;
|
|
uint32_t mSizeOfUninitializedData;
|
|
uint32_t mAddressOfEntryPoint;
|
|
uint32_t mBaseOfCode;
|
|
uint32_t mBaseOfData;
|
|
uint32_t mImageBase;
|
|
uint32_t mSectionAlignment;
|
|
uint32_t mFileAlignment;
|
|
uint16_t mMajorOperatingSystemVersion;
|
|
uint16_t mMinorOperatingSystemVersion;
|
|
uint16_t mMajorImageVersion;
|
|
uint16_t mMinorImageVersion;
|
|
uint16_t mMajorSubsystemVersion;
|
|
uint16_t mMinorSubsystemVersion;
|
|
uint32_t mWin32VersionValue;
|
|
uint32_t mSizeOfImage;
|
|
uint32_t mSizeOfHeaders;
|
|
uint32_t mCheckSum;
|
|
uint16_t mSubsystem;
|
|
uint16_t mDllCharacteristics;
|
|
uint32_t mSizeOfStackReserve;
|
|
uint32_t mSizeOfStackCommit;
|
|
uint32_t mSizeOfHeapReserve;
|
|
uint32_t mSizeOfHeapCommit;
|
|
uint32_t mLoaderFlags;
|
|
uint32_t mNumberOfRvaAndSizes;
|
|
PeDataDirectory mDataDirectory[0];
|
|
};
|
|
|
|
struct Pe32PlusOptionalHeader {
|
|
uint16_t mMagic; // PeMagic
|
|
uint8_t mMajorLinkerVersion;
|
|
uint8_t mMinorLinkerVersion;
|
|
uint32_t mSizeOfCode;
|
|
uint32_t mSizeOfInitializedData;
|
|
uint32_t mSizeOfUninitializedData;
|
|
uint32_t mAddressOfEntryPoint;
|
|
uint32_t mBaseOfCode;
|
|
uint64_t mImageBase;
|
|
uint32_t mSectionAlignment;
|
|
uint32_t mFileAlignment;
|
|
uint16_t mMajorOperatingSystemVersion;
|
|
uint16_t mMinorOperatingSystemVersion;
|
|
uint16_t mMajorImageVersion;
|
|
uint16_t mMinorImageVersion;
|
|
uint16_t mMajorSubsystemVersion;
|
|
uint16_t mMinorSubsystemVersion;
|
|
uint32_t mWin32VersionValue;
|
|
uint32_t mSizeOfImage;
|
|
uint32_t mSizeOfHeaders;
|
|
uint32_t mCheckSum;
|
|
uint16_t mSubsystem;
|
|
uint16_t mDllCharacteristics;
|
|
uint64_t mSizeOfStackReserve;
|
|
uint64_t mSizeOfStackCommit;
|
|
uint64_t mSizeOfHeapReserve;
|
|
uint64_t mSizeOfHeapCommit;
|
|
uint32_t mLoaderFlags;
|
|
uint32_t mNumberOfRvaAndSizes;
|
|
PeDataDirectory mDataDirectory[0];
|
|
};
|
|
|
|
#define PE_EXPORT_TABLE 0
|
|
#define PE_IMPORT_TABLE 1
|
|
#define PE_RESOURCE_TABLE 2
|
|
#define PE_EXCEPTION_TABLE 3
|
|
#define PE_CERTIFICATE_TABLE 4
|
|
#define PE_BASE_RELOCATION_TABLE 5
|
|
#define PE_DEBUG_DATA 6
|
|
#define PE_ARCHITECTURE 7
|
|
#define PE_GLOBAL_PTR 8
|
|
#define PE_TLS_TABLE 9
|
|
#define PE_LOAD_CONFIG_TABLE 10
|
|
#define PE_BOUND_IMPORT_TABLE 11
|
|
#define PE_IMPORT_ADDRESS_TABLE 12
|
|
#define PE_DELAY_IMPORT_DESCRIPTOR 13
|
|
#define PE_CLR_RUNTIME_HEADER 14
|
|
|
|
struct PeDebugDirectory {
|
|
uint32_t mCharacteristics;
|
|
uint32_t mTimeDateStamp;
|
|
uint16_t mMajorVersion;
|
|
uint16_t mMinorVersion;
|
|
uint32_t mType;
|
|
uint32_t mSizeOfData;
|
|
uint32_t mAddressOfRawData;
|
|
uint32_t mPointerToRawData;
|
|
};
|
|
|
|
#define IMAGE_DEBUG_TYPE_UNKNOWN 0
|
|
#define IMAGE_DEBUG_TYPE_COFF 1
|
|
#define IMAGE_DEBUG_TYPE_CODEVIEW 2
|
|
#define IMAGE_DEBUG_TYPE_FPO 3
|
|
#define IMAGE_DEBUG_TYPE_MISC 4
|
|
#define IMAGE_DEBUG_TYPE_EXCEPTION 5
|
|
#define IMAGE_DEBUG_TYPE_FIXUP 6
|
|
#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
|
|
#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
|
|
#define IMAGE_DEBUG_TYPE_BORLAND 9
|
|
#define IMAGE_DEBUG_TYPE_RESERVED10 10
|
|
#define IMAGE_DEBUG_TYPE_CLSID 11
|
|
|
|
struct CvInfoPbd70
|
|
{
|
|
uint32_t mCvSignature;
|
|
uint8_t mSignature[16];
|
|
uint32_t mAge;
|
|
uint8_t mPdbFileName[];
|
|
};
|
|
|
|
#define CODEVIEW_PDB70_CVSIGNATURE 0x53445352 // "RSDS"
|
|
#define CODEVIEW_PDB20_CVSIGNATURE 0x3031424e // "NB10"
|
|
#define CODEVIEW_CV50_CVSIGNATURE 0x3131424e // "NB11"
|
|
#define CODEVIEW_CV41_CVSIGNATURE 0x3930424e // “NB09"
|
|
|
|
struct PeSectionHeader {
|
|
char mName[8];
|
|
union {
|
|
uint32_t mPhysicalAddress;
|
|
uint32_t mVirtualSize;
|
|
} ;
|
|
uint32_t mVirtualAddress;
|
|
uint32_t mSizeOfRawData;
|
|
uint32_t mPointerToRawData;
|
|
uint32_t mPointerToRelocations;
|
|
uint32_t mPointerToLinenumbers;
|
|
uint16_t mNumberOfRelocations;
|
|
uint16_t mNumberOfLinenumbers;
|
|
uint32_t mCharacteristics;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) PeSymbol
|
|
{
|
|
union {
|
|
char mName[8]; // Symbol Name
|
|
struct {
|
|
uint32_t mFirst4Bytes;
|
|
uint32_t mSecond4Bytes;
|
|
};
|
|
};
|
|
|
|
uint32_t mValue; // Value of Symbol
|
|
uint16_t mScNum; // Section Number
|
|
uint16_t mType; // Symbol Type
|
|
uint8_t mSClass; // Storage Class
|
|
uint8_t mNumAux; // Auxiliary Count
|
|
};
|
|
|
|
struct PeExportTable {
|
|
uint32_t mFlags;
|
|
uint32_t mTimeDateStamp;
|
|
uint16_t mMajorVersion;
|
|
uint16_t mMinorVErsion;
|
|
uint32_t mNameRVA;
|
|
uint32_t mOrdinalBase;
|
|
uint32_t mAddressTableEntries;
|
|
uint32_t mNumberofNamePointers;
|
|
uint32_t mExportAddressTableRVA;
|
|
uint32_t mNamePointerRVA;
|
|
uint32_t mOrdinalTableRVA;
|
|
};
|
|
|
|
#endif// COMMON_PECOFF_PECOFF_H__
|