为什么Windows';s CreateFile(<;无共享访问权>;)对我撒谎?

为什么Windows';s CreateFile(<;无共享访问权>;)对我撒谎?,c,winapi,createfile,C,Winapi,Createfile,我试图阻止第三方DLL在我的进程中读取我打开的文件,我发现它是。。。嗯,不可能 无论我做什么,无论我指定了什么共享标志,他们的呼叫似乎总是成功的 这是Process Monitor的屏幕截图——第一个CreateFile调用是我的,其余的是他们的: 这怎么可能呢?为什么“共享模式:无”欺骗了我,我该如何防止这种情况 下面的代码是重现该问题的示例: #include <stdio.h> #include <Windows.h> int main() { LPC

我试图阻止第三方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);
}
#包括
#包括
int main()
{
LPCTSTR file=TEXT(“C:\\Test1234.xml”);
句柄hFile1=
CreateFile(文件,文件读取属性,0,NULL,始终打开,0,NULL);
处理hFile2=
CreateFile(文件,文件读取数据,0,NULL,始终打开,0,NULL);
德沃德n;
字节buf[1];
printf(“%d\n”,ReadFile(hFile2,buf,sizeof(buf),&n,NULL));
闭合手柄(hFile1);
闭合手柄(hFile2);
删除文件(文件);
}

共享模式用于实际读取和写入文件数据。属性(如文件大小、时间戳等)不在共享规则的范围内,并且没有办法阻止它们在缺少ACL的情况下进行访问

最好是打开该文件进行R/W/D访问,而不是指定共享、读、写、删除


奇怪,但却是真的。

同样值得一提的是,我不知道他们如何在开始时将文件的I/O优先级设置为“非常低”。在更改之前,不是每个文件都具有“正常”优先级吗?请显示打开该文件的代码。@RemyLebeau:请参阅更新。您没有检查错误。如果您同时设置
CreateFile()的
dwDesiredAccess
参数
调用
GENERIC\u READ
则第二次调用
CreateFile()
并没有像预期的那样失败(我测试了它)。如果随后将第一个调用更改回
FILE\u READ\u ATTRIBUTES
,则第二个调用成功。因此,似乎
文件读取\u属性
文件读取\u数据
不受共享权限的限制。尽管如此,我并没有试图阻止读取属性。。。我试图阻止读取数据。MJZ的意思是,您必须打开文件以读取/写入文件数据,以便为后续的读取/写入文件数据的打开指定共享权限。如果仅为读取属性而打开文件,则无法共享对该读/写文件数据的访问权限。