linuxrw
来源:互联网 发布:网络销售犯罪的特征有 编辑:程序博客网 时间:2024/06/05 00:11
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <signal.h>#include <fcntl.h>#include <ctype.h>#include <termios.h>#include <sys/types.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <string.h>#define AUTHOR "smile"#define MAP_SIZE 4096UL#define MAP_MASK (MAP_SIZE - 1)int main(int argc, char **argv){ int fd; void *map_base, *virt_addr; unsigned int value; unsigned int reg; switch (argc) { case 3: if (strcmp(argv[1], "-r")) { printf("usage:\nlinuxrw -r 0x10000000\nlinuxrw -w 0x10000000 0x20000000\n"); exit(-1); } break; case 4: if (strcmp(argv[1], "-w")) { printf("usage:\nlinuxrw -r 0x10000000\nlinuxrw -w 0x10000000 0x20000000\n"); exit(-1); } break; default : printf("usage:\nlinuxrw -r 0x10000000\nlinuxrw -w 0x10000000 0x20000000\n"); exit (-1); } reg = strtol(argv[2], NULL, 16); if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) <0) { perror("open"); return -1; } map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, reg & ~MAP_MASK); virt_addr = map_base + (reg & MAP_MASK); if (argc == 3) { value = *(unsigned int *) virt_addr; printf("reg :0x%x \nvalue:0x%x \n", reg, value); } else if (argc ==4 ) { value = strtol(argv[3], NULL, 16); *(unsigned int *) virt_addr = value; printf("reg :0x%x \nvalue: 0x%x \n", reg, *(unsigned int*)virt_addr); } munmap(map_base,MAP_SIZE); close(fd); return 0;}
0 0