我们创build一个文件用作memorymappedfile。
我们用GENERIC_READ | GENERIC_WRITE
打开 GENERIC_READ | GENERIC_WRITE
我们使用共享与FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
我们使用文件属性FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE
我们成功创build文件。 我们可以用同样的标志重复打开。
一旦一个句柄closures,我们不能再打开任何更多的句柄,它返回ERROR_ACCESS_DENIED。 我们可以通过closures任何一个句柄来实现这一点,不pipe是从CreateFile(ALWAYS_CREATE)开始,还是从CreateFile(OPEN_EXISTING)开始。
有什么办法可以避免这种情况? 我们使用memoryMappedFile作为必须共享资源的不同进程之间的通信。 这些过程有时会启动和停止。 现在一旦我们closures了一个句柄,我们就无法打开memorymapped文件。
我试图改变打开的调用来使用FILE_ATTRIBUTE_NORMAL,所以只有创build调用使用CLOSE_ON_DELETE,但是这种情况没有影响。
您遇到的问题是,一旦用FILE_FLAG_DELETE_ON_CLOSE
打开的文件句柄关闭,操作系统将不再允许创建新的句柄。
血腥的详细信息:在处理IRP_MJ_CLEANUP
(这是关闭句柄时发生的情况)时,Windows文件系统将在文件对象上设置一个内部标志,指示它正在进行中。 随后打开的文件尝试将失败与STATUS_DELETE_PENDING
,Win32子系统将映射到您所看到的Win32的ERROR_ACCESS_DENIED
代码。
对于您的用例,您可能需要考虑使用命名的共享内存(MSDN)模式。 基本上,让操作系统管理共享内存的空间。 只要确保你应用适当的安全属性,你就可以走了。