First, to continue the current thread: I guess that the hang was actually in ibwait() rather than in ibrda(). But indeed yes the I/O does not get stopped, and the pseudo-application (a small one for development and debugging) misbehaved a bit too much to guess a single point of hanging.
Now you add that if ibstop() is called from a different thread than the call to ibrda() then ibstop() will hang in 2.0 and 1.7. In some cases I call ibstop() from the callback routine, which is indeed a different thread from the thread that called ibrda(). I think this mandates an upgrade to 2.1, and hope that we can make a sufficiently strong recommendation to all of the parties involved in this.
Regarding the documentation for ibtmo() which you showed me, I still wish it would be added to other discussions of reads and writes in 321038g (NI-488.2 Function Reference Manual for Windows) and 321819e (NI-488.2 User Manual for Windows). Also if the documentation of ibrda() and ibwrta() would have a one-sentence addition (e.g. "the I/O operation started by this function is not subject to timeouts") it would be a kindness.
Second, a disaster: Today we demonstrated some developments to a customer. The customer is running Windows 2000. The customer had been running 1.7 but we upgraded to 2.0. In a situation where I had called ibrda() and then ibwait() with TIMO, and the timeout occured, it seems that my code was too quick in calling ibstop() and another ibrda(). The result was a BLUE SCREEN. This was repeatable. When doing the same operations in ibic, my typing was slow enough so it performed properly. The blue screen didn't name a suspected driver, but surely even if an application is defective it can't accomplish this without help from a defective driver. I think we have some pretty strong evidence to recommend an upgrade to driver 2.1.
Back in our own office with Windows 98, no blue screen in this situation. I'm wondering if my code should Sleep(100) between the return from ibwait() and the call to ibstop(). (Of course when there's no error flag then I don't call ibstop() and the next call to ibrda() seems OK.)