В документации ReadFileEx указано, что
Функция ReadFileEx игнорирует hEvent структуры OVERLAPPED
член. Приложение может свободно использовать этот элемент в своих целях.
в контексте вызова ReadFileEx. ReadFileEx сигнализирует о завершении
его операция чтения путем вызова или постановки в очередь вызова завершения
подпрограмма, на которую указывает lpCompletionRoutine, поэтому она не нуждается в
дескриптор события.
Так что, хотя в нем также говорится, что процедура завершения является необязательной, она, вероятно, необходима. Также обратите внимание на комментарий сообщества внизу страницы, на которую вы ссылались - MS, возможно, исправила эту ошибку, считая NULL lpCompletionRoutine ошибкой. Тем не менее, я не проверял это, чтобы проверить.
Если вы не используете подпрограмму завершения, вы можете использовать обычный ReadFile для перекрывающейся операции.