/* device table */ struct device_table { char *dt_string; /* device name */ int dt_type; /* device "type" */ int dt_bsize; /* block size */ char *dt_desc; /* device description */ int (*dt_init)(); /* device init routine */ int (*dt_open)(); /* device open routine */ int (*dt_strategy)(); /* device strategy routine, returns cnt */ int (*dt_close)(); /* device close routine */ int (*dt_ioctl)(); /* device ioctl routine */ int (*dt_read)(); /* fs read routine, returns count */ int (*dt_write)(); /* fs write routine, return count */ int (*dt_delete)(); /* file delete routine */ int (*dt_undelete)();/* file delete routine */ int (*dt_firstfile)(); /* directory serach routine */ int (*dt_nextfile)(); /* directory serach routine */ int (*dt_format)(); int (*dt_cd)(); int (*dt_rename)(); int (*dt_remove)(); int (*dt_else)(); }; /* device types */ #define DTTYPE_CHAR 0x1 /* character device */ #define DTTYPE_CONS 0x2 /* can be console */ #define DTTYPE_BLOCK 0x4 /* block device */ #define DTTYPE_RAW 0x8 /* raw device that uses fs switch */ #define DTTYPE_FS 0x10 #define MAXDEVICE 10 #define DTEMPTY { NULL, 0, 0, NULL, \ /* default device table entry */ dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, \ dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub, dev_stub } static int dev_num = MAXDEVICE; static device_table dev_t[MAXDEVICE] = { DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY, DTEMPTY }; /* 00003C2C */ int AddDevice(device_table *device) { device_table *cur, *last; cur = dev_t[0]; last = dev_t[dev_num]; while(cur < last) { if(cur->dt_string == NULL) { /* install device */ memcpy(cur, device, sizeof(device)); FlushCache(); /* initialize device */ cur->dt_init(); return 1; } else cur++; } return 0; }