1#include <string.h> 2#include "stuff/bytesex.h" 3#include "coff/base_relocs.h" 4#include "coff/ms_dos_stub.h" 5#include "coff/filehdr.h" 6#include "coff/aouthdr.h" 7#include "coff/scnhdr.h" 8#include "coff/syment.h" 9#include "coff/bytesex.h" 10#include "coff/debug_directory.h" 11 12__private_extern__ 13void 14swap_base_relocation_block_header( 15struct base_relocation_block_header *h, 16enum byte_sex target_byte_sex) 17{ 18 h->page_rva = SWAP_INT(h->page_rva); 19 h->block_size = SWAP_INT(h->block_size); 20} 21 22__private_extern__ 23void 24swap_base_relocation_entry( 25struct base_relocation_entry *b, 26uint32_t n, 27enum byte_sex target_byte_sex) 28{ 29 uint32_t i; 30 enum byte_sex host_byte_sex; 31 enum bool to_host_byte_sex; 32 33 struct swapped_base_relocation_entry { 34 union { 35 struct { 36#if __BIG_ENDIAN__ 37 uint16_t type:4, 38 offset:12; 39#else 40 uint16_t offset:12, 41 type:4; 42#endif 43 } fields; 44 uint16_t word; 45 } u; 46 } sb; 47 48 host_byte_sex = get_host_byte_sex(); 49 to_host_byte_sex = (enum bool)(target_byte_sex == host_byte_sex); 50 for(i = 0; i < n; i++){ 51 if(to_host_byte_sex){ 52 memcpy(&sb, b + i, sizeof(struct base_relocation_entry)); 53 sb.u.word = SWAP_SHORT(sb.u.word); 54 b[i].offset = sb.u.fields.offset; 55 b[i].type = sb.u.fields.type; 56 } 57 else{ 58 sb.u.fields.offset = b[i].offset; 59 sb.u.fields.type = b[i].type; 60 sb.u.word = SWAP_SHORT(sb.u.word); 61 memcpy(b + i, &sb, sizeof(struct base_relocation_entry)); 62 } 63 } 64} 65 66__private_extern__ 67void 68swap_ms_dos_stub( 69struct ms_dos_stub *m, 70enum byte_sex target_byte_sex) 71{ 72 int i; 73 74 m->e_magic = SWAP_SHORT(m->e_magic); 75 m->e_cblp = SWAP_SHORT(m->e_cblp); 76 m->e_cp = SWAP_SHORT(m->e_cp); 77 m->e_crlc = SWAP_SHORT(m->e_crlc); 78 m->e_cparhdr = SWAP_SHORT(m->e_cparhdr); 79 m->e_minalloc = SWAP_SHORT(m->e_minalloc); 80 m->e_maxalloc = SWAP_SHORT(m->e_maxalloc); 81 m->e_ss = SWAP_SHORT(m->e_ss); 82 m->e_sp = SWAP_SHORT(m->e_sp); 83 m->e_csum = SWAP_SHORT(m->e_csum); 84 m->e_ip = SWAP_SHORT(m->e_ip); 85 m->e_cs = SWAP_SHORT(m->e_cs); 86 m->e_lfarlc = SWAP_SHORT(m->e_lfarlc); 87 m->e_ovno = SWAP_SHORT(m->e_ovno); 88 for(i = 0; i < 4; i++) 89 m->e_res[i] = SWAP_SHORT(m->e_res[i]); 90 m->e_oemid = SWAP_SHORT(m->e_oemid); 91 m->e_oeminfo = SWAP_SHORT(m->e_oeminfo); 92 for(i = 0; i < 10; i++) 93 m->e_res2[i] = SWAP_SHORT(m->e_res2[i]); 94 m->e_lfanew = SWAP_INT(m->e_lfanew); 95} 96 97__private_extern__ 98void 99swap_filehdr( 100struct filehdr *f, 101enum byte_sex target_byte_sex) 102{ 103 f->f_magic = SWAP_SHORT(f->f_magic); 104 f->f_nscns = SWAP_SHORT(f->f_nscns); 105 f->f_timdat = SWAP_INT(f->f_timdat); 106 f->f_symptr = SWAP_INT(f->f_symptr); 107 f->f_nsyms = SWAP_INT(f->f_nsyms); 108 f->f_opthdr = SWAP_SHORT(f->f_opthdr); 109 f->f_flags = SWAP_SHORT(f->f_flags); 110} 111 112__private_extern__ 113void 114swap_aouthdr( 115struct aouthdr *a, 116enum byte_sex target_byte_sex) 117{ 118 int i; 119 120 a->magic = SWAP_SHORT(a->magic); 121 a->vstamp = SWAP_SHORT(a->vstamp); 122 a->tsize = SWAP_INT(a->tsize); 123 a->dsize = SWAP_INT(a->dsize); 124 a->bsize = SWAP_INT(a->bsize); 125 a->entry = SWAP_INT(a->entry); 126 a->text_start = SWAP_INT(a->text_start); 127 a->data_start = SWAP_INT(a->data_start); 128 a->ImageBase = SWAP_INT(a->ImageBase); 129 a->SectionAlignment = SWAP_INT(a->SectionAlignment); 130 a->FileAlignment = SWAP_INT(a->FileAlignment); 131 a->MajorOperatingSystemVersion = 132 SWAP_SHORT(a->MajorOperatingSystemVersion); 133 a->MinorOperatingSystemVersion = 134 SWAP_SHORT(a->MinorOperatingSystemVersion); 135 a->MajorImageVersion = SWAP_SHORT(a->MajorImageVersion); 136 a->MinorImageVersion = SWAP_SHORT(a->MinorImageVersion); 137 a->MajorSubsystemVersion = SWAP_SHORT(a->MajorSubsystemVersion); 138 a->MinorSubsystemVersion = SWAP_SHORT(a->MinorSubsystemVersion); 139 a->Win32VersionValue = SWAP_INT(a->Win32VersionValue); 140 a->SizeOfImage = SWAP_INT(a->SizeOfImage); 141 a->SizeOfHeaders = SWAP_INT(a->SizeOfHeaders); 142 a->CheckSum = SWAP_INT(a->CheckSum); 143 a->Subsystem = SWAP_SHORT(a->Subsystem); 144 a->DllCharacteristics = SWAP_SHORT(a->DllCharacteristics); 145 a->SizeOfStackReserve = SWAP_INT(a->SizeOfStackReserve); 146 a->SizeOfStackCommit = SWAP_INT(a->SizeOfStackCommit); 147 a->SizeOfHeapReserve = SWAP_INT(a->SizeOfHeapReserve); 148 a->SizeOfHeapCommit = SWAP_INT(a->SizeOfHeapCommit); 149 a->LoaderFlags = SWAP_INT(a->LoaderFlags); 150 a->NumberOfRvaAndSizes = SWAP_INT(a->NumberOfRvaAndSizes); 151 for(i = 0; i < 16; i++){ 152 a->DataDirectory[i][0] = SWAP_INT(a->DataDirectory[i][0]); 153 a->DataDirectory[i][1] = SWAP_INT(a->DataDirectory[i][1]); 154 } 155} 156 157__private_extern__ 158void 159swap_aouthdr_64( 160struct aouthdr_64 *a, 161enum byte_sex target_byte_sex) 162{ 163 int i; 164 165 a->magic = SWAP_SHORT(a->magic); 166 a->vstamp = SWAP_SHORT(a->vstamp); 167 a->tsize = SWAP_INT(a->tsize); 168 a->dsize = SWAP_INT(a->dsize); 169 a->bsize = SWAP_INT(a->bsize); 170 a->entry = SWAP_INT(a->entry); 171 a->text_start = SWAP_INT(a->text_start); 172 a->ImageBase = SWAP_INT(a->ImageBase); 173 a->SectionAlignment = SWAP_INT(a->SectionAlignment); 174 a->FileAlignment = SWAP_INT(a->FileAlignment); 175 a->MajorOperatingSystemVersion = 176 SWAP_SHORT(a->MajorOperatingSystemVersion); 177 a->MinorOperatingSystemVersion = 178 SWAP_SHORT(a->MinorOperatingSystemVersion); 179 a->MajorImageVersion = SWAP_SHORT(a->MajorImageVersion); 180 a->MinorImageVersion = SWAP_SHORT(a->MinorImageVersion); 181 a->MajorSubsystemVersion = SWAP_SHORT(a->MajorSubsystemVersion); 182 a->MinorSubsystemVersion = SWAP_SHORT(a->MinorSubsystemVersion); 183 a->Win32VersionValue = SWAP_INT(a->Win32VersionValue); 184 a->SizeOfImage = SWAP_INT(a->SizeOfImage); 185 a->SizeOfHeaders = SWAP_INT(a->SizeOfHeaders); 186 a->CheckSum = SWAP_INT(a->CheckSum); 187 a->Subsystem = SWAP_SHORT(a->Subsystem); 188 a->DllCharacteristics = SWAP_SHORT(a->DllCharacteristics); 189 a->SizeOfStackReserve = SWAP_INT(a->SizeOfStackReserve); 190 a->SizeOfStackCommit = SWAP_INT(a->SizeOfStackCommit); 191 a->SizeOfHeapReserve = SWAP_INT(a->SizeOfHeapReserve); 192 a->SizeOfHeapCommit = SWAP_INT(a->SizeOfHeapCommit); 193 a->LoaderFlags = SWAP_INT(a->LoaderFlags); 194 a->NumberOfRvaAndSizes = SWAP_INT(a->NumberOfRvaAndSizes); 195 for(i = 0; i < 16; i++){ 196 a->DataDirectory[i][0] = SWAP_INT(a->DataDirectory[i][0]); 197 a->DataDirectory[i][1] = SWAP_INT(a->DataDirectory[i][1]); 198 } 199} 200 201__private_extern__ 202void 203swap_scnhdr( 204struct scnhdr *s, 205uint32_t n, 206enum byte_sex target_byte_sex) 207{ 208 uint32_t i; 209 210 for(i = 0; i < n; i++){ 211 s[i].s_vsize = SWAP_INT(s[i].s_vsize); 212 s[i].s_vaddr = SWAP_INT(s[i].s_vaddr); 213 s[i].s_size = SWAP_INT(s[i].s_size); 214 s[i].s_scnptr = SWAP_INT(s[i].s_scnptr); 215 s[i].s_relptr = SWAP_INT(s[i].s_relptr); 216 s[i].s_lnnoptr = SWAP_INT(s[i].s_lnnoptr); 217 s[i].s_nreloc = SWAP_SHORT(s[i].s_nreloc); 218 s[i].s_nlnno = SWAP_SHORT(s[i].s_nlnno); 219 s[i].s_flags = SWAP_INT(s[i].s_flags); 220 } 221} 222 223__private_extern__ 224void 225swap_syment( 226struct syment *s, 227uint32_t n, 228enum byte_sex target_byte_sex) 229{ 230 uint32_t i; 231 232 for(i = 0; i < n; i++){ 233 if(s[i].e.e.e_zeroes == 0) 234 s[i].e.e.e_offset = SWAP_INT(s[i].e.e.e_offset); 235 s[i].e_value = SWAP_INT(s[i].e_value); 236 s[i].e_scnum = SWAP_SHORT(s[i].e_scnum); 237 s[i].e_type = SWAP_SHORT(s[i].e_type); 238 } 239} 240 241__private_extern__ 242void 243swap_debug_directory_entry( 244struct debug_directory_entry *d, 245enum byte_sex target_byte_sex) 246{ 247 d->Characteristics = SWAP_INT(d->Characteristics); 248 d->TimeDateStamp = SWAP_INT(d->TimeDateStamp); 249 d->MajorVersion = SWAP_SHORT(d->MajorVersion); 250 d->MinorVersion = SWAP_SHORT(d->MinorVersion); 251 d->Type = SWAP_INT(d->Type); 252 d->SizeOfData = SWAP_INT(d->SizeOfData); 253 d->AddressOfRawData = SWAP_INT(d->AddressOfRawData); 254 d->PointerToRawData = SWAP_INT(d->PointerToRawData); 255} 256 257__private_extern__ 258void 259swap_mtoc_debug_info( 260struct mtoc_debug_info *m, 261enum byte_sex target_byte_sex) 262{ 263 m->Signature = SWAP_INT(m->Signature); 264} 265