子进程是否可以读取被父进程锁定的文件?



我有一个父进程,它使用CreateFile()创建一个文件并锁定它。下面是代码:

m_hWriterLockFile = ::CreateFile("C:\Test.txt", 
GENERIC_READ | GENERIC_WRITE, 
0, // exclusive
NULL, // default security
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

现在,我希望只有子进程才能访问这个被锁定的文件。我不希望任何其他进程读取这个文件。

我创建了一个子进程。下面是示例代码:

// Initialize a security attributes structure.
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
if (!CreateProcess("FileReader.exe", // I want to invoke this exe
"C:\Test.txt",
&sa,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi))
{
std::cout << "Create Process Faild (%d) " << GetLastError() << 'n';
}

不幸的是,我不能达到我的目标,有人可以帮助我吗?还有其他方法可以做到这一点吗?如果需要,我会分享更多的信息(代码)。

注意:我没有分享完整的代码,使文章更短。

我的问题的答案如下:

创建具有可继承句柄的文件,并将该句柄传递给子进程。一种简单的方法是将其作为命令行参数传递。我们必须传递一个SECURITY_ATTRIBUTES结构,该结构为bInheritHandle指定TRUE给CreateFile,并将TRUE传递给调用CreateProcess的bInheritHandles参数。

创建文件

,

SECURITY_ATTRIBUTES sa{ sizeof sa, nullptr, TRUE };
HANDLE hFile = CreateFileA("C:\Test.txt",
GENERIC_READ | GENERIC_WRITE,
0,
&sa,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

子进程:

UINT_PTR uiHandle = reinterpret_cast<UINT_PTR>(hFile);
sprintf_s(szCmdLine, ""%s" %Iu", szExePath, uiHandle);
if (CreateProcessA(nullptr,
szCmdLine,
nullptr,
nullptr,
TRUE,
CREATE_NEW_CONSOLE,
nullptr,
nullptr,
&si,
&pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}

最新更新