

static int rice_func(void)
{
return 0;
}
EXPORT_SYMBOL(rice_func);
extern int rice_func(void);
#include "rice_export.h"
#define CLASS_NAME "rice_export"
#define DEVICE_NAME "rice_export"
typedef struct {
int major_number;
struct device *device;
struct class *class;
} Rice_Driver;
Rice_Driver rice_drv;
static int rice_drv_export(char *name) {
printk(KERN_ALERT "Rice Export: %s\n", name);
return 0;
}
EXPORT_SYMBOL(rice_drv_export);
static int __init rice_export_init(void) {
rice_drv.major_number = register_chrdev(0, DEVICE_NAME, NULL);
if (rice_drv.major_number < 0) {
printk(KERN_ALERT "Register fail!!\n");
return rice_drv.major_number;
}
printk(KERN_ALERT "Registe success, major number is %d\n", rice_drv.major_number);
rice_drv.class = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(rice_drv.class)) {
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
return PTR_ERR(rice_drv.class);
}
rice_drv.device = device_create(rice_drv.class, NULL, MKDEV(rice_drv.major_number, 0), NULL, DEVICE_NAME);
if (IS_ERR(rice_drv.device)) {
class_destroy(rice_drv.class);
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
return PTR_ERR(rice_drv.device);
}
printk(KERN_ALERT "rice export ko init!!\n");
return 0;
}
static void __exit rice_export_exit(void) {
device_destroy(rice_drv.class, MKDEV(rice_drv.major_number, 0));
class_unregister(rice_drv.class);
class_destroy(rice_drv.class);
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
printk(KERN_ALERT "rice export ko exit!!\n");
}
module_init(rice_export_init);
module_exit(rice_export_exit);
MODULE_AUTHOR("RieChen");
MODULE_LICENSE("GPL");
#include "rice_import.h"
#define CLASS_NAME "rice_import"
#define DEVICE_NAME "rice_import"
typedef struct {
int major_number;
struct device *device;
struct class *class;
} Rice_Driver;
Rice_Driver rice_drv;
extern int rice_drv_export(char *name);
static int __init rice_import_init(void) {
rice_drv.major_number = register_chrdev(0, DEVICE_NAME, NULL);
if (rice_drv.major_number < 0) {
printk(KERN_ALERT "Register fail!!\n");
return rice_drv.major_number;
}
printk(KERN_ALERT "Registe success, major number is %d\n", rice_drv.major_number);
rice_drv.class = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(rice_drv.class)) {
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
return PTR_ERR(rice_drv.class);
}
rice_drv.device = device_create(rice_drv.class, NULL, MKDEV(rice_drv.major_number, 0), NULL, DEVICE_NAME);
if (IS_ERR(rice_drv.device)) {
class_destroy(rice_drv.class);
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
return PTR_ERR(rice_drv.device);
}
printk(KERN_ALERT "rice import ko init!!\n");
rice_drv_export("RiceChen");
return 0;
}
static void __exit rice_import_exit(void) {
device_destroy(rice_drv.class, MKDEV(rice_drv.major_number, 0));
class_unregister(rice_drv.class);
class_destroy(rice_drv.class);
unregister_chrdev(rice_drv.major_number, DEVICE_NAME);
printk(KERN_ALERT "rice import ko exit!!\n");
}
module_init(rice_import_init);
module_exit(rice_import_exit);
MODULE_AUTHOR("RieChen");
MODULE_LICENSE("GPL");
