RtlInitUnicodeString中的CreateProcess访问冲突

时间:2010-12-22 21:44:03

标签: windows visual-c++ winapi

当我使用有效的命令字符串执行以下进程生成代码时,我从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);
}

1 个答案:

答案 0 :(得分:3)

您尚未初始化STARTUPINFO。我怀疑问题出在Windows认为你传递它的堆栈垃圾上。