1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/slab.h> /* kmalloc() */
#include <asm/semaphore.h>
#include <linux/mm.h>
#include <linux/wrapper.h>
#include <linux/errno.h>
#include <asm/page.h>
#include <linux/config.h>
#define MODULE_VERSION "1.0"
#define MODULE_NAME "spying"
#define FOOBAR_LEN 256
static struct proc_dir_entry *virtual_file;
struct Memoire
{
char message[256][256];
};
struct Memoire pointeurDebut;
int messageRendu=0;
int start = 0;
int end=0;
int nbMessage=0;
static int proc_read_foobar(char *page, char **start,off_t off, int count,int *eof, void *data)
{
int len=0;
struct Memoire * bufferMemoire=(struct Memoire *)data;
MOD_INC_USE_COUNT;
int nbMessageEcrit = 0;
if( nbMessage > 255 )
{
messageRendu = nbMessage%256;
end = messageRendu-1;
}
else
{
messageRendu = 0;
}
printk("Message rendu avant print : %i",messageRendu);
printk("Message Count avant print : %i",count);
while(nbMessageEcrit< 256)
{
if( messageRendu > 255 )
{
messageRendu =0;
}
if( bufferMemoire->message[messageRendu][0] != '\0' )
{
len= sprintf(page,"\nMessage #%i : %s",messageRendu,bufferMemoire->message);
printk("Longeur : %i",len);
printk("\nMessage #%i : %s",messageRendu,bufferMemoire->message[messageRendu]);
int j=0;
while(j<256)
{
bufferMemoire->message[messageRendu][j] = '\0';
j++;
}
}
else
{
//break;
}
messageRendu++;
nbMessageEcrit++;
}
printk("Message Longeur : %i",len);
messageRendu=0;
nbMessage=0;
MOD_DEC_USE_COUNT;
return len;
}
static int proc_write_foobar(struct file *file,const char *buffer,unsigned long count,void *data)
{
struct Memoire * messageData=(struct Memoire *)data;
//struct fb_data_t *fb_data = (struct fb_data_t *)data;
MOD_INC_USE_COUNT;
unsigned long longeurMessage = count;
if( longeurMessage > 255 )
{
printk("<1>\nLe message a ete tronque au 256 caractere");
longeurMessage = 255;
}
if( nbMessage > 255 )
{
messageRendu = nbMessage%256;
}
printk("Message ecrit : %s \n",buffer);
printk("Message count : %i \n",count);
printk("Message nbMessage : %i \n",nbMessage);
printk("Message messageRendu : %i \n",messageRendu);
//printk("Adresse : %i \n",messageData->message[messageRendu]);
if(copy_from_user(&messageData->message[messageRendu], buffer, longeurMessage))
{
MOD_DEC_USE_COUNT;
return -EFAULT;
}
messageData->message[messageRendu][longeurMessage] = '\0';
end++;
messageRendu++;
nbMessage++;
MOD_DEC_USE_COUNT;
return longeurMessage;
}
static int __init init_procfs_example(void)
{
int rv = 0;
//
// virutal
//
virtual_file = create_proc_entry(MODULE_NAME, 0644, NULL);
printk("<1>vitual creer\n");
if(virtual_file == NULL)
{
return -ENOMEM;
}
virtual_file->data = &pointeurDebut;
virtual_file->read_proc = proc_read_foobar;
virtual_file->write_proc = proc_write_foobar;
virtual_file->owner = THIS_MODULE;
/* everything OK */
printk(KERN_INFO "%s %s initialised\n", MODULE_NAME, MODULE_VERSION);
messageRendu=0;
nbMessage=0;
return 0;
static void __exit cleanup_procfs_example(void)
{
remove_proc_entry(MODULE_NAME, NULL);
//remove_proc_entry(MODULE_NAME, NULL);
printk(KERN_INFO "%s %s removed\n", MODULE_NAME, MODULE_VERSION);
}
module_init(init_procfs_example);
module_exit(cleanup_procfs_example);
EXPORT_NO_SYMBOLS; |
Partager