本文整理汇总了C++中rose_rva_t类的典型用法代码示例。如果您正苦于以下问题:C++ rose_rva_t类的具体用法?C++ rose_rva_t怎么用?C++ rose_rva_t使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了rose_rva_t类的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1:
/** Allocates space for this import directory's name, import lookup table, and import address table. The items are allocated
* beginning at the specified relative virtual address. Items are reallocated if they are not allocated or if they are
* allocated in the same section to which start_rva points (the import section). They are not reallocated if they already
* exist in some other section. The return value is the number of bytes allocated in the import section. Upon return, this
* directory's address data members are initialized with possibly new values. */
size_t
SgAsmPEImportDirectory::reallocate(rose_rva_t start_rva)
{
rose_rva_t end_rva = start_rva;
const SgAsmPEImportItemPtrList &imports = get_imports()->get_vector();
/* Allocate space for the name if it hasn't been allocated already; reallocate space if its allocated in the import
* section. Allocate space even if the name is the empty string. */
if (0==p_dll_name_rva.get_rva() || p_dll_name_rva.get_section()==end_rva.get_section()) {
p_dll_name_nalloc = get_dll_name()->get_string().size() + 1;
p_dll_name_rva = end_rva;
end_rva.increment(p_dll_name_nalloc);
}
/* Allocate space for the import lookup table if it hasn't been allocated yet. The table is terminated with a zero
* entry (as is the IAT according to the spec even though the IAT size is implied by the ILT size). */
if (0==p_ilt_rva.get_rva() || p_ilt_rva.get_section()==end_rva.get_section()) {
p_ilt_nalloc = iat_required_size(); // ILT and IAT are always the same size
p_ilt_rva = end_rva;
end_rva.increment(p_ilt_nalloc);
}
/* Allocate space for the import address table if it hasn't been allocated yet. Note, the import address table should
* usually be allocated explicitly because it is referenced by the program's instructions. */
if (0==p_iat_rva.get_rva() || p_iat_rva.get_section()==end_rva.get_section()) {
p_iat_nalloc = iat_required_size();
p_iat_rva = end_rva;
end_rva.increment(p_iat_nalloc);
}
/* Allocate space for the Hint/Name pairs that haven't been allocated yet. The ILT and IAT will both point to the same
* hint/name pair when the IAT is a copy of the ILT. When the IAT is unparsed as bound addresses, then space for the
* hint/name pair is still needed because the ILT still points to it. We allocate space even for hint/name pairs that are
* zero and the empty string. We don't reallocate hint/name pairs that are stored in a different file section (so be
* careful that you don't increase the length of the name). */
for (size_t i=0; i<imports.size(); ++i) {
if (!imports[i]->get_by_ordinal() &&
(0==imports[i]->get_hintname_rva() || imports[i]->get_hintname_rva().get_section()==end_rva.get_section())) {
size_t sz = imports[i]->hintname_required_size();
imports[i]->set_hintname_nalloc(sz);
imports[i]->set_hintname_rva(end_rva);
end_rva.increment(sz);
}
}
return end_rva.get_rva() - start_rva.get_rva();
}
开发者ID:InstRO,项目名称:InstRO-ROSE,代码行数:52,代码来源:PeImportDirectory.C
示例2: assert
/** Unparse a PE Import Lookup Table or Import Address Table. The @p table_start address is the location where the ILT or IAT
* begins and should be bound to the section to which the table is being written. The table is filled with ordinals and/or
* hint/name pairs unless @p assume_bound is set, in which case the table is filled with the bound addresses. The PE spec
* requires that the IAT in the executable file has the exact same structure and content as the ILT, so this method is
* normally called wtih @p assume_bound set to false.
*
* The @p tablesize argument is the number of bytes allocated for the table, and may be less than the number of bytes required
* to write the entire table. This can happen, for instance, when the AST was modified by adding entries to the ILT/IAT but
* the size (and probably location) of the table could not be changed. This is typical of IATs since code in the .text
* section often references IAT entries via indirect jumps/calls and it is infeasible to move the IAT to a new location. If
* unparsing is unable to write all table entries due to the @p tablesize limit, an error message is printed. */
void
SgAsmPEImportDirectory::unparse_ilt_iat(std::ostream &f, const rose_rva_t &table_start, bool assume_bound,
size_t tablesize) const
{
SgAsmPEImportSection *isec = SageInterface::getEnclosingNode<SgAsmPEImportSection>(this);
assert(isec!=NULL);
SgAsmPEFileHeader *fhdr = isSgAsmPEFileHeader(isec->get_header());
assert(fhdr!=NULL);
assert(fhdr->get_word_size() <= sizeof(uint64_t));
const SgAsmPEImportItemPtrList &imports = get_imports()->get_vector();
size_t entry_size = fhdr->get_word_size();
uint64_t by_ordinal_bit = 1ull << (8*entry_size-1);
if (0==table_start.get_rva() || imports.empty())
return;
if (!table_start.get_section()) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT: table is not associated with a section: "
<<table_start.to_string() <<"\n";
}
return;
}
/* Must we limit how many entries are written? Don't forget the zero terminator. */
size_t nelmts = std::min(tablesize/entry_size, imports.size()+1);
if (nelmts<imports.size()+1) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT: table at " <<table_start.to_string()
<<" is truncated from " <<StringUtility::plural(imports.size()+1, "entries", "entry")
<<" to " <<StringUtility::plural(nelmts, "entries", "entry")
<<" (inc. zero terminator) due to allocation constraints.\n";
}
}
rose_rva_t entry_rva = table_start;
for (size_t idx=0; idx<nelmts/*including zero terminator*/; ++idx, entry_rva.increment(entry_size)) {
uint64_t entry_word = 0;
/* Write the zero terminator? */
if (idx+1==nelmts) {
uint64_t zero = 0;
entry_rva.get_section()->write(f, entry_rva.get_rel(), entry_size, &zero);
break;
}
rose_rva_t hn_rva = imports[idx]->get_hintname_rva();
/* Build the IAT/ILT entry */
if (assume_bound) {
entry_word = imports[idx]->get_bound_rva().get_rva();
} else if (imports[idx]->get_by_ordinal()) {
if (0!=(imports[idx]->get_ordinal() & ~0xffff)) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT entry #" <<idx
<<" at rva " <<entry_rva.get_rva()
<<": ordinal is out of bounds: " <<imports[idx]->get_ordinal() <<" (truncated to 16 bits)\n";
}
}
entry_word |= by_ordinal_bit | (imports[idx]->get_ordinal() & 0xffff);
} else if (0==hn_rva.get_rva() || NULL==hn_rva.get_section()) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT entry #" <<idx
<<" at rva " <<entry_rva.get_rva()
<<": non-ordinal entry has invalid hint/name pair address " <<hn_rva
<<" or is not associated with any section.\n";
}
entry_word = hn_rva.get_rva(); // best we can do
} else {
size_t bufsz = std::min(imports[idx]->get_hintname_nalloc(), imports[idx]->hintname_required_size());
if (bufsz < imports[idx]->hintname_required_size()) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT entry #" <<idx
<<" at rva " <<entry_rva.get_rva()
<<": insufficient space (" <<StringUtility::plural(bufsz, "bytes") <<")"
<<" allocated for hint/name pair at rva " <<hn_rva
<<" (need " <<StringUtility::plural(imports[idx]->hintname_required_size(), "bytes") <<")\n";
}
}
if (bufsz>=2) {
uint8_t *buf = new uint8_t[bufsz];
unsigned hint = imports[idx]->get_hint();
std::string name = imports[idx]->get_name()->get_string();
if (0!=(hint & ~0xffff)) {
if (SgAsmPEImportSection::show_import_mesg()) {
mlog[WARN] <<"SgAsmPEImportDirectory: ILT/IAT entry #" <<idx
<<" at rva " <<entry_rva.get_rva()
<<": hint is out of bounds: " <<hint <<" (truncated to 16 bits)\n";
}
}
//.........这里部分代码省略.........
开发者ID:InstRO,项目名称:InstRO-ROSE,代码行数:101,代码来源:PeImportDirectory.C
示例3:
bool operator!=(const rose_rva_t &a1, const rose_rva_t &a2) {return a1.get_rva() != a2.get_rva();}
开发者ID:Federico2014,项目名称:edg4x-rose,代码行数:1,代码来源:Rva.C
示例4: read_content
size_t
SgAsmGenericSection::read_content(const MemoryMap::Ptr &map, const rose_rva_t &start, void *dst_buf,
rose_addr_t size, bool strict) {
return read_content(map, start.get_va(), dst_buf, size, strict);
}
开发者ID:matzke1,项目名称:rose-develop,代码行数:5,代码来源:GenericSection.C
注:本文中的rose_rva_t类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论