6

我试图阻止我的进程中的第三方 DLL 读取我打开的文件,我发现它是......好吧,不可能的。

无论我做什么,无论我指定什么共享标志,他们的调用似乎总是成功!

这是 Process Monitor 的屏幕截图——第一个CreateFile电话是我的,其余的是他们的:

截屏

这怎么可能?为什么“共享模式:无”对我撒谎,我该如何防止这种情况?


下面的代码是重现问题的示例:

#include <stdio.h>
#include <Windows.h>

int main()
{
    LPCTSTR file = TEXT("C:\\Test1234.xml");
    HANDLE hFile1 =
        CreateFile(file, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_ALWAYS, 0, NULL);
    HANDLE hFile2 =
        CreateFile(file, FILE_READ_DATA, 0, NULL, OPEN_ALWAYS, 0, NULL);
    DWORD n;
    BYTE buf[1];
    printf("%d\n", ReadFile(hFile2, buf, sizeof(buf), &n, NULL));
    CloseHandle(hFile1);
    CloseHandle(hFile2);
    DeleteFile(file);
}
4

1 回答 1

1

共享模式被强制用于实际读取和写入文件的 DATA。属性(如文件大小、时间戳等)不包含在共享规则中,并且没有办法阻止它们在没有 ACL 的情况下访问。

最好的办法是打开文件进行 R/W/D 访问,而不是指定 SHARE_READ|WRITE|DELETE。

很奇怪,但确实如此。

于 2012-12-22T05:12:50.110 回答