According to this book I have in front of me (http://www.bell-labs.com/topic/books/aos-book/) Win2K has 32 priority levels and six states (ready, standby (next to be executed), running, waiting, transition, terminated). It has a queue of processes for each priority and works from highest to lowest. Processes waiting for I/O get a temporary priority boost. It also says something about an I/O request packet, which is sent to the driver (I assume it's some sort of struct).
As for Linux, the default scheduler has changed for 2.6. You can compile different schedulers in the kernel config for different situations. There's quite a lot of detail (probably because this information is open) and I'm not going to spend all day reading and typing it!