#define GUP_FLAGS_WRITE 0x1
-#define GUP_FLAGS_WRITE 0x1
#define GUP_FLAGS_FORCE 0x2
#define GUP_FLAGS_IGNORE_VMA_PERMISSIONS 0x4
#define GUP_FLAGS_IGNORE_SIGKILL 0x8
DECLARE_MOD_CB_DEP(kallsyms_search, unsigned long, const char *name);
-
DECLARE_MOD_FUNC_DEP(access_process_vm, int, struct task_struct * tsk, unsigned long addr, void *buf, int len, int write);
+#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32)
+DECLARE_MOD_FUNC_DEP(copy_to_user_page, void, struct vm_area_struct *vma, struct page *page, unsigned long uaddr, void *dst, const void *src, unsigned long len);
+#endif
DECLARE_MOD_FUNC_DEP(find_extend_vma, struct vm_area_struct *, struct mm_struct * mm, unsigned long addr);
unsigned long uaddr, void *kaddr, unsigned long len, int write)
IMP_MOD_DEP_WRAPPER (flush_ptrace_access, vma, page, uaddr, kaddr, len, write)
+#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32)
+ DECLARE_MOD_DEP_WRAPPER(copy_to_user_page, void, struct vm_area_struct *vma, struct page *page, unsigned long uaddr, void *dst, const void *src, unsigned long len)
+IMP_MOD_DEP_WRAPPER (copy_to_user_page, vma, page, uaddr, dst, src, len)
+#endif
+
+
int init_module_dependencies()
{
INIT_MOD_DEP_VAR(put_task_struct, __put_task_struct_cb);
#endif
+
+#if (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32))
+ INIT_MOD_DEP_VAR(copy_to_user_page, copy_to_user_page);
+#endif
+
return 0;
}
#endif
}
+
int access_process_vm_atomic(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
{
struct mm_struct *mm;
struct vm_area_struct *vma;
void *old_buf = buf;
+ unsigned long addr1 = addr;
+ unsigned int* inst_buf = (unsigned int*)old_buf;
+
mm = get_task_mm(tsk);
if (!mm)
return 0;
- //down_read(&mm->mmap_sem);
+ down_read(&mm->mmap_sem);
/* ignore errors, just check how much was successfully transferred */
while (len) {
int bytes, ret, offset;
ret = get_user_pages_uprobe(tsk, mm, addr, 1,
write, 1, &page, &vma);
+
if (ret <= 0) {
/*
* Check if this is a VM_IO | VM_PFNMAP VMA, which
buf += bytes;
addr += bytes;
}
- //up_read(&mm->mmap_sem);
+ up_read(&mm->mmap_sem);
mmput(mm);
return buf - old_buf;