struct deref_fetch_param {
        struct fetch_param      orig;
        long                    offset;
+       fetch_func_t            fetch;
+       fetch_func_t            fetch_size;
 };
 
 #define DEFINE_FETCH_deref(type)                                       \
        call_fetch(&dprm->orig, regs, &addr);                           \
        if (addr) {                                                     \
                addr += dprm->offset;                                   \
-               fetch_memory_##type(regs, (void *)addr, dest);          \
+               dprm->fetch(regs, (void *)addr, dest);                  \
        } else                                                          \
                *(type *)dest = 0;                                      \
 }
 DEFINE_BASIC_FETCH_FUNCS(deref)
 DEFINE_FETCH_deref(string)
-DEFINE_FETCH_deref(string_size)
+
+__kprobes void FETCH_FUNC_NAME(deref, string_size)(struct pt_regs *regs,
+                                                  void *data, void *dest)
+{
+       struct deref_fetch_param *dprm = data;
+       unsigned long addr;
+
+       call_fetch(&dprm->orig, regs, &addr);
+       if (addr && dprm->fetch_size) {
+               addr += dprm->offset;
+               dprm->fetch_size(regs, (void *)addr, dest);
+       } else
+               *(string_size *)dest = 0;
+}
 
 static __kprobes void update_deref_fetch_param(struct deref_fetch_param *data)
 {
                                return -ENOMEM;
 
                        dprm->offset = offset;
+                       dprm->fetch = t->fetch[FETCH_MTD_memory];
+                       dprm->fetch_size = get_fetch_size_function(t,
+                                                       dprm->fetch, ftbl);
                        ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
                                                        is_kprobe);
                        if (ret)