//------------------------------------------------------------------- // maccall.c // // This is one possible solution for Final Exam Question 6. // // programmer: ALLAN CRUSE // date begun: 15 MAY 2005 //------------------------------------------------------------------- #include // for init_module() #include // for pci_find_device() #include // for copy_to_user() #include // for __NR_break #define VENDOR_ID 0x10EC #define DEVICE_ID 0x8139 char modname[] = "maccall"; extern unsigned long *sys_call_table; unsigned long original_entry; unsigned char mac[6]; asmlinkage long my_syscall( unsigned char __user * buf ) { struct pci_dev *devp = NULL; int i, iobase; devp = pci_find_device( VENDOR_ID, DEVICE_ID, devp ); if ( !devp ) return -ENODEV; iobase = pci_resource_start( devp, 0 ); for (i = 0; i < 6; i++) mac[i] = inb( iobase + i ); if ( copy_to_user( buf, mac, 6 ) ) return -EFAULT; return 0; } int init_module( void ) { printk( "<1>\nInstalling \'%s\' module\n", modname ); original_entry = sys_call_table[ __NR_break ]; sys_call_table[ __NR_break ] = my_syscall; return 0; // SUCCESS } void cleanup_module( void ) { sys_call_table[ __NR_break ] = original_entry; printk( "<1>Removing \'%s\' module\n", modname ); } MODULE_LICENSE("GPL");