【发布时间】:2020-04-03 23:11:02
【问题描述】:
我有 ParentProcess.exe,其中包含以下代码。它创建一个文件并用一个简单的字符 1 填充它,然后它创建一个名为 ChildProcess.exe 的新进程。此 ChildProcess 使用 bIheritance 标志 true 创建。我希望它能够访问父对象的对象。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int main(int argc, const char* argv[])
{
SECURITY_ATTRIBUTES process_sa;
process_sa.nLength = sizeof(process_sa);
process_sa.bInheritHandle = TRUE;
process_sa.lpSecurityDescriptor = 0;
SECURITY_ATTRIBUTES thread_sa;
thread_sa.nLength = sizeof(thread_sa);
thread_sa.bInheritHandle = TRUE;
thread_sa.lpSecurityDescriptor = NULL;
HANDLE hFileCreated = CreateFile("e:\\Sample.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, &process_sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFileCreated == INVALID_HANDLE_VALUE)
{
printf("File doesn't created.");
return 1;
}
char c = '1';
DWORD w;
WriteFile(hFileCreated, &c, 1, &w, 0);
STARTUPINFO sinfo;
ZeroMemory(&sinfo, sizeof(sinfo));
sinfo.cb = sizeof(sinfo);
PROCESS_INFORMATION pinfo;
ZeroMemory(&pinfo, sizeof(pinfo));
if (CreateProcess(0, "ChildProcess.exe", &process_sa, &thread_sa, TRUE, 0, 0, 0, &sinfo, &pinfo))
printf("done.");
else
printf("failed.");
CloseHandle(pinfo.hThread);
CloseHandle(pinfo.hProcess);
return 0;
}
ChildProcess.exe 有以下代码,我希望它可以访问由父进程创建的文件的句柄,但是当它运行时它显示 0XFFFFFFFF 的地址。哪里有问题。 ChildProcess 代码:
#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFileCreatedInheritance = INVALID_HANDLE_VALUE;
_stscanf_s(L"e:\\Sample.txt", _T("%p"), &hFileCreatedInheritance);
printf("The handle of the file is %p.\n", hFileCreatedInheritance);
return 0;
}
【问题讨论】:
-
阅读 CreateFile 的文档,特别注意 dwShareMode。它指的是如果在原始进程打开文件时第二个进程尝试打开文件会发生什么。
-
@thurizas 仅在两个进程都调用
CreateFile时适用,在这种情况下并非如此。 -
嗯...这就是重点。
CreateFile不处理跨进程共享句柄。要访问该文件,OP 必须在子进程和父进程中调用CreateFile。我不确定CreateProcess的参数是否允许共享文件句柄。 (我很确定fork确实如此)。