about summary refs log tree commit diff stats
path: root/miasm2/jitter/vm_mngr_py.c
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2014-06-17 15:44:50 +0200
committerserpilliere <devnull@localhost>2014-06-17 15:44:50 +0200
commit5023baebac24889e44f1ee04f0ad9fcdcaab7b29 (patch)
tree1f53e774ca29f97f1c386db662de4eb5467b996c /miasm2/jitter/vm_mngr_py.c
parent180b3907cdfcda2e8f3bd719b1d3531ba2e32a5f (diff)
downloadmiasm-5023baebac24889e44f1ee04f0ad9fcdcaab7b29.tar.gz
miasm-5023baebac24889e44f1ee04f0ad9fcdcaab7b29.zip
jitter: modify vm_set_mem to set exception flags
Diffstat (limited to 'miasm2/jitter/vm_mngr_py.c')
-rw-r--r--miasm2/jitter/vm_mngr_py.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c
index 19686930..eb5fa112 100644
--- a/miasm2/jitter/vm_mngr_py.c
+++ b/miasm2/jitter/vm_mngr_py.c
@@ -163,6 +163,8 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args)
 	Py_ssize_t length;
 	int ret = 0x1337;
 	uint64_t val;
+	uint64_t l;
+	struct memory_page_node * mpn;
 
 	if (!PyArg_ParseTuple(args, "OO", &addr, &item_str))
 		return NULL;
@@ -175,14 +177,21 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args)
 	buf_size = PyString_Size(item_str);
 	PyString_AsStringAndSize(item_str, &buf_data, &length);
 
+
+	check_write_code_bloc(&self->vm_mngr, buf_size*8, val);
 	/* write is multiple page wide */
 	while (buf_size){
-		MEM_WRITE_08(&self->vm_mngr, val, (char) *(buf_data));
-		buf_data += 1;
-		val += 1;
-		buf_size -= 1;
+		mpn = get_memory_page_from_address(&self->vm_mngr, val);
+		if (!mpn){
+			PyErr_SetString(PyExc_RuntimeError, "cannot find address");
+			return 0;
+		}
+		l = MIN(buf_size, mpn->size - (val-mpn->ad));
+		memcpy(mpn->ad_hp + (val-mpn->ad), buf_data, l);
+		buf_data += l;
+		val += l;
+		buf_size -= l;
 	}
-
 	return PyLong_FromUnsignedLongLong((uint64_t)ret);
 }