Blame src/imports/pe_enum_image_import_hdrs.c
|
|
feffc7 |
/*****************************************************************************/
|
|
|
feffc7 |
/* pemagination: a (virtual) tour into portable bits and executable bytes */
|
|
|
feffc7 |
/* Copyright (C) 2013,2014,2015 Z. Gilboa */
|
|
|
feffc7 |
/* Released under GPLv2 and GPLv3; see COPYING.PEMAGINE. */
|
|
|
feffc7 |
/*****************************************************************************/
|
|
|
feffc7 |
|
|
|
feffc7 |
#include <psxtypes/psxtypes.h>
|
|
|
feffc7 |
#include <pemagine/pe_structs.h>
|
|
|
feffc7 |
#include <pemagine/pemagine.h>
|
|
|
feffc7 |
|
|
|
feffc7 |
pe_api
|
|
|
feffc7 |
int pe_enum_image_import_hdrs(
|
|
|
feffc7 |
const void * base,
|
|
|
feffc7 |
pe_enum_image_import_hdrs_callback * callback,
|
|
|
feffc7 |
void * ctx)
|
|
|
feffc7 |
{
|
|
|
feffc7 |
struct pe_import_hdr * imp_hdr;
|
|
|
feffc7 |
int ret;
|
|
|
feffc7 |
|
|
|
feffc7 |
if (!(imp_hdr = pe_get_image_import_dir_addr(base,0))) {
|
|
|
feffc7 |
callback(base,0,PE_CALLBACK_REASON_ERROR,ctx);
|
|
|
feffc7 |
return -1;
|
|
|
feffc7 |
}
|
|
|
feffc7 |
|
|
|
feffc7 |
if ((ret = callback(base,0,PE_CALLBACK_REASON_INIT,ctx)) <= 0)
|
|
|
feffc7 |
return ret;
|
|
|
feffc7 |
|
|
|
feffc7 |
while (imp_hdr->name_rva[0]) {
|
|
|
feffc7 |
if ((ret = callback(base,imp_hdr,PE_CALLBACK_REASON_ITEM,ctx)) <= 0)
|
|
|
feffc7 |
return ret;
|
|
|
feffc7 |
imp_hdr++;
|
|
|
feffc7 |
};
|
|
|
feffc7 |
|
|
|
feffc7 |
return callback(base,imp_hdr,PE_CALLBACK_REASON_DONE,ctx);
|
|
|
feffc7 |
}
|