任何句柄closures后,CreateFile FILE_FLAG_DELETE_ON_CLOSE失败

我们创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)模式。 基本上,让操作系统管理共享内存的空间。 只要确保你应用适当的安全属性,你就可以走了。