Winapi ReadFile返回true时的GetOverlappedResult

Winapi ReadFile返回true时的GetOverlappedResult,winapi,Winapi,如果具有重叠IO的ReadFile返回true,即结果从未挂起,我是否可以使用GetOverlappedResult返回读取的字节数?是。在这种情况下,可以调用GetOverlappedResult 在您的具体案例中,如果ReadFile返回true,则表示io操作已经完成。GetOverlappedResult从self-side开始首先检查。更具体的检查状态为挂起的内部NTSTATUS状态 I/O请求的状态代码。当发出请求时 系统将此成员设置为状态_PENDING,以指示 操作尚未开始。当请

如果具有重叠IO的ReadFile返回true,即结果从未挂起,我是否可以使用GetOverlappedResult返回读取的字节数?

是。在这种情况下,可以调用GetOverlappedResult

在您的具体案例中,如果ReadFile返回true,则表示io操作已经完成。GetOverlappedResult从self-side开始首先检查。更具体的检查状态为挂起的内部NTSTATUS状态

I/O请求的状态代码。当发出请求时 系统将此成员设置为状态_PENDING,以指示 操作尚未开始。当请求完成时 系统将此成员设置为已完成请求的状态代码

如果此处未显示状态\u挂起状态!=状态\挂起GetOverlappedResult了解io已完成。如果it error status status<0,则将其转换为win32 error并设置为last error,否则读取为I/O请求传输的字节数。如果请求完成且没有错误,系统将设置此成员。并将其复制到*LPNumberOfByTestTransferred


所以在你的情况下-状态!=状态_PENDING和状态>=0,因为ReadFile返回true-GetOverlappedResult只返回true,并设置*LPNumberOfByTestTransferred=DWORDlpOverlapped->InternalHigh

如果操作同步完成,则无法使用GetOverlappedResult查询结果或读取的字节

另一方面,如果操作立即完成,则传递到ReadFile的&NumberOfBytesRead对于读取的字节数有效。在这种情况下,忽略传递到ReadFile的重叠结构;不要将它与GetOverlappedResult或WaitForSingleObject一起使用


有关详细信息,请参阅。

C!=C++。标签只使用你正在使用的语言,除非两者都是实际相关的。我在C++中使用Win32 API,但是Win32也可以在C中使用,所以C和C++是合适的。@ HANSPASANT -你错误-调用GETPopReaDebug结果绝对有效和正确。并返回正确的数据。如果因为ReadFile return true-操作已完成,重叠和函数返回信息中没有挂起的状态,则它必须工作,因为重叠IO的状态:lpNumberOfBytesRead参数应设置为NULL。使用GetOverlappedResult函数获取实际字节数read@500-InternalServerError:您是否建议在7个不同的windows版本、72个不同的service pack级别、数千种不同的安全更新组合上进行尝试,但在以后的更新中,它仍然会失败,因为你没有遵循文档?试试看,使用API不是一种可以接受的方法。@zett42-你指的是什么具体信息?但我在这里写的东西已经足够广为人知了simply@zett42-我不知道有任何正式文件对此进行了描述。我写的是基于我对windows中的i/o请求、IRP*处理和完成、nt api以及win32 api如何调用nt的了解。还可以查找几乎等于此例程的实际src代码的代码。所有i/o nt api都使用IO_状态_块指针。在IRP中还存在指向用户iosb的指针,当io IRP或快速io完成时,io管理器将最终操作状态写回iosb。重叠的是贝壳iosb@zett42-不难理解GetOverlappedResult必须如何工作-如果只是简单地检查IO_STATUS_BLOCK.STATUS以了解状态_PENDING-IO是否完成?如果这里有任何其他值-只需读取信息字节数,将状态转换为win32错误并返回。如果io尚未完成且未wit-将“最后一个错误”设置为“错误io未完成”,然后退出。如果用户想要等待-等待来自重叠的事件,如果它不是内核中的0 io管理器,则在io完成时设置此事件。如果文件对象上没有直接的事件,但这是不好的,并且在同时有多个io的情况下会给出错误的结果。@doron如果使用事件完成,每个io都必须有唯一的事件。GetOverlappedResult完全为hEvent使用的io设计。不适用于apc或iocp@doron-不,这里不会有任何损坏。这是最基本的。ReadFile调用NtReadFile,OVERLAPPED是IO_STATUS_块的占位符,对于任何IO操作都是必需的。系统将最终状态写入iosb。如果api返回TRUE,则if always可以检查此状态,这是绝对错误的。你是怎么决定的?无论同步还是不完全操作,都是绝对的。我们总是可以使用GetOverlappedResultignore将重叠结构传递到ReadFile中;不要将它与GetOverlappedResult或WaitForSingleObject一起使用。这并不意味着我们不能使用它。这意味着对于这个代码片段来说这是毫无意义的——我们已经有了NumberOfBytesRead。但是,如果在适当的位置传递0 NumberOfBytesRead,则需要使用GetOverlappedResult获取它或直接读取InternalHigh。还有你是怎么想的-从哪里读取文件并返回给你NumberOfBytesRead?当然,从重叠-根本没有其他方式。我们可以随时检查
iosbcall GetOverlappedResult用于任何io@RbMn. 文章很清楚,如果我们同步返回而不调用GetOverlapped结果,就不能保证返回的结果是正确的。我更清楚地知道:我在这方面的知识已经足够了。或者你错误的理解这里写的是什么或者这里写的是错误的。当然,在这种情况下,我们也可以调用GetOverlappedResult,这将是绝对正确的尝试回答您自己的简单问题-从何处读取文件获取lpNumberOfBytesRead?