Mercurial > pub > dyncall > dyncall
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) |