Windows CreateFile -文件打开时动态共享模式
Windows CreateFile - Dynamic share mode while the file is open?
我的应用程序处理一个高度敏感的文件。正常情况下,这个文件不是与他人共享的,而是由我的APP独家访问的。因此,它被打开如下:
DWORD dwShareMode = 0; // Exclusive no share
hFile = CreateFile(
pszSrc, // file to open
GENERIC_READ | GENERIC_WRITE, // open for reading
dwShareMode, // No share!!
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file
NULL); // no attr. template
然而,在某些情况下,我的APP应该允许其他人读取该文件的某些部分。这应该在没有任何其他共享机制的情况下执行:没有锁,没有互斥锁,没有任何类似的东西。除此之外-我的应用程序必须保持这个文件在任何时候打开。本APP的关键任务条款不适用关闭/重新打开。
我的问题是:是否有一种方法可以动态地改变与句柄相关联的文件的共享模式,而它是打开的?实际上,一个人可以打开一个文件为EXCLUSIVE share,然后改变它为FILE_SHARE_READ | FILE_SHARE_WRITE -来回吗?
感谢e .
您应该简单地使用FILE_SHARE_READ
打开文件,并使用访问控制列表来防止未经授权的用户进程读取该文件。
为了协调访问文件的进程之间的访问,您应该使用LockFile
/UnlockFile
系列api。
使用LockFile
,您可以锁定文件,以便即使另一个进程可以打开它,具有读访问权限,他们也无法读取它,直到您使用UnlockFile
解锁它。
注意,您可以锁定超出分配文件大小的区域。所以要锁定整个文件:
LockFile(hFile, 0x0, 0x0, 0xffffffff, 0xffffffff);
// To unlock it:
UnlocFile(hFile, 0x0, 0x0, 0xffffffff, 0xffffffff);
您应该注意,打开文件进行独占访问和锁定文件区域都不是安全机制。特别是,它们不会阻止管理用户使用备份api读取文件。
您需要以新的共享模式重新打开文件,但您可以不关闭它,参见ReOpenFile
HANDLE newHandle = ReOpenFile(origHandle,
FILE_GENERIC_READ | FILE_GENERIC_WRITE,
FILE_SHARE_READ, 0);
相关文章:
- 如果同时存在共享库和动态库,则链接器将首选哪个库?
- 如何在进入动态打开的共享库时设置断点?
- 使用CFBundleCreate在C++中的Mac上加载动态共享库(DLL)
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- 使用dlopen动态加载共享库
- Tensorflow:与共享库动态链接
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 当使用rpath时,C++可执行文件无法找到动态链接的共享库
- 共享_ptr的向量的C 动态降低
- 在 Solaris 上创建和使用动态共享库
- 2D 阵列的 CUDA 动态共享内存分配
- 如何在 C++ xcode 项目中使用动态共享库
- 如果静态和动态加载了libcrypto,则两次加载的动态/共享库/RSA_check_key将失败
- 动态共享库中的虚函数会产生段错误
- 无法在运行时加载动态共享库,包括C++中的另一个共享库
- 与MinGW的静态和动态/共享链接
- Windows CreateFile -文件打开时动态共享模式
- 在使用动态共享内存分配的情况下更正内核调用
- 链接Linux中的动态共享库-对函数的未定义引用