Windows下CreateFile为何会修改我的ShareMode参数?
CreateFile共享模式行为不符合预期的原因解析
你在Windows下使用CreateFile时遇到的共享模式行为偏差,核心是对Windows文件共享规则的理解误区,并不是CreateFile修改了你的dwShareMode参数。
先明确Windows文件共享的双向校验逻辑:每次调用CreateFile打开文件时,必须同时满足两个条件:
- 当前请求的
dwDesiredAccess(自身需要的权限),不能与已存在的所有文件句柄的未共享权限冲突; - 当前请求的
dwShareMode(允许后续进程拥有的权限),必须允许所有已存在文件句柄的dwDesiredAccess权限。
结合你的测试代码逐一分析:
1. hFile1打开成功
HANDLE hFile1 = CreateFileW(wszFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...);
- 自身权限:读写(
GENERIC_READ|GENERIC_WRITE) - 允许后续进程拥有的权限:仅读(
FILE_SHARE_READ)
此时文件无其他打开句柄,直接成功,同时锁定了写权限不允许后续未授权的进程访问。
2. hFile2打开失败
HANDLE hFile2 = CreateFileW(wszFile, GENERIC_READ, FILE_SHARE_READ, ...);
- 自身权限:读(
GENERIC_READ) - 允许后续进程拥有的权限:仅读(
FILE_SHARE_READ)
校验时发现:已存在的hFile1拥有写权限,但hFile2的dwShareMode未包含FILE_SHARE_WRITE——意味着hFile2不允许任何后续进程持有写权限,但当前已存在的hFile1已经持有写权限,违反了双向校验规则,因此打开失败,错误码为ERROR_SHARING_VIOLATION(32)。
3. hFile3打开成功
HANDLE hFile3 = CreateFileW(wszFile, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, ...);
- 自身权限:读(
GENERIC_READ) - 允许后续进程拥有的权限:读写(
FILE_SHARE_READ|FILE_SHARE_WRITE)
双向校验均通过: - hFile3的读权限,在hFile1的共享模式(允许读)范围内;
- hFile3的共享模式允许写权限,匹配hFile1已持有的写权限;
因此打开成功。
关键误解纠正
你原本以为dwShareMode是“当前进程共享自己的权限子集”,但实际它的作用是声明当前进程允许后续其他进程拥有的权限范围。同时,每次打开都要反向校验:已存在的进程的共享模式是否允许当前进程的访问权限。这一双向校验逻辑是导致你预期与实际结果不符的核心原因。
内容的提问来源于stack exchange,提问作者David Gausmann
相关产品推荐
相关产品推荐

