FILE_FLAG_NO_BUFFERING 如何与向通信设备打开的句柄交互?

How does FILE_FLAG_NO_BUFFERING interact with handles opened to communication devices?

正如标题所说,我正在编写一个网络程序,我在其中使用 CreateFile 打开网络 driver 的句柄,并且我一直在试验 NO_BUFFERING 标志。

大多数文档甚至都不会提到它与通信设备一起使用,而那些这样做的(又名 MSDN 参考等),只是简单地提到你可以。

有谁知道这会如何影响与设备的通信?

这是一个设备驱动程序实现细节,您在 CreateFile() 调用中指定的选项在 IRP_MJ_REQUEST request. The one I linked is the one for file systems, it is very fancy one. Click through the IrpSp->Parameters.Create.Options link to IoCreateFileSpecifyDeviceObjectHint()'s 选项参数中传递以查看 FILE_NO_INTERMEDIATE_BUFFERING。

串行端口 is here. Very simple one, no arguments at all :) In general, the winapi to device driver interface for communication ports is a very straight-forward. There's an (almost) direct mapping between the documented winapi function and its underlying IOCTL 的 IRP_MJ_REQUEST 文档。 winapi 函数除了基本的错误检查之外没有做太多,然后快速将工作传递给驱动程序。

所以没有任何方法可以传递您指定的 FILE_FLAG_NO_BUFFERING 选项,所以它根本就不会被使用。

否则合乎逻辑的结论是,串行端口I/O 是中断驱动的,驱动程序 必须 缓冲以便不丢失字节并保持可接受的传输速率。您可以通过 SetupComm() 在技术上修改缓冲区大小,但是,如文档所述,这只是一个非常高的建议,驱动程序只是忽略非常低的值。