blob: 9e19ad8ef856192681f05b1d2e09147b0587aa73 [file] [log] [blame]
// Copyright 2012 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.
//
// Declares the AddDebugDirectoryEntryTransform. This find or creates a debug
// directory entry of the specified type. It is intended to be used by other
// transforms.
//
// After the transform has completed the 'offset' and 'block' members functions
// point to the found or created debug directory entry with the type as
// specified in the transform constructor.
#ifndef SYZYGY_PE_TRANSFORMS_ADD_DEBUG_DIRECTORY_ENTRY_TRANSFORM_H_
#define SYZYGY_PE_TRANSFORMS_ADD_DEBUG_DIRECTORY_ENTRY_TRANSFORM_H_
#include <windows.h>
#include "base/files/file_path.h"
#include "syzygy/block_graph/transforms/named_transform.h"
namespace pe {
namespace transforms {
using block_graph::BlockGraph;
using block_graph::TransformPolicyInterface;
using block_graph::transforms::NamedBlockGraphTransformImpl;
// A PE BlockGraph transform for adding/updating the a debug directory entry
// of a given type.
class AddDebugDirectoryEntryTransform
: public NamedBlockGraphTransformImpl<AddDebugDirectoryEntryTransform> {
public:
// Configures this transform.
//
// @param type the type of the debug directory entry to search for.
// @param always_add if this is true a new debug directory entry will always
// be created, otherwise a new one will be created only if none already
// exists.
AddDebugDirectoryEntryTransform(DWORD type, bool always_add)
: type_(type), always_add_(always_add), added_(false), block_(NULL),
offset_(-1) {
}
// Adds or finds the debug data directory of the given type.
//
// @param policy The policy object restricting how the transform is applied.
// @param block_graph The block graph to transform.
// @param dos_header_block The DOS header block of the block graph.
// @returns true on success, false otherwise.
virtual bool TransformBlockGraph(
const TransformPolicyInterface* policy,
BlockGraph* block_graph,
BlockGraph::Block* dos_header_block) OVERRIDE;
// Returns true if a new debug directory entry was created.
bool added() const { return added_; }
// Access the block containing the found or created debug directory entry.
//
// @returns the block housing the debug directory entry.
BlockGraph::Block* block() const { return block_; }
// Access the offset of the found or created debug directory entry.
//
// @returns the offset into the block of the debug directory entry.
BlockGraph::Offset offset() const { return offset_; }
// The transform name.
static const char kTransformName[];
private:
// The type of the debug directory entry to find or add.
DWORD type_;
// If this is true a new debug directory entry will always be added, even if
// there exists another one.
bool always_add_;
// These member variables hold state after the transform has been applied.
// Indicates if a new directory entry was added.
bool added_;
// Stores the block housing the debug data directory entries.
BlockGraph::Block* block_;
// Stores the offset into the block of the found or created debug data
// directory entry.
BlockGraph::Offset offset_;
DISALLOW_COPY_AND_ASSIGN(AddDebugDirectoryEntryTransform);
};
} // namespace transforms
} // namespace pe
#endif // SYZYGY_PE_TRANSFORMS_ADD_DEBUG_DIRECTORY_ENTRY_TRANSFORM_H_