コード例 #1
0
        /*-------------------- Constructors ---------------------------------*/

        /// <summary>
        /// Create a new PE File with the name "fileName".  If "fileName" ends in ".dll" then
        /// the file is a dll, otherwise it is an exe file.  This PE File has no assembly.
        /// </summary>
        /// <param name="fileName">Name for the output file.</param>
        public PEFile(string fileName)
            : base(fileName)
        {
            Contract.Requires(fileName != null);
            //PrimitiveType.ClearAddedFlags();   // KJG 18-April-2005 - Now done in MetaDataOut
            this.fileName = fileName;
            metaData      = new MetaDataOut();
            versionInfo   = new PEFileVersionInfo();
            versionInfo.SetDefaults(fileName);
        }
コード例 #2
0
ファイル: PEFile.cs プロジェクト: dbremner/perwapi
        private System.IO.FileStream unmanagedResources; // Unmanaged resources read from a file.

        #endregion Fields

        #region Constructors

        /*-------------------- Constructors ---------------------------------*/
        /// <summary>
        /// Create a new PE File with the name "fileName".  If "fileName" ends in ".dll" then
        /// the file is a dll, otherwise it is an exe file.  This PE File has no assembly.
        /// </summary>
        /// <param name="fileName">Name for the output file.</param>
        public PEFile(string fileName)
            : base(fileName)
        {
            Contract.Requires(fileName != null);
            //PrimitiveType.ClearAddedFlags();   // KJG 18-April-2005 - Now done in MetaDataOut
            this.fileName = fileName;
            metaData = new MetaDataOut();
            versionInfo = new PEFileVersionInfo();
            versionInfo.SetDefaults(fileName);
        }
コード例 #3
0
ファイル: PEWriter.cs プロジェクト: parhelia512/perwapi
        /*-------------------- Constructors ---------------------------------*/

        internal PEWriter(PEFileVersionInfo verInfo, string fileName, MetaDataOut md, bool writePDB)
            : base(new FileStream(fileName, FileMode.Create))
        {
            Contract.Requires(verInfo != null);
            Contract.Requires(fileName != null);
            Contract.Requires(md != null);
            InitPEWriter(verInfo, md, writePDB, fileName);
            TimeSpan tmp = System.IO.File.GetCreationTime(fileName).Subtract(FileImage.origin);

            dateStamp = Convert.ToUInt32(tmp.TotalSeconds);
        }
コード例 #4
0
ファイル: PEWriter.cs プロジェクト: parhelia512/perwapi
        internal PEWriter(PEFileVersionInfo verInfo, Stream str, MetaDataOut md)
            : base(str)
        {
            Contract.Requires(verInfo != null);
            Contract.Requires(str != null);
            Contract.Requires(md != null);
            // NOTE: Can not write a PDB file if using a stream.
            InitPEWriter(verInfo, md, false, null);
            TimeSpan tmp = DateTime.Now.Subtract(FileImage.origin);

            dateStamp   = Convert.ToUInt32(tmp.TotalSeconds);
            closeStream = false;
        }
コード例 #5
0
ファイル: PEWriter.cs プロジェクト: parhelia512/perwapi
        internal void MakeFile(PEFileVersionInfo verInfo)
        {
            Contract.Requires(verInfo != null);
            this.verInfo = verInfo;
            if (this.verInfo.isDLL)
            {
                hintNameTable = FileImage.dllHintNameTable.ToCharArray();
            }
            else
            {
                hintNameTable = FileImage.exeHintNameTable.ToCharArray();
            }

            BuildTextSection();
            CalcOffsets();
            BuildRelocSection();
            // now write it out
            WriteHeader();
            WriteSections();
            Flush();
            if (closeStream)
            {
                Close();
            }
            if (pdbWriter != null)
            {
                // Write the PDB file
                pdbWriter.WritePDBFile();

                // Check to make sure the DebugInfo is the length we expected.
                if (pdbWriter.DebugInfo.Length != debugBytesSize)
                {
                    throw new Exception("DebugInfo for the new PDB file is incompatible with the PE file.  This is most likely an internal error.  Please consult your vendor if you continue to have this problem.");
                }

                // Write the debug info to the PE file
                using (FileStream fs = new FileStream(pdbWriter.PEFilename, FileMode.Open, FileAccess.ReadWrite))
                {
                    using (BinaryWriter bw = new BinaryWriter(fs))
                    {
                        // Get to the DebugInfo section
                        bw.Seek((int)debugBytesStartOffset, SeekOrigin.Begin);
                        bw.Write(pdbWriter.DebugInfo, 0, pdbWriter.DebugInfo.Length);
                    }
                }
            }
        }
コード例 #6
0
ファイル: PEWriter.cs プロジェクト: parhelia512/perwapi
        /*----------------------------- Writing -----------------------------------------*/

        private void InitPEWriter(PEFileVersionInfo verInfo, MetaDataOut md, bool writePDB, string fileName)
        {
            Contract.Requires(verInfo != null);
            Contract.Requires(md != null);
            Contract.Requires(fileName != null);
            this.verInfo = verInfo;
            if (!verInfo.fromExisting)
            {
                verInfo.lMajor = MetaData.LMajors[(int)verInfo.netVersion];
            }
            if (verInfo.isDLL)
            {
                hintNameTable = FileImage.dllHintNameTable.ToCharArray();
                if (!verInfo.fromExisting)
                {
                    verInfo.characteristics = FileImage.dllCharacteristics;
                }
            }
            else
            {
                hintNameTable = FileImage.exeHintNameTable.ToCharArray();
                if (!verInfo.fromExisting)
                {
                    verInfo.characteristics = FileImage.exeCharacteristics;
                }
            }
            text     = new Section(FileImage.textName, 0x60000020); // IMAGE_SCN_CNT  CODE, EXECUTE, READ
            metaData = md;
            metaData.InitMetaDataOut(this);

            // Check if we should include a PDB file
            if (writePDB)
            {
                // Work out the PDB filename from the PE files filename
                if ((fileName == null) || (fileName == ""))
                {
                    fileName = "default";
                }

                // Setup the PDB Writer object
                pdbWriter = new PDBWriter(fileName);

                // Set the amount of space required for the debug information
                debugBytesSize += pdbWriter.PDBFilename.Length;
            }
        }
コード例 #7
0
ファイル: PEWriter.cs プロジェクト: dbremner/perwapi
 internal PEWriter(PEFileVersionInfo verInfo, Stream str, MetaDataOut md)
     : base(str)
 {
     Contract.Requires(verInfo != null);
     Contract.Requires(str != null);
     Contract.Requires(md != null);
     // NOTE: Can not write a PDB file if using a stream.
     InitPEWriter(verInfo, md, false, null);
     TimeSpan tmp = DateTime.Now.Subtract(FileImage.origin);
     dateStamp = Convert.ToUInt32(tmp.TotalSeconds);
     closeStream = false;
 }
コード例 #8
0
ファイル: PEWriter.cs プロジェクト: dbremner/perwapi
 /*-------------------- Constructors ---------------------------------*/
 internal PEWriter(PEFileVersionInfo verInfo, string fileName, MetaDataOut md, bool writePDB)
     : base(new FileStream(fileName, FileMode.Create))
 {
     Contract.Requires(verInfo != null);
     Contract.Requires(fileName != null);
     Contract.Requires(md != null);
     InitPEWriter(verInfo, md, writePDB, fileName);
     TimeSpan tmp = System.IO.File.GetCreationTime(fileName).Subtract(FileImage.origin);
     dateStamp = Convert.ToUInt32(tmp.TotalSeconds);
 }
コード例 #9
0
ファイル: PEWriter.cs プロジェクト: dbremner/perwapi
        /*----------------------------- Writing -----------------------------------------*/
        private void InitPEWriter(PEFileVersionInfo verInfo, MetaDataOut md, bool writePDB, string fileName)
        {
            Contract.Requires(verInfo != null);
            Contract.Requires(md != null);
            Contract.Requires(fileName != null);
            this.verInfo = verInfo;
            if (!verInfo.fromExisting)
                verInfo.lMajor = MetaData.LMajors[(int)verInfo.netVersion];
            if (verInfo.isDLL)
            {
                hintNameTable = FileImage.dllHintNameTable.ToCharArray();
                if (!verInfo.fromExisting) verInfo.characteristics = FileImage.dllCharacteristics;
            }
            else
            {
                hintNameTable = FileImage.exeHintNameTable.ToCharArray();
                if (!verInfo.fromExisting) verInfo.characteristics = FileImage.exeCharacteristics;
            }
            text = new Section(FileImage.textName, 0x60000020);     // IMAGE_SCN_CNT  CODE, EXECUTE, READ
            metaData = md;
            metaData.InitMetaDataOut(this);

            // Check if we should include a PDB file
            if (writePDB)
            {

                // Work out the PDB filename from the PE files filename
                if ((fileName == null) || (fileName == "")) fileName = "default";

                // Setup the PDB Writer object
                pdbWriter = new PDBWriter(fileName);

                // Set the amount of space required for the debug information
                debugBytesSize += pdbWriter.PDBFilename.Length;

            }
        }
コード例 #10
0
ファイル: PEWriter.cs プロジェクト: dbremner/perwapi
        internal void MakeFile(PEFileVersionInfo verInfo)
        {
            Contract.Requires(verInfo != null);
            this.verInfo = verInfo;
            if (this.verInfo.isDLL) hintNameTable = FileImage.dllHintNameTable.ToCharArray();
            else hintNameTable = FileImage.exeHintNameTable.ToCharArray();

            BuildTextSection();
            CalcOffsets();
            BuildRelocSection();
            // now write it out
            WriteHeader();
            WriteSections();
            Flush();
            if (closeStream) Close();
            if (pdbWriter != null)
            {

                // Write the PDB file
                pdbWriter.WritePDBFile();

                // Check to make sure the DebugInfo is the length we expected.
                if (pdbWriter.DebugInfo.Length != debugBytesSize)
                    throw new Exception("DebugInfo for the new PDB file is incompatible with the PE file.  This is most likely an internal error.  Please consult your vendor if you continue to have this problem.");

                // Write the debug info to the PE file
                using (FileStream fs = new FileStream(pdbWriter.PEFilename, FileMode.Open, FileAccess.ReadWrite))
                {
                    using (BinaryWriter bw = new BinaryWriter(fs))
                    {
                        // Get to the DebugInfo section
                        bw.Seek((int)debugBytesStartOffset, SeekOrigin.Begin);
                        bw.Write(pdbWriter.DebugInfo, 0, pdbWriter.DebugInfo.Length);
                    }
                }

            }
        }