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就可以了,必须用的时候可以深入了解一下。

  • 相关阅读:
    这是一段Java程序员写给最爱的老婆的代码。
    第一次来写博客,这里可以记录很多故事。
    转 JavaScript前端和Java后端的AES加密和解密
    java webservice浏览器测试地址
    Eclipse4.5在线安装Aptana插件及配置代码提示教程
    彻底的卸载干净oracle 11g(转)
    oracle查看编码以及修改编码(转)
    关于AngularJs数据递归呈现的实现的几种方式
    ionic的ngModel指令失效
    AngularJS 自定义指令详解
  • 原文地址:https://www.cnblogs.com/kekoukele987/p/7538039.html
Copyright © 2011-2022 走看看