#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern struct sysent sysent[]; extern int nsysent; struct open_args { const char *path; int flags; mode_t mode; }; int32_t r_open(struct proc *, register struct open_args *, register_t *); int32_t (*k_open)(struct proc *, register struct open_args *, register_t *); int32_t r_open(struct proc *p, register struct open_args *uap, register_t *retval) { int error; size_t dummy = 0; char savedpath[MAXPATHLEN]; error = copyinstr((void *)uap->path, (void *)savedpath, MAXPATHLEN, &dummy); if (!error) printf("open(%s, %x, %x)\n", savedpath, uap->flags, uap->mode); else printf("open(?, %x, %x)\n", uap->flags, uap->mode); return k_open(p, uap, retval); } kern_return_t SyscallExt_start (kmod_info_t * ki, void * d) { k_open = sysent[SYS_open].sy_call; sysent[SYS_open].sy_call = r_open; printf("open() rerouted.\n"); return KERN_SUCCESS; } kern_return_t SyscallExt_stop (kmod_info_t * ki, void * d) { sysent[SYS_open].sy_call = k_open; printf("open() restored.\n"); return KERN_SUCCESS; }