Index: syzygy/pe/pe_file_writer.h |
diff --git a/syzygy/pe/pe_file_writer.h b/syzygy/pe/pe_file_writer.h |
index 0aa5ed45ca6b124335be7b52306ef5a359e9f23f..c7a833c93af64e75b6efcd10225240ffb0131cfc 100644 |
--- a/syzygy/pe/pe_file_writer.h |
+++ b/syzygy/pe/pe_file_writer.h |
@@ -1,97 +1,107 @@ |
-// Copyright 2011 Google Inc. All Rights Reserved. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
- |
-#ifndef SYZYGY_PE_PE_FILE_WRITER_H_ |
-#define SYZYGY_PE_PE_FILE_WRITER_H_ |
- |
-#include "base/files/file_path.h" |
-#include "syzygy/block_graph/block_graph.h" |
-#include "syzygy/core/address_space.h" |
-#include "syzygy/pe/decomposer.h" |
-#include "syzygy/pe/image_layout.h" |
-#include "syzygy/pe/pe_file_parser.h" |
- |
-namespace pe { |
- |
-// Given an address space and header information, writes a BlockGraph out |
-// to a PE image file. |
-class PEFileWriter { |
- public: |
- typedef block_graph::BlockGraph BlockGraph; |
- typedef core::AbsoluteAddress AbsoluteAddress; |
- typedef core::FileOffsetAddress FileOffsetAddress; |
- typedef core::RelativeAddress RelativeAddress; |
- |
- // @param image_layout the image layout to write. |
- explicit PEFileWriter(const ImageLayout& image_layout); |
- |
- // Writes the image to path. |
- bool WriteImage(const base::FilePath& path); |
- |
- // Updates the checksum for the image @p path. |
- static bool UpdateFileChecksum(const base::FilePath& path); |
- |
- protected: |
- // Validates the DOS header and the NT headers in the image. |
- // On success, sets the nt_headers_ pointer. |
- bool ValidateHeaders(); |
- |
- // Validates that the section info is consistent and populates |
- // section_file_range_map_ and section_index_space_. |
- bool CalculateSectionRanges(); |
- |
- // Writes the entire image to the given file. Delegates to FlushSection and |
- // WriteOneBlock. |
- bool WriteBlocks(FILE* file); |
- |
- // Closes off the writing of a section by adding any necessary padding to the |
- // output buffer. |
- void FlushSection(size_t section_index, std::vector<uint8_t>* buffer); |
- |
- // Writes a single block to the buffer, first writing any necessary padding |
- // (the content of which depends on the section type), followed by the |
- // block data (containing finalized references). |
- bool WriteOneBlock(AbsoluteAddress image_base, |
- size_t section_index, |
- const BlockGraph::Block* block, |
- std::vector<uint8_t>* buffer); |
- |
- // The file ranges of each section. This is populated by |
- // CalculateSectionRanges and is a map from section index (as ordered in |
- // the image layout) to section ranges on disk. |
- typedef core::AddressRange<core::FileOffsetAddress, size_t> FileRange; |
- typedef std::map<size_t, FileRange> SectionIndexFileRangeMap; |
- SectionIndexFileRangeMap section_file_range_map_; |
- |
- // This stores an address-space from RVAs to section indices and is populated |
- // by CalculateSectionRanges. This can be used to map from a block's |
- // address to the index of its section. This is needed for finalizing |
- // references. |
- typedef core::AddressSpace<core::RelativeAddress, size_t, size_t> |
- SectionIndexSpace; |
- SectionIndexSpace section_index_space_; |
- |
- // Our image layout as provided to the constructor. |
- const ImageLayout& image_layout_; |
- |
- // Refers to the nt headers from the image during WriteImage. |
- const IMAGE_NT_HEADERS* nt_headers_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(PEFileWriter); |
-}; |
- |
-} // namespace pe |
- |
-#endif // SYZYGY_PE_PE_FILE_WRITER_H_ |
+// Copyright 2011 Google Inc. All Rights Reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#ifndef SYZYGY_PE_PE_FILE_WRITER_H_ |
+#define SYZYGY_PE_PE_FILE_WRITER_H_ |
+ |
+#include "base/files/file_path.h" |
+#include "syzygy/block_graph/block_graph.h" |
+#include "syzygy/core/address_space.h" |
+#include "syzygy/pe/decomposer.h" |
+#include "syzygy/pe/image_layout.h" |
+#include "syzygy/pe/pe_file_parser.h" |
+ |
+namespace pe { |
+ |
+// Given an address space and header information, writes a BlockGraph out |
+// to a PE image file. |
+class PEFileWriter { |
+ public: |
+ typedef block_graph::BlockGraph BlockGraph; |
+ typedef core::AbsoluteAddress AbsoluteAddress; |
+ typedef core::FileOffsetAddress FileOffsetAddress; |
+ typedef core::RelativeAddress RelativeAddress; |
+ |
+ // @param image_layout the image layout to write. |
+ explicit PEFileWriter(const ImageLayout& image_layout); |
+ |
+ // Writes the image to path. |
+ bool WriteImage(const base::FilePath& path); |
+ |
+ // Updates the checksum for the image @p path. |
+ static bool UpdateFileChecksum(const base::FilePath& path); |
+ |
+ // Retrieves the base address of the image. |
+ // @return the base address of the image output by this function. |
+ AbsoluteAddress* PEFileWriter::GetImageBase(); |
+ |
+ // Returns the size of the image. |
+ const size_t GetImageSize(); |
+ |
+ // Closes off the writing of a section by adding any necessary padding to the |
+ // output buffer. |
+ void FlushSection(size_t section_index, |
+ std::vector<uint8_t>* buffer); |
+ |
+ // Writes a single block to the buffer, first writing any necessary padding |
+ // (the content of which depends on the section type), followed by the |
+ // block data (containing finalized references). It outputs the offset of |
+ // the block in the actual file on disk. |
+ bool WriteOneBlock(AbsoluteAddress image_base, |
+ size_t section_index, |
+ const BlockGraph::Block* block, |
+ std::vector<uint8_t>* buffer, |
+ FileOffsetAddress* block_offset); |
+ |
+ // Validates the DOS header and the NT headers in the image. |
+ // On success, sets the nt_headers_ pointer. |
+ bool ValidateHeaders(); |
+ |
+ // Validates that the section info is consistent and populates |
+ // section_file_range_map_ and section_index_space_. |
+ bool CalculateSectionRanges(); |
+ |
+ protected: |
+ // Writes the entire image to the given file. Delegates to FlushSection and |
+ // WriteOneBlock. |
+ bool WriteBlocks(FILE* file); |
+ |
+ // The file ranges of each section. This is populated by |
+ // CalculateSectionRanges and is a map from section index (as ordered in |
+ // the image layout) to section ranges on disk. |
+ typedef core::AddressRange<core::FileOffsetAddress, size_t> FileRange; |
+ typedef std::map<size_t, FileRange> SectionIndexFileRangeMap; |
+ SectionIndexFileRangeMap section_file_range_map_; |
+ |
+ // This stores an address-space from RVAs to section indices and is populated |
+ // by CalculateSectionRanges. This can be used to map from a block's |
+ // address to the index of its section. This is needed for finalizing |
+ // references. |
+ typedef core::AddressSpace<core::RelativeAddress, size_t, size_t> |
+ SectionIndexSpace; |
+ SectionIndexSpace section_index_space_; |
+ |
+ // Our image layout as provided to the constructor. |
+ const ImageLayout& image_layout_; |
+ |
+ // Refers to the nt headers from the image during WriteImage. |
+ const IMAGE_NT_HEADERS* nt_headers_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PEFileWriter); |
+}; |
+ |
+} // namespace pe |
+ |
+#endif // SYZYGY_PE_PE_FILE_WRITER_H_ |