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

标签 windows driver createfile

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

大多数文档甚至不会提及将其与通信设备一起使用,而那些提及的文档(又名 MSDN 引用资料等)只是简单地提及您可以。

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

最佳答案

这是一个设备驱动程序实现细节,您在 CreateFile() 调用中指定的选项将在 IRP_MJ_REQUEST request 中传递。 。我链接的是文件系统,它是非常奇特的一个。单击 IrpSp->Parameters.Create.Options 链接至 IoCreateFileSpecifyDeviceObjectHint()'s选项参数可查看 FILE_NO_INTERMEDIATE_BUFFERING。

串行端口 IRP_MJ_REQUEST 的文档 is here 。非常简单,根本没有参数:) 一般来说,用于通信端口的设备驱动程序接口(interface)的 winapi 是非常简单的。记录的 winapi 函数与其 underlying IOCTL 之间有(几乎)直接映射。 。 winapi 函数除了基本的错误检查之外没有做太多事情,然后快速将作业传递给驱动程序。

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

否则逻辑结论是,串行端口 I/O 是中断驱动的,驱动程序必须进行缓冲,以便不丢失字节并保持可接受的传输速率。您可以通过 SetupComm() 从技术上修改缓冲区大小。但是,正如记录的那样,这只是一个很有可能驱动程序会忽略非常低的值的建议。

关于windows - FILE_FLAG_NO_BUFFERING 如何与向通信设备打开的句柄交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33326562/

相关文章:

c# - 无法并行读取同一个文件

c - 无法打开 d : drive 中的文件

相当于 "sort -u"的 Windows CLI

c - 我在 DbgView 中看不到日志,但在 DeviceTree 中可以看到过滤器

Java MySQL JDBC 缓慢/轮流

ios - 我可以在 iOS 中以编程方式创建 .xls 文件吗?

c++ - 创建 .dat 文件 (fstream) C++

c++ - 是什么让 C++ 程序只能是 64 位或受机器限制?

windows - Qt - 在 Windows 上为 Linux 交叉编译

java - 如何在 Tomcat 7.0.47 启动时注册 oracle jdbc 驱动程序?