In the original CW bug (unfortunately private) there seem to be two contradictory claims about whether CancelIoEx() should wait or not. Should it? [Also, nobody seems to have ever checked CancelSynchronousIo()?]
`CancelIoEx()` should wait, the tests in 6/8 should cover that. Those don't check `CancelSynchronousIo()`, although I had the impression that there was something in the preexisting tests implying that it does not wait? I'll have another look.
This is probably easiest to test with ntoskrnl, using asyncs that can't actually be canceled, which means that CancelIo() should wait for them to _actually_ complete.
Ah, good idea. I'll look into this as well.
Generally :thumbsup: on the rest. Thanks for the review!