Windows CreateFile -文件打开时动态共享模式

Windows CreateFile - Dynamic share mode while the file is open?

本文关键字:动态 共享 模式 CreateFile 文件 Windows      更新时间:2023-10-16

我的应用程序处理一个高度敏感的文件。正常情况下,这个文件不是与他人共享的,而是由我的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);