This driver supports the A/D of the 104-AIO16-16E and the DIO of the 104-DIO-48E. The A/D functionality uses the following IOCTLs: #define IOCTL_SET_BASE 0xC94F240C #define IOCTL_INIT_ACQ 0xC94F2418 #define IOCTL_STOP_ACQ 0xC94F241C #define IOCTL_GET_CONFIG 0xC94F2420 IOCTL_SET_BASE receives a base address, down-shifted four bits. For example, to set the address to 0x350, you'd pass down the byte 0x35. IOCTL_GET_CONFIG returns a byte containing the jumper settings for the 104-AIO16-16E, as read from base+8, as described in the manual on p25. IOCTL_INIT_ACQ receives a seven-byte structure; the first four bytes are two word-sized counter load values, the next byte is the gain code(as written to base+4, as described in the manual on p25), and the last two bytes are first and last channels. It starts hardware- timed acquisition, and the data can be read via ReadFile in a polling loop. IOCTL_STOP_ACQ stops hardware-timed acquisition. It receives nothing and returns nothing. The DIO functionality uses the following IOCTLs: #define IOCTL_SET_DIO_BASE 0xC94F2430 #define IOCTL_DIO_CONFIG 0xC94F243C #define IOCTL_DIO_READ 0xC94F2434 #define IOCTL_DIO_WRITE 0xC94F2438 IOCTL_SET_DIO_BASE receives a base address, similar to IOCTL_SET_BASE. IOCTL_DIO_CONFIG receives two bytes; the first is which PPI(0 or 1) to configure, the second is an 8255 control byte. (The 104-DIO-48E manual describes the building of a control byte on p16.) IOCTL_DIO_READ receives one byte and returns one byte; you give it the index of a byte to read(0-2 for the first PPI, 3-5 for the second PPI), and it returns the byte it read. IOCTL_DIO_WRITE receives two bytes; the first is the index of a byte to write(same as for IOCTL_DIO_READ), and the second is the data to write.