33 if (!vBuf || !exportsMap || !iat.iatOffset)
return 0;
35 size_t max_check = vBufSize -
sizeof(FIELD_T);
36 if (max_check <
sizeof(FIELD_T)) {
40 iat.isTerminated =
true;
41 const peconv::ExportedFunc *exp =
nullptr;
43 bool is_terminated =
true;
44 FIELD_T *imp = (FIELD_T*)(iat.iatOffset + (ULONG_PTR)vBuf);
45 for (; imp < (FIELD_T*)(vBuf + max_check); imp++) {
51 const FIELD_T imp_va = (*imp);
54 if (!callback->shouldProcessVA(imp_va))
break;
58 const peconv::ExportedFunc *exp = exportsMap->find_export_by_va(imp_va);
62 if (!callback->shouldAcceptExport(imp_va, *exp))
break;
65 is_terminated =
false;
67 iat.append(offset, imp_va, exp);
69 iat.isTerminated = is_terminated;
70 if (!exp && iat.iatOffset && iat.countThunks() > 0) {
71 BYTE *iat_ptr = (BYTE*)(iat.iatOffset + (ULONG_PTR)vBuf);
72 size_t diff = (BYTE*)imp - iat_ptr;
82 if (!vBuf || !vBufSize || !exportsMap)
return nullptr;
84 const bool is64bit = (
sizeof(FIELD_T) ==
sizeof(DWORD)) ?
false :
true;
86 size_t max_check = vBufSize -
sizeof(FIELD_T);
87 if (search_offset > vBufSize || max_check <
sizeof(FIELD_T)) {
91 for (BYTE* ptr = vBuf + search_offset; ptr < vBuf + max_check; ptr++) {
92 FIELD_T *to_check = (FIELD_T*)ptr;
93 if (!peconv::validate_ptr(vBuf, vBufSize, to_check,
sizeof(FIELD_T)))
break;
94 FIELD_T possible_va = (*to_check);
95 if (possible_va == 0)
continue;
98 if (!callback->shouldProcessVA(possible_va))
continue;
102 const peconv::ExportedFunc *exp = exportsMap->find_export_by_va(possible_va);
106 if (!callback->shouldAcceptExport(possible_va, *exp))
continue;
109 DWORD iat_offset = DWORD(ptr - vBuf);
112 size_t _iat_size =
fill_iat<FIELD_T>(vBuf, vBufSize, exportsMap, *iat_block, callback);
114 iat_block->
iatSize = _iat_size;
117 delete iat_block; iat_block =
nullptr;
size_t fill_iat(BYTE *vBuf, size_t vBufSize, IN const peconv::ExportsMapper *exportsMap, IN OUT IATBlock &iat, IN ThunkFoundCallback *callback)
IATBlock * find_iat(BYTE *vBuf, size_t vBufSize, IN const peconv::ExportsMapper *exportsMap, IN size_t search_offset, IN ThunkFoundCallback *callback)