我目前正在撰寫一些使用winapi(決議器和解釋器)具有兩個不同程式的軟體。我想從解釋器呼叫決議器,所以我正在使用該CreateProcessA函式。然而,當決議器試圖打開一個檔案時,它會拋出一個 Permission Denied 錯誤,我不太清楚為什么。
自己呼叫決議器,而不是從解釋器呼叫,效果很好。
根據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);
謝謝!
uj5u.com熱心網友回復:
我不認為問題出在檔案權限上。如果您可以在某處寫入檔案,那么您顯然應該能夠使用相同的訪問令牌讀取它。您可能會收到Access Denied錯誤,因為檔案仍由解釋器行程以獨占模式打開。您可以在呼叫之前檢查檔案是否已關閉CreateProcess,或者使用標志CreateFile進行讀寫。FILE_SHARE_*但是,如果解釋器在決議器嘗試使用它之前沒有完成所有檔案寫入操作,它可能會導致其他錯誤。
作為此方案中檔案的替代方案,您可以使用記憶體映射檔案 ( CreateFileMapping, MapViewOfFile) 在不同行程之間共享資料緩沖區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428288.html
上一篇:你如何撰寫一個IsPressed(一個應該只在第一次按下時回傳true的函式)?
下一篇:在ctypes中獲取當前桌面壁紙
