WriteFile函数的lpNumberOfBytesWritten参数

MSDN说,

当写入缓冲区空间不足的非阻塞字节模式pipe道句柄时,WriteFile将返回TRUE,并带* lpNumberOfBytesWritten <nNumberOfBytesToWrite。

对于文件或套接字不是pipe道 ),当我同步调用函数时,可以* lpNumberOfBytesWritten小于nNumberOfBytesToWrite(结果为TRUE)。

如果是这样,相应的驱动程序为什么(以及何时)完成这样的IRP?

当我看到下面的代码,我总是担心“如果* lpNumberOfBytesWritten <BytesToWrite?

BOOL fOk = WriteFile(hFileOrSocket, ...); // Synchronously if (fOk) { // It assumes everything is fine } 

我不需要担心吗?

AFAIK如果打开文件句柄进行同步写入 – 您描述的情况( *lpNumberOfBytesWritten < BytesToWritten )永远不会发生。

部分编写的重点是让您有机会在错误发生之前编写部分数据,如WSAEWOULDBLOCK或类似错误。 异步I / O模型说,尽可能多的写,直到你得到一个适当的错误,然后等到一些I / O完成。

不要与重叠的I / O混淆。 在那里你安排I / O,并且它是异步完成的(由底层驱动程序完成)。

“对于文件或套接字(不是管道),”

对于一个文件,应该很容易想象。

这也很容易实验。 创建一个大小为100 MB的硬盘分区,打​​开一个文件,写入99 MB,然后尝试写入另一个99 MB。 该实验可能不可靠,因为某些版本的Windows可能返回FALSE,但很容易想象其他版本的Windows可能会返回TRUE,并且* lpNumberOfBytesWritten小于nNumberOfBytesToWrite。