As far as I know, Sleep, since they introduced SleepEx, it's just a thin, convenient wrapper around SleepEx, and when they rewrote it as a wrapper, they decided to just pass the timeout parameter to SleepEx without processing it anyway. Obviously, in this way the behavior of a function with INFINITE as a timeout also extends to "Sleep" (and therefore should be documented), although without the bAlertable parameter SleepEx it is absolutely useless (Sleep (timeout) is SleepEx (timeout, FALSE), so you there will be endless involuntary waiting).
In Windows CE, perhaps they decided to change this behavior because it was actually stupid, so I believe that Sleep (INFINITE) on CE automatically translates into SuspendThread; however, on Windows, they are probably forced to adhere to βsimpleβ behavior for compatibility reasons.
source share