--- VirtualBox-1.5.0_OSE/src/VBox/Additions/linux/module/vboxmod.c.misc_register 2007-08-30 17:16:27.000000000 +0200 +++ VirtualBox-1.5.0_OSE/src/VBox/Additions/linux/module/vboxmod.c 2007-09-28 23:52:01.000000000 +0200 @@ -17,6 +17,7 @@ #include "the-linux-kernel.h" #include "version-generated.h" +#include <linux/miscdevice.h> /* #define IRQ_DEBUG */ @@ -411,6 +412,13 @@ static struct file_operations vbox_fops .llseek = no_llseek }; +static struct miscdevice vbox_dev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "vboxadd", + .fops = &vbox_fops, +}; + #ifndef IRQ_RETVAL /* interrupt handlers in 2.4 kernels don't return anything */ # define irqreturn_t void @@ -685,8 +693,13 @@ static __init int init(void) } /* register a character device */ - err = register_chrdev(vbox_major, "vboxadd", &vbox_fops); - if (err < 0 || ((vbox_major & err) || (!vbox_major && !err))) + + if (vbox_major > 0) { + err = register_chrdev(vbox_major, "vboxadd", &vbox_fops); + } else { + err = misc_register(&vbox_dev); + } + if (err < 0 || ((vbox_major & err))) { printk(KERN_ERR "vboxadd: register_chrdev failed: vbox_major: %d, err = %d\n", vbox_major, err); @@ -829,7 +842,11 @@ static __init int init(void) fail: PCI_DEV_PUT(pcidev); free_resources(); - unregister_chrdev(vbox_major, "vboxadd"); + if (vbox_major > 0) { + unregister_chrdev(vbox_major, "vboxadd"); + } else { + misc_deregister(&vbox_dev); + } return err; } @@ -841,7 +858,11 @@ static __exit void fini(void) { printk(KERN_DEBUG "vboxadd: unloading...\n"); - unregister_chrdev(vbox_major, "vboxadd"); + if (vbox_major > 0) { + unregister_chrdev(vbox_major, "vboxadd"); + } else { + misc_deregister(&vbox_dev); + } free_resources(); vboxadd_cmc_fini (); printk(KERN_DEBUG "vboxadd: unloaded\n");