User::WaitForRequest does not have any problems, it simply waits for something to happen:
- it is not enough if the TRequestStatus is set to anything else than KRequestPending
- the request semaphore of the given thread also has to be triggered.
Practically when you open the menu, you are stealing an event from the Windows Server.
This is the difference between
the latter also triggers the request semaphore.