c-scripting/symbol_set.c

92 lines
2.3 KiB
C

/***********************************************************
** symbol_set - A public domain C modifier library
** by Allen Webster, "Mr. 4th", allenw@mr4th.com
**
** No warranty implied; use at your own risk
**
** Read README to get started.
*/
#if SY__OS_WINDOWS
#pragma pack(push,1)
#define SY__DOS_MAGIC 0x5A4D
typedef struct Sy__DosHeader{
Sy_U16 magic;
Sy_U16 last_page_size;
Sy_U16 page_count;
Sy_U16 reloc_count;
Sy_U16 paragraph_header_size;
Sy_U16 min_paragraph;
Sy_U16 max_paragraph;
Sy_U16 init_ss;
Sy_U16 init_sp;
Sy_U16 checksum;
Sy_U16 init_ip;
Sy_U16 init_cs;
Sy_U16 reloc_table_file_off;
Sy_U16 overlay_number;
Sy_U16 reserved[4];
Sy_U16 oem_id;
Sy_U16 oem_info;
Sy_U16 reserved2[10];
Sy_U32 coff_offset;
} Sy__DosHeader;
typedef struct Sy__CoffHeader{
Sy_U16 machine_type;
Sy_U16 section_count;
Sy_U32 time_stamp;
Sy_U32 symbol_table_foff;
Sy_U32 symbol_count;
Sy_U16 optional_header_size;
Sy_U16 flags;
} Sy__CoffHeader;
typedef struct Sy_CoffSection{
Sy_U8 name[8];
Sy_U32 vsize;
Sy_U32 voff;
Sy_U32 fsize;
Sy_U32 foff;
Sy_U32 relocations_foff;
Sy_U32 line_numbers_foff;
Sy_U16 relocation_count;
Sy_U16 line_number_count;
Sy_U32 flags;
} Sy_CoffSection;
#pragma pack(pop)
void
sy__section_init(char *name, Sy_U32 name_size, void **first_out, void **opl_out){
if (name_size <= 8){
extern Sy_U8 __ImageBase[];
Sy_U8 *base = __ImageBase;
Sy__DosHeader *dos = (Sy__DosHeader*)base;
if (dos_header->magic == SY__DOS_MAGIC){
Sy__CoffHeader *coff = (Sy__CoffHeader*)(base + dos->coff_offset);
Sy_U32 sections_offset = (dos->coff_offset + sizeof(*coff) +
coff->optional_header_size);
Sy_U32 section_count = coff->section_count;
Sy_CoffSection *section = (Sy_CoffSection*)(base + sections_offset);
for (Sy_U32 i = 0; i < section_count; i += 1, section += 1){
int match = 1;
for (Sy_U32 j = 0; j < 8; j += 1){
if (name[j] != section->name[j]){
match = 0;
break;
}
if (name[j] == 0){
break;
}
}
if (match){
*first_out = base + section->voff;
*opl_out = base + section->voff + section->vsize;
break;
}
}
}
}
}
#endif