windows – 谁在CreateFile上强制执行dwShareMode?操作系统或驱
我有一个与某些硬件交互的
Windows应用程序.使用CreateFile打开硬件句柄,我们使用DeviceIoControl控制硬件.
我正在尝试更新使用此硬件以独占模式打开硬件的应用程序,以便其他程序无法同时访问硬件(硬件具有我无法更改的可变状态在我之下).我通过将0作为dwShareMode参数传递给CreateFile来实现此目的.进行此更改后,我仍然可以运行我的应用程序的两个单独的实例.两个进程中对CreateFile的两次调用都是成功的.都不会返回INVALID_HANDLE_VALUE. 我相信其中一件事正在发生,我正在寻求帮助以缩小问题范围. >我严重误解了dwShareMode参数 编辑选项2是无稽之谈. dwShareMode应该阻止第二个CreateFile发生,DeviceIoControl与它无关.它必须是选项#1或选项#3 问题: 设备驱动程序是否负责查看dwShareMode参数,如果某人已经打开了没有共享的句柄,或者操作系统是否负责,则拒绝请求? 如果设备驱动程序负责,那么我将假设#3正在发生.如果操作系统负责,那么它必须是#1. 一些额外的线索: 解决方法
我相信只在某些设备上强制执行共享规则.在许多(大多数?)情况下,强制执行设备对象本身的共享规则(而不是设备命名空间中的对象)是没有意义的.
因此,设备驱动程序必须负责在需要它们的极少数情况下强制执行这些规则. (或者设备驱动程序设置一个标志来指示操作系统这样做,但似乎没有这种标志.) 例如,对于卷设备,即使已装入卷,也可以以共享模式0打开设备. [CreateFile的文档说你必须使用FILE_SHARE_WRITE,但这似乎不是真的.] 要获得对卷的独占访问权限,请使用 [这是一个文件系统驱动程序,所以它可能不是典型的情况.但我不认为这在这方面有所作为.] 串行端口和LPT驱动程序将是可能强制执行共享规则的设备的示例.我想可能会有一些适用的示例代码,也许这会对事情有所了解? 编辑添加: 我已经浏览了Windows Research内核源代码(这与Windows Server 2003内核基本相同)并且: 1)打开设备对象的代码(通过向驱动程序发送IRP_MJ_CREATE)似乎没有尝试强制执行共享模式参数,尽管它确实检查访问权限并强制执行驱动程序的 2)我还搜索了代码,以获取包含所请求的dwShareMode的结构成员的引用.据我所知,它是由实现CreateFile的内部函数写入相关结构,后来传递给设备驱动程序,但否则被忽略. 因此,我的结论仍然是相同的:强制执行共享模式规则,或者在适当的情况下提供替代机制,是设备驱动程序的责任. (但是,内核提供了诸如 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 批处理文件 – 如何使用批处理来确定计算机是使用FAT32还是
- vbscript – 在Windows上使用VBS处理MS Word
- .net – 无法在Windows XP下运行Lightswitch 2012 Programm
- windows-server-2012 – 如何在Windows Server 2012中使用W
- windows-server-2008 – 通过HTTP的MSMQ – 为什么我们需要
- windows – 是否可以从另一个进程捕获渲染音频会话?
- windows – 测量SSD在LSI MegaRAID控制器后面磨损了吗?
- .net – Windows窗体的任何地方都有免费的“旋转轮”控件?
- VS10始终链接到SUBSYSTEM:WINDOWS; CMake SDL GLEW
- Windows批处理文件脚本从文件夹中选择随机文件并将其移动到
- .net – 触摸WPF按钮有时不会调用Windows 8下的单
- windows-server-2008-r2 – 适用于Windows 8.1客
- 一个Windows系统下同时安装Python2和Python3
- active-directory – 管理员帐户的错误SID
- windows-7 – 如何使用命令行启用“Internet连接
- Windows Server 2012 R2上的随机BSOD
- windows-server-2012-r2 – 将PDC设置为外部时间
- windows-server-2003 – 列出应用于Windows服务器
- windows与虚拟机的linux共享windows下的一个文件
- 使用可选的调用变量创建一个函数