1 #include "a.h"
2
3 #if defined _WIN32
4 # define WIN32_LEAN_AND_MEAN
5 # include <windows.h>
6 #elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
7 # include <sys/mman.h>
8 # include <unistd.h>
9 # include <stdio.h>
10 # include <errno.h>
11 #endif
12
makeasmwriteable(void)13 void makeasmwriteable(void)
14 {
15 #ifndef ENGINE_USING_A_C
16 extern int dep_begin, dep_end;
17
18 # if defined _WIN32
19 DWORD oldprot;
20 TCHAR msg[1024+64], msgbuf[1024];
21 if (!VirtualProtect((LPVOID)&dep_begin, (SIZE_T)&dep_end - (SIZE_T)&dep_begin, PAGE_EXECUTE_READWRITE, &oldprot)) {
22 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
23 NULL, GetLastError(),
24 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
25 (LPTSTR)msgbuf, 1024, NULL);
26 wsprintf(msg, "Error making code writeable: %s", msgbuf);
27 MessageBox(0, msg, "BUILD engine", MB_OK|MB_ICONSTOP);
28 return;
29 }
30
31 # elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
32 int pagesize;
33 size_t dep_begin_page;
34 pagesize = sysconf(_SC_PAGE_SIZE);
35 if (pagesize == -1) {
36 fputs("Error getting system page size\n", stderr);
37 return;
38 }
39 dep_begin_page = ((size_t)&dep_begin) & ~(pagesize-1);
40 if (mprotect((void *)dep_begin_page, (size_t)&dep_end - dep_begin_page, PROT_READ|PROT_WRITE) < 0) {
41 fprintf(stderr, "Error making code writeable (errno=%d)\n", errno);
42 return;
43 }
44
45 # else
46 # error Dont know how to unprotect the self-modifying assembly on this platform!
47 # endif
48
49 #endif //ENGINE_USING_A_C
50 }
51