PyObject * PyBuffer_FromMemory(void *data, Py_ssize_t len) { Py_buffer buffer; PyObject *mv; PyBuffer_FillInfo(&buffer, NULL, data, len, 1, PyBUF_CONTIG_RO); mv = PyMemoryView_FromBuffer(&buffer); PyBuffer_Release(&buffer); return mv; }
static int py_anal(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) { PyObject *tmpreg = NULL; int size = 0; int seize = -1; int i = 0; if (!op) return -1; if (py_anal_cb) { memset(op, 0, sizeof (RAnalOp)); // anal(addr, buf) - returns size + dictionary (structure) for RAnalOp Py_buffer pybuf = { .buf = (void *) buf, // Warning: const is lost when casting .len = len, .readonly = 1, .ndim = 1, .itemsize = 1, }; PyObject *memview = PyMemoryView_FromBuffer (&pybuf); PyObject *arglist = Py_BuildValue ("(NK)", memview, addr); PyObject *result = PyEval_CallObject (py_anal_cb, arglist); if (result && PyList_Check (result)) { PyObject *len = PyList_GetItem (result, 0); PyObject *dict = PyList_GetItem (result, 1); if (dict && PyDict_Check (dict)) { seize = PyNumber_AsSsize_t (len, NULL); op->type = getI (dict, "type"); op->cycles = getI (dict, "cycles"); op->size = seize; op->addr = getI (dict, "addr"); op->jump = getI (dict, "jump"); op->fail = getI (dict, "fail"); op->stackop = getI (dict, "stackop"); op->stackptr = getI (dict, "stackptr"); op->ptr = getI (dict, "ptr"); op->eob = getB (dict, "eob"); // Loading 'src' and 'dst' values // SRC is is a list of 3 elements PyObject *tmpsrc = getO (dict, "src"); if (tmpsrc && PyList_Check (tmpsrc)) { for (i = 0; i < 3; i++) { PyObject *tmplst = PyList_GetItem (tmpsrc, i); // Read value and underlying regs READ_VAL(tmplst, op->src[i], tmpreg) } } PyObject *tmpdst = getO (dict, "dst"); // Read value and underlying regs READ_VAL(tmpdst, op->dst, tmpreg) // Loading 'var' value if presented r_strbuf_set (&op->esil, getS (dict, "esil")); // TODO: Add opex support here Py_DECREF (dict); } Py_DECREF (result); } else {
PyObject *memory_as_pybuffer(void *ptr, Py_ssize_t buf_len, int readonly) { Py_buffer pybuf; Py_ssize_t shape[] = {buf_len}; int ret; if (readonly) ret = PyBuffer_FillInfo(&pybuf, NULL, ptr, buf_len, 0, PyBUF_SIMPLE); else ret = PyBuffer_FillInfo(&pybuf, NULL, ptr, buf_len, 0, PyBUF_WRITABLE); if (ret!=0) return NULL; pybuf.format = "B"; pybuf.shape = shape; return PyMemoryView_FromBuffer(&pybuf); }
PyObject *PyBuffer_FromMemory(void *buf, Py_ssize_t size){ // buf is not freed by returned object !!!!!!! Py_ssize_t shape0 = size; Py_buffer info={ buf, NULL, // obj added in 3.0b3 size, // len 1, // itemsize TRUE, // readonly 1, // ndim NULL, // format &shape0, // shape NULL, // strides NULL, // suboffsets NULL, // internal }; return PyMemoryView_FromBuffer(&info); }
PyObject* make_mview(const TCPStream::payload_type& payload) { // make a python memoryview corresponding to the vector<uint8_t> payload const uint8_t* buf = &(payload[0]); size_t buf_size = payload.size(); Py_buffer* viewinfo = (Py_buffer*) PyMem_Malloc(sizeof(Py_buffer)); if (viewinfo == 0) { throw std::bad_alloc(); // malloc error } if (PyBuffer_FillInfo(viewinfo, 0, (void*) buf, (Py_ssize_t) buf_size, 1, PyBUF_FULL_RO) != 0) { PyMem_Free((void*) viewinfo); throw std::runtime_error("PyBuffer_FillInfo failed in TCPStreamPyFunctor::make_mview"); } PyObject* mview = PyMemoryView_FromBuffer(viewinfo); // new reference if (mview == 0) { PyMem_Free((void*) viewinfo); throw std::runtime_error("PyMemoryView_FromBuffer failed in TCPStreamPyFunctor::make_mview"); } return mview; }