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