mirror of
https://github.com/frida/tinycc
synced 2024-12-24 22:16:49 +03:00
tccpe: use more official structs
This commit is contained in:
parent
f366cb20fe
commit
719ba918dd
64
tccpe.c
64
tccpe.c
@ -177,6 +177,31 @@ typedef struct _IMAGE_SECTION_HEADER {
|
||||
|
||||
#define IMAGE_SIZEOF_SECTION_HEADER 40
|
||||
|
||||
typedef struct _IMAGE_EXPORT_DIRECTORY {
|
||||
DWORD Characteristics;
|
||||
DWORD TimeDateStamp;
|
||||
WORD MajorVersion;
|
||||
WORD MinorVersion;
|
||||
DWORD Name;
|
||||
DWORD Base;
|
||||
DWORD NumberOfFunctions;
|
||||
DWORD NumberOfNames;
|
||||
DWORD AddressOfFunctions;
|
||||
DWORD AddressOfNames;
|
||||
DWORD AddressOfNameOrdinals;
|
||||
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
|
||||
|
||||
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
|
||||
union {
|
||||
DWORD Characteristics;
|
||||
DWORD OriginalFirstThunk;
|
||||
};
|
||||
DWORD TimeDateStamp;
|
||||
DWORD ForwarderChain;
|
||||
DWORD Name;
|
||||
DWORD FirstThunk;
|
||||
} IMAGE_IMPORT_DESCRIPTOR;
|
||||
|
||||
typedef struct _IMAGE_BASE_RELOCATION {
|
||||
DWORD VirtualAddress;
|
||||
DWORD SizeOfBlock;
|
||||
@ -218,27 +243,6 @@ struct pe_header
|
||||
#endif
|
||||
};
|
||||
|
||||
struct pe_import_header {
|
||||
DWORD first_entry;
|
||||
DWORD time_date;
|
||||
DWORD forwarder;
|
||||
DWORD lib_name_offset;
|
||||
DWORD first_thunk;
|
||||
};
|
||||
|
||||
struct pe_export_header {
|
||||
DWORD Characteristics;
|
||||
DWORD TimeDateStamp;
|
||||
DWORD Version;
|
||||
DWORD Name;
|
||||
DWORD Base;
|
||||
DWORD NumberOfFunctions;
|
||||
DWORD NumberOfNames;
|
||||
DWORD AddressOfFunctions;
|
||||
DWORD AddressOfNames;
|
||||
DWORD AddressOfNameOrdinals;
|
||||
};
|
||||
|
||||
struct pe_reloc_header {
|
||||
DWORD offset;
|
||||
DWORD size;
|
||||
@ -742,7 +746,7 @@ ST_FN void pe_build_imports(struct pe_info *pe)
|
||||
pe_align_section(pe->thunk, 16);
|
||||
|
||||
pe->imp_offs = dll_ptr = pe->thunk->data_offset;
|
||||
pe->imp_size = (ndlls + 1) * sizeof(struct pe_import_header);
|
||||
pe->imp_size = (ndlls + 1) * sizeof(IMAGE_IMPORT_DESCRIPTOR);
|
||||
pe->iat_offs = dll_ptr + pe->imp_size;
|
||||
pe->iat_size = (sym_cnt + ndlls) * sizeof(ADDR3264);
|
||||
section_ptr_add(pe->thunk, pe->imp_size + 2*pe->iat_size);
|
||||
@ -751,7 +755,7 @@ ST_FN void pe_build_imports(struct pe_info *pe)
|
||||
ent_ptr = pe->iat_offs + pe->iat_size;
|
||||
|
||||
for (i = 0; i < pe->imp_count; ++i) {
|
||||
struct pe_import_header *hdr;
|
||||
IMAGE_IMPORT_DESCRIPTOR *hdr;
|
||||
int k, n;
|
||||
ADDR3264 v;
|
||||
struct pe_import_info *p = pe->imp_info[i];
|
||||
@ -760,10 +764,10 @@ ST_FN void pe_build_imports(struct pe_info *pe)
|
||||
/* put the dll name into the import header */
|
||||
v = put_elf_str(pe->thunk, name);
|
||||
|
||||
hdr = (struct pe_import_header*)(pe->thunk->data + dll_ptr);
|
||||
hdr->first_thunk = thk_ptr + rva_base;
|
||||
hdr->first_entry = ent_ptr + rva_base;
|
||||
hdr->lib_name_offset = v + rva_base;
|
||||
hdr = (IMAGE_IMPORT_DESCRIPTOR*)(pe->thunk->data + dll_ptr);
|
||||
hdr->FirstThunk = thk_ptr + rva_base;
|
||||
hdr->OriginalFirstThunk = ent_ptr + rva_base;
|
||||
hdr->Name = v + rva_base;
|
||||
|
||||
for (k = 0, n = p->sym_count; k <= n; ++k) {
|
||||
if (k < n) {
|
||||
@ -796,7 +800,7 @@ ST_FN void pe_build_imports(struct pe_info *pe)
|
||||
thk_ptr += sizeof (ADDR3264);
|
||||
ent_ptr += sizeof (ADDR3264);
|
||||
}
|
||||
dll_ptr += sizeof(struct pe_import_header);
|
||||
dll_ptr += sizeof(IMAGE_IMPORT_DESCRIPTOR);
|
||||
dynarray_reset(&p->symbols, &p->sym_count);
|
||||
}
|
||||
dynarray_reset(&pe->imp_info, &pe->imp_count);
|
||||
@ -834,7 +838,7 @@ ST_FN void pe_build_exports(struct pe_info *pe)
|
||||
ElfW(Sym) *sym;
|
||||
int sym_index, sym_end;
|
||||
DWORD rva_base, func_o, name_o, ord_o, str_o;
|
||||
struct pe_export_header *hdr;
|
||||
IMAGE_EXPORT_DIRECTORY *hdr;
|
||||
int sym_count, ord;
|
||||
struct pe_sort_sym **sorted, *p;
|
||||
|
||||
@ -875,7 +879,7 @@ ST_FN void pe_build_exports(struct pe_info *pe)
|
||||
dllname = tcc_basename(pe->filename);
|
||||
|
||||
pe->exp_offs = pe->thunk->data_offset;
|
||||
func_o = pe->exp_offs + sizeof(struct pe_export_header);
|
||||
func_o = pe->exp_offs + sizeof(IMAGE_EXPORT_DIRECTORY);
|
||||
name_o = func_o + sym_count * sizeof (DWORD);
|
||||
ord_o = name_o + sym_count * sizeof (DWORD);
|
||||
str_o = ord_o + sym_count * sizeof(WORD);
|
||||
|
Loading…
Reference in New Issue
Block a user