【发布时间】:2015-10-25 15:17:04
【问题描述】:
正如标题所说,我正在编写一个网络程序,在其中我使用 CreateFile 打开网络驱动程序的句柄,并且我一直在尝试使用 NO_BUFFERING 标志。
大多数文档甚至都不会提及将其与通信设备一起使用,而那些这样做的文档(AKA MSDN 参考等)只是提及您可以。
有人知道这会如何影响与设备的通信吗?
【问题讨论】:
标签: windows driver createfile
正如标题所说,我正在编写一个网络程序,在其中我使用 CreateFile 打开网络驱动程序的句柄,并且我一直在尝试使用 NO_BUFFERING 标志。
大多数文档甚至都不会提及将其与通信设备一起使用,而那些这样做的文档(AKA MSDN 参考等)只是提及您可以。
有人知道这会如何影响与设备的通信吗?
【问题讨论】:
标签: windows driver createfile
这是一个设备驱动程序实现细节,您在 CreateFile() 调用中指定的选项在 IRP_MJ_REQUEST request 中传递。我链接的那个是用于文件系统的,它非常花哨。单击 IrpSp->Parameters.Create.Options 链接到 IoCreateFileSpecifyDeviceObjectHint()'s Options 参数以查看 FILE_NO_INTERMEDIATE_BUFFERING。
串行端口is here 的 IRP_MJ_REQUEST 的文档。非常简单,完全没有参数 :) 一般来说,用于通信端口的 winapi 到设备驱动程序接口是一个非常直截了当的方法。记录在案的 winapi 函数与其underlying IOCTL 之间存在(几乎)直接映射。 winapi 函数除了基本的错误检查之外并没有做太多的事情,然后迅速将工作传递给驱动程序。
因此没有任何方法可以传递您指定的 FILE_FLAG_NO_BUFFERING 选项,因此它根本不会被使用。
否则逻辑结论,串行端口 I/O 是中断驱动的,驱动程序必须缓冲以不丢失字节并保持可接受的传输速率。您可以通过SetupComm() 在技术上修改缓冲区大小,但正如文档所述,这只是一个建议,驱动程序忽略非常低的值的可能性很高。
【讨论】: