【问题标题】:CreateProcess I can't start a processCreateProcess 我无法启动进程
【发布时间】:2011-09-16 17:06:59
【问题描述】:

我正在使用 CreateProcess,但我无法启动进程我正在使用以下代码,但我收到错误“对内存位置的访问无效”,但我不知道为什么。 我的代码有问题吗?

#include <Windows.h>
#include <stdio.h>

//#include "common.h"

int main(void)
{

    DWORD creation_flags = DEBUG_PROCESS;
    STARTUPINFO startupinfo;
    PROCESS_INFORMATION process_information;
    char *path_to_exe = "D:\\dbg\\calc.exe";


    startupinfo.dwFlags     =   0x1;
    startupinfo.wShowWindow =   0x0;


    startupinfo.cb  =   sizeof(startupinfo);

    if(CreateProcess(   path_to_exe,
                        NULL,
                        NULL,
                        NULL,
                        NULL,
                        creation_flags,
                        NULL,
                        NULL,
                        &startupinfo,
                        &process_information)){
        printf("We have successfully launched the process!\n");
        printf("[*] PID: %d\n", process_information.dwProcessId);
    }
    else
        printf("[*] Error: %d.\n", GetLastError());
}

【问题讨论】:

    标签: c++ c winapi


    【解决方案1】:

    您只填写了startupinfo 结构的3 个字段。 其余的字段都充满了垃圾,其中一些垃圾可能会导致严重的问题。

    您应该完全初始化结构,明确地将 NULL、0 和其他“空”值放在您不想指定任何内容的位置。

    【讨论】:

    • The MSDN documentation 表示“lpCommandLine 参数可以为 NULL。在这种情况下,函数使用 lpApplicationName 指向的字符串作为命令行”,所以这不应该是问题的原因。
    • 将其初始化为全零的最简单方法是:STARTUPINFO startupinfo = {0};
    • @Ferruccio:这会将其全部初始化为零。但这在许多情况下可能不一定是需要的。考虑一个假设字段“int timeout; // 中止进程之前的秒数。设置为 -1 以永久等待” 将其设置为零将导致它立即失败。 -1 是那里需要的。一揽子将所有内容设置为零是有风险的。
    • @abelenky:你是对的,但是将它初始化为全零会使它处于已知状态,而不是让任何随机值恰好在堆栈上。然后,您可以根据需要设置任何所需的字段。
    • @abelenky:Win32 API 几乎总是使用 0 作为默认值,我能说出的唯一例外是可追溯到 Win16 的已弃用 API。当然,并非所有成员都有默认值,尤其是第一个 cb(字节数)成员必须始终设置。这就是为什么我通常写STARTUPINFO startupinfo = {sizeof(startupinfo};
    【解决方案2】:

    尝试将启动信息结构归零。即使您没有设置显式标志,也会使用其中的一些成员(例如 lpTitle)。

    还要注意 CreateProcess 可能会暂时写入应用程序名称字符串,因此您可能希望避免传递只读字符串文字。不过,这只发生在函数的 unicode 版本上,至少在最新版本的 Windows 上是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多