static int __read(RIO *io, RIODesc *fd, ut8 *buf, int len) { vm_size_t size = 0; int err = vm_read_overwrite (RIOMACH_TASK (fd->data), (vm_offset_t)io->off, len, (pointer_t)buf, &size); if (err == -1) { eprintf ("Cannot read\n"); return -1; } return (int)size; }
static int __read(RIO *io, RIODesc *fd, ut8 *buf, int len) { vm_size_t size = 0; int blen, err, copied = 0; int blocksize = 32; RIOMach *riom = (RIOMach *)fd->data; if (task_is_dead (riom->pid)) { return -1; } memset (buf, 0xff, len); if (RIOMACH_PID (fd->data) == 0) { if (io->off < 4096) { return len; } } copied = getNextValid (io, fd, io->off) - io->off; if (copied < 0) copied = 0; while (copied < len) { blen = R_MIN ((len - copied), blocksize); //blen = len; err = vm_read_overwrite (RIOMACH_TASK (fd->data), (ut64)io->off + copied, blen, (pointer_t)buf + copied, &size); switch (err) { case KERN_PROTECTION_FAILURE: //eprintf ("r_io_mach_read: kern protection failure.\n"); break; case KERN_INVALID_ADDRESS: if (blocksize == 1) { memset (buf+copied, 0xff, len-copied); return size+copied; } blocksize = 1; blen = 1; buf[copied] = 0xff; break; } if (err == -1 || size < 1) { return -1; } if (size == 0) { if (blocksize == 1) { memset (buf+copied, 0xff, len-copied); return len; } blocksize = 1; blen = 1; buf[copied] = 0xff; } copied += blen; } return len; }
static int __read(RIO *io, RIODesc *fd, ut8 *buf, int len) { vm_size_t size = 0; int blen, err, copied = 0; int blocksize = 32; if (RIOMACH_PID (fd->data) == 0) { if (io->off<4096) return len; } memset (buf, 0xff, len); while (copied<len) { blen = R_MIN ((len-copied), blocksize); //blen = len; err = vm_read_overwrite (RIOMACH_TASK (fd->data), (ut64)io->off+copied, blen, (pointer_t)buf+copied, &size); switch (err) { case KERN_PROTECTION_FAILURE: //eprintf ("r_io_mach_read: kern protection failure.\n"); break; case KERN_INVALID_ADDRESS: if (blocksize == 1) { memset (buf+copied, 0xff, len-copied); return size+copied; } blocksize = 1; blen = 1; buf[copied] = 0xff; //eprintf("invaddr %d\n",len); break; } if (err == -1) { //eprintf ("Cannot read\n"); return -1; } if (size==0) { if (blocksize == 1) { memset (buf+copied, 0xff, len-copied); return len; //size+copied; } blocksize = 1; blen = 1; buf[copied] = 0xff; } //if (size != blen) { return size+copied; } copied += blen; } return len; //(int)size; }