【发布时间】:2018-05-21 06:34:59
【问题描述】:
我有一个要删除的文件,它的句柄由系统进程持有,所以每次我尝试删除它时它都会给出Access denied 但由于某种原因 cygwin 能够删除它。
我已经下载了coreutils并研究了rm可执行文件的源代码,发现它使用unlink函数来实现它。我创建了一个使用相同功能的小测试程序,但它还是给了我Access denied。
然后我发现了这个article,他描述了 cygwin 如何能够删除以下文件:
Cygwin 总是使用所有共享标志打开文件 设置,因此由 Cygwin 进程打开的文件不应导致共享 在另一个公开电话中违反。例外是第一个 NtOpenFile 在 unlink_nt 中,它使用 FILE_SHARE_DELETE 打开文件只是为了找到 如果文件在其他地方有一个打开的句柄。在这种情况下,它得到 一个 STATUS_SHARING_VIOLATION,下一个 NtOpenFile 将打开文件 设置所有共享标志,并且 unlink_nt 将尝试删除文件或 重命名它,或将其移动到回收站,具体取决于其路径。
这是有道理的,所以我开始实施同样的事情。这是我的代码:
HANDLE file;
PIO_STATUS_BLOCK stat;
UNICODE_STRING myUnicodeStr;
RtlInitUnicodeString(&myUnicodeStr, L"C:\\Program Files (x86)\\TSU\\bin\\TSU.sys");
POBJECT_ATTRIBUTES attr;
InitializeObjectAttributes (attr, &myUnicodeStr, OBJ_OPENIF, NULL, NULL);
NtOpenFile(&file, MAXIMUM_ALLOWED, attr, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_DELETE_ON_CLOSE);
NtClose(file);
如您所见,我正在尝试打开设置了共享标志的文件,并且还使用了FILE_DELETE_ON_CLOSE,因为我关闭了句柄,并且希望之后将其删除。
出于某种原因,我遇到的问题是Segmentation Fault(我使用的是cygwin win10)。小调试表明问题出在InitializeObjectAttributes函数中。
附言
我知道当文件的句柄被其他进程持有时,删除文件并不是最好的解决方案,但主要目标是以这种方式模仿rm.exe 的行为。希望你能帮忙。谢谢。
【问题讨论】:
-
将
POBJECT_ATTRIBUTES attr; InitializeObjectAttributes (attr, ...);改为OBJECT_ATTRIBUTES attr; InitializeObjectAttributes (&attr, ...);,然后将&attr改为NtOpenFile() -
因为文件在使用中不能删除。
-
这在 Windows 中是不可能的
-
当然不是删除文件而是移动到
$Recycle.Bin -
在 $Recycle.Bin(同一个磁盘)中查找“已删除”文件
标签: c++ windows file winapi cygwin