zoukankan      html  css  js  c++  java
  • CreateProcess中的部分参数理解

    函数原型,这里写Unicode版本

    WINBASEAPI
    BOOL
    WINAPI
    CreateProcessW(
    _In_opt_ LPCWSTR lpApplicationName, //可执行文件名字
    _Inout_opt_ LPWSTR lpCommandLine, //命令行字符串
    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程对象安全属性
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程对象安全属性
    _In_ BOOL bInheritHandles,
    _In_ DWORD dwCreationFlags, //标识
    _In_opt_ LPVOID lpEnvironment, //新进程的环境变量字符内存
    _In_opt_ LPCWSTR lpCurrentDirectory, //子进程当前驱动器目录路径
    _In_ LPSTARTUPINFOW lpStartupInfo,
    _Out_ LPPROCESS_INFORMATION lpProcessInformation
    );


    第一参数:99%传NULL,如果非要传,不允许省略.exe
    VOID CreateProcessSample()
    {
    WCHAR lpPath[] = L"WORDPAD ReadMe.txt"; //特殊启动方式
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(L"C:\Windows\System32\notepad.exe", lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }


    第二参数,类型是LPWSTR 说明我们要创建一个非常量字符串

    WCHAR lpPath[] = L"notepad ReadMe.txt";
    可以有几个命令行,而且第一部分扩展名可以省略


    这是Unicode版本
    VOID CreateProcessSample1()
    {
    WCHAR *lpPath = L"notepad.exe"; // 错误
    WCHAR lpPath[] = L"notepad.exe"; // 正确


    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;


    BOOL bStatus = CreateProcessW(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // 正确
    BOOL bStatus = CreateProcessW(NULL, L"notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // 错误


    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }


    如果是多字节版本,上述问题都不存在

    VOID CreateProcessSample1()
    {
    CHAR *lpPath = "notepad.exe";
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, "CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }

    第六参数,dwCreationFlags 标识

    #define DEBUG_PROCESS 0x00000001 父进程可以调试子进程,孙进程
    #define DEBUG_ONLY_THIS_PROCESS 0x00000002 父进程可以调试子进程,不可以调试孙进程
    #define CREATE_SUSPENDED 0x00000004 主线程被挂起
    #define DETACHED_PROCESS 0x00000008 阻塞对于父进程的访问
    #define CREATE_NEW_CONSOLE 0x00000010 新进程创建新的窗口

    // 创建挂起进程
    VOID CreateProcessSample2()
    {
    WCHAR lpPath[] = L"notepad.exe";
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    // 步骤1:使用CREATE_SUSPENDED创建挂起进程
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }

    // 步骤2:在这里对子进程进行数据处理和模块注入等操作
    // ……
    // 步骤3:恢复执行
    ResumeThread(pi.hThread);
    }


    创建隐藏进程
    VOID CreateProcessSample4()
    {
    WCHAR lpPath[] = L"notepad.exe";

    STARTUPINFO si = { sizeof(si) };
    // 设置STARTF_USESHOWWINDOW标记,使得STARTUPINFO结构的wShowWindow字段有效
    si.dwFlags |= STARTF_USESHOWWINDOW;
    // 设置窗口的显示方式,SW_HIDE表示隐藏方式
    si.wShowWindow = SW_HIDE;

    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }

    其他参数基本传NULL就可以了,必须用的时候可以深入了解一下。

  • 相关阅读:
    IO流(5)—缓冲流
    vue-element-admin 中文问题
    npm 下载慢解决方案
    fatal: unable to connect to github.com
    为什么有sessionStorage,localStorage等,还需要vuex
    vuex页面刷新数据丢失的解决办法
    Node中JWT的使用
    socket.io 实现长连接演示代码
    WebSocket 实现长连接演示代码
    jquery ajax上传文件
  • 原文地址:https://www.cnblogs.com/kekoukele987/p/7538039.html
Copyright © 2011-2022 走看看