comparison dyncallback/dyncall_callback_x64.c @ 202:030fbb70aa1b

- changed allocwx code: * to introduce a call allowing to switch the written page to be executable (e.g. using mprotect) * changed mmap based code so page is always W^X
author Tassilo Philipp
date Mon, 20 Mar 2017 23:12:58 +0100
parents d48a8b8d2ef9
children f5577f6bf97a
comparison
equal deleted inserted replaced
201:136409adbdd1 202:030fbb70aa1b
50 DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) 50 DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata)
51 { 51 {
52 int err; 52 int err;
53 DCCallback* pcb; 53 DCCallback* pcb;
54 err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); 54 err = dcAllocWX(sizeof(DCCallback), (void**) &pcb);
55 if (err != 0) return 0; 55 if(err)
56 return NULL;
56 57
57 #if defined (DC__OS_Win64) 58 #if defined (DC__OS_Win64)
58 dcbInitThunk(&pcb->thunk, dcCallback_x64_win64); 59 dcbInitThunk(&pcb->thunk, dcCallback_x64_win64);
59 #else 60 #else
60 dcbInitThunk(&pcb->thunk, dcCallback_x64_sysv); 61 dcbInitThunk(&pcb->thunk, dcCallback_x64_sysv);
61 #endif 62 #endif
62 dcbInitCallback(pcb, signature, handler, userdata); 63 dcbInitCallback(pcb, signature, handler, userdata);
64
65 err = dcInitExecWX(pcb, sizeof(DCCallback));
66 if(err) {
67 dcFreeWX(pcb, sizeof(DCCallback));
68 return NULL;
69 }
70
63 return pcb; 71 return pcb;
64 } 72 }
65 73
66 74
67 void dcbFreeCallback(DCCallback* pcb) 75 void dcbFreeCallback(DCCallback* pcb)