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