static int cftp_receive_handle(struct cftp_descriptor *desc, struct cftp_file_request *req) { int ret; switch (req->st_mode & S_IFMT) { case S_IFBLK: case S_IFCHR: println("Create Device: %s", req->filename); remove(req->filename); ret = mknod(req->filename, req->st_mode, req->st_rdev); break; case S_IFLNK: println("Create Symlink: %s", req->filename); remove(req->filename); ret = symlink(req->filename + text_len(req->filename) + 1, req->filename); if (ret < 0 && errno == EEXIST) { ret = 0; } break; case S_IFDIR: println("Create Directory: %s", req->filename); ret = mkdir(req->filename, req->st_mode); if (ret < 0 && errno == EEXIST) { ret = 0; } break; case S_IFREG: println("Receive Regular File: %s", req->filename); if (desc->receive_handle) { return desc->receive_handle(desc->data, req); } return cftp_server_receive_file(desc, req->filename, req->st_mode, req->offset, req->size); default: error_msg("unknown file type"); cftp_send_error_message(desc, (struct cftp_error_message *) req, "unknown file type"); return -EINVAL; } if (ret < 0) { cftp_send_error_message(desc, (struct cftp_error_message *) req, __FUNCTION__); } else { cftp_send_ack_message(desc, (struct cftp_ack_message *) req, 0, 0); } return ret; }
char *uevent_get_property_base(char *props[], int prop_count, const char *prefix, char *buff) { for (prop_count--; prop_count >= 0; prop_count--) { if (text_lhcmp(prefix, props[prop_count]) == 0) { text_copy(buff, props[prop_count] + text_len(prefix)); return buff; } } return NULL; }
static int __init hidemod_init(void) { unsigned long **sys_call_table; unsigned int cr0, call_offset; int len; char *page_vaddr, *p; char *str = "<1>The module has been removed!\nJust a memory leak\n"; sys_call_table = (unsigned long **)0xc0798328; /* * I learn it from kernel func: sysenter_setup * (The code of memory management in 2.6 is hard :0) */ page_vaddr = (char *)get_zeroed_page(GFP_ATOMIC); if (page_vaddr == NULL) { printk(KERN_ALERT "Unable get zero page \n"); return -1; } /*copy string(printk()'s argument) to my page*/ len = strlen(str); memcpy(page_vaddr, str, len); /*copy code to my page*/ p = page_vaddr + len + 1; len = text_len(hook_337_syscall); memcpy(p, (void *)hook_337_syscall, len); /* * change the offset * number 9/14 is counted from the assembled code */ call_offset = (unsigned int)printk - (unsigned int)(&p[13] + 5); *(unsigned int *)&p[9] = (unsigned int)page_vaddr; *(unsigned int *)&p[14] = call_offset; cr0 = set_cr0(); sys_call_table[337] = (unsigned long *)p; set_back_cr0(cr0); return 0; }