Когда я выполняю следующий код запуска процесса с допустимой командной строкой, я получаю нарушение доступа изнутри CreateProcessW, пытающегося вызвать RtlInitUnicodeString. Я знаю, что это может произойти, когда вы передаете командную строку const, поскольку CreateProcessW (по причинам, которые мне не понятны) изменяет командную строку. Но я копирую командную строку в кучу с помощью _wcsdup, так что это не должно быть проблемой.
Одна интересная вещь, на которую следует обратить внимание, это то, что нарушение прав доступа происходит только тогда, когда командная строка верна. Если в нем есть ошибка синтаксического анализа или она относится к исполняемому файлу, который не существует, нарушения доступа нет.
Process(wchar_t *command_string) {
error = 0;
SECURITY_ATTRIBUTES security_attrs;
STARTUPINFO startup_info;
//I'm copying the string here because CreateProcessW mutates its arguments
wchar_t *new_commands = _wcsdup(command_string);
security_attrs.nLength = sizeof(SECURITY_ATTRIBUTES);
security_attrs.bInheritHandle = TRUE;
security_attrs.lpSecurityDescriptor = NULL;
CreatePipe(&_stdout, &stdout_in, &security_attrs, 0);
SetHandleInformation(_stdout, HANDLE_FLAG_INHERIT, 0);
CreatePipe(&stdin_out, &_stdin, &security_attrs, 0);
SetHandleInformation(_stdin, HANDLE_FLAG_INHERIT, 0);
printf(">>launching process: %ls\n", new_commands);
if (!CreateProcessW(
NULL, //process (extracted from the arg list instead)
(LPTSTR) new_commands, //arg list
&security_attrs,
&security_attrs,
TRUE, //inherit handles
0, //flags
NULL, //use env of parent
NULL, //use cwd of parent
&startup_info,
&info
)) {
error = GetLastError();
printf(">>failed to create process: %d\n", error);
} else {
printf(">>launched process\n");
printf(">>process id: %d\n", info.dwProcessId);
}
free(new_commands);
}