It was complicated before. Here's how it works now:
Each AFD_FCB has a read and write buffer which currently holds up to one packet. For better performance, we can make this buffering scheme better. For the sake of simplicity, it's the way it is now.
Each socket can have at most one send irp active at a time. Others either wait or do nothing depending on whether they're for stream or packet sockets. This too can be improved but again does no real harm.
Each socket has at most one receive irp active at a time (or listen irp for a listen socket). The TDI provider completes the irp when some data arrives, and we relaunch it when our buffer is empty.
Select is accomplished by calls to PollReeval in ReceiveComplete, SendComplete, Afd*ReadData and Afd*WriteData. Each time PollReeval is called, a select irp could get completed.
Apart from that the rest is bookkeeping.