Winapi CreateProcess 文件权限
Winapi CreateProcess File Permissions
我目前正在编写一些软件,其中有两个使用 winapi 的不同程序(一个解析器和一个解释器)。我想从解释器调用解析器,所以我使用 CreateProcessA
函数。然而,当解析器试图打开一个文件时,它会抛出一个权限被拒绝的错误,我不太清楚为什么。
单独调用解析器,而不是从解释器调用,工作得很好。
根据 CreateProcessA,“新进程在调用进程的安全上下文中运行”,所以看起来这个其他程序不应该有任何权限问题,因为我可以从口译员。
我在 CreateProcessA
中是否遗漏了一些会导致它更改子进程的文件权限的内容?
这是解释器的一段代码(请注意,我省略了错误检查以使代码在此处显示更简单):
// These are just used to open pipes so I can extract stdout
SECURITY_ATTRIBUTES sec = {0};
sec.nLength = sizeof(SECURITY_ATTRIBUTES);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE stdout_rd, stdout_wr;
CreatePipe(&stdout_rd, &stdout_wr, &sec, 0);
SetHandleInformation(stdout_rd, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO startInfo = {0};
startInfo.cb = sizeof(startInfo);
startInfo.hStdError = stdout_wr;
startInfo.hStdOutput = stdout_wr;
startInfo.hStdInput = NULL;
startInfo.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION processInfo = {0};
char *command = "parser /path/to/file.txt";
CreateProcessA(NULL, command, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &startInfo, &processInfo);
// Do more stuff to print out stdout from child process
这是解析器的一段代码:
int main(int argc, char **argv) {
// This call throws the error:
// Error: Permission denied
FILE *file = fopen(argv[1], "rb");
if (!file) {
printf("Error: %s\n", strerror(errno));
}
// Parse File
}
这是打开和关闭文件的解释器的一段代码。
HANDLE file = CreateFileA("/path/to/file.txt", GENERIC_READ,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
FILETIME writeTime = {0};
GetFileTime(file, NULL, NULL, &writeTime);
CloseHandle(file);
谢谢!
我认为问题不在于文件权限。如果您可以在某处写入文件,您显然应该能够使用相同的访问令牌读取它。您可能会收到 Access Denied
错误,因为解释器进程仍以独占模式打开文件。您可以在调用 CreateProcess
之前检查文件是否已关闭,或者使用 CreateFile
来读写 FILE_SHARE_*
标志。然而,如果解释器在解析器尝试使用它之前没有完成所有文件写入操作,它可能会导致其他错误。
在这种情况下,作为文件的替代方案,您可以使用内存映射文件(CreateFileMapping
、MapViewOfFile
)在不同进程之间共享数据缓冲区。
我目前正在编写一些软件,其中有两个使用 winapi 的不同程序(一个解析器和一个解释器)。我想从解释器调用解析器,所以我使用 CreateProcessA
函数。然而,当解析器试图打开一个文件时,它会抛出一个权限被拒绝的错误,我不太清楚为什么。
单独调用解析器,而不是从解释器调用,工作得很好。
根据 CreateProcessA,“新进程在调用进程的安全上下文中运行”,所以看起来这个其他程序不应该有任何权限问题,因为我可以从口译员。
我在 CreateProcessA
中是否遗漏了一些会导致它更改子进程的文件权限的内容?
这是解释器的一段代码(请注意,我省略了错误检查以使代码在此处显示更简单):
// These are just used to open pipes so I can extract stdout
SECURITY_ATTRIBUTES sec = {0};
sec.nLength = sizeof(SECURITY_ATTRIBUTES);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE stdout_rd, stdout_wr;
CreatePipe(&stdout_rd, &stdout_wr, &sec, 0);
SetHandleInformation(stdout_rd, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO startInfo = {0};
startInfo.cb = sizeof(startInfo);
startInfo.hStdError = stdout_wr;
startInfo.hStdOutput = stdout_wr;
startInfo.hStdInput = NULL;
startInfo.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION processInfo = {0};
char *command = "parser /path/to/file.txt";
CreateProcessA(NULL, command, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &startInfo, &processInfo);
// Do more stuff to print out stdout from child process
这是解析器的一段代码:
int main(int argc, char **argv) {
// This call throws the error:
// Error: Permission denied
FILE *file = fopen(argv[1], "rb");
if (!file) {
printf("Error: %s\n", strerror(errno));
}
// Parse File
}
这是打开和关闭文件的解释器的一段代码。
HANDLE file = CreateFileA("/path/to/file.txt", GENERIC_READ,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
FILETIME writeTime = {0};
GetFileTime(file, NULL, NULL, &writeTime);
CloseHandle(file);
谢谢!
我认为问题不在于文件权限。如果您可以在某处写入文件,您显然应该能够使用相同的访问令牌读取它。您可能会收到 Access Denied
错误,因为解释器进程仍以独占模式打开文件。您可以在调用 CreateProcess
之前检查文件是否已关闭,或者使用 CreateFile
来读写 FILE_SHARE_*
标志。然而,如果解释器在解析器尝试使用它之前没有完成所有文件写入操作,它可能会导致其他错误。
在这种情况下,作为文件的替代方案,您可以使用内存映射文件(CreateFileMapping
、MapViewOfFile
)在不同进程之间共享数据缓冲区。