函数原型,这里写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就可以了,必须用的时候可以深入了解一下。

CreateProcess中的部分参数理解的更多相关文章

  1. 如何理解javaSript中函数的参数是按值传递

    本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...

  2. 关于vue自定义事件中,传递参数的一点理解

    例如有如下场景 先熟悉一下Vue事件处理 <!-- 父组件 --> <template> <div> <!--我们想在这个dealName的方法中传递额外参数 ...

  3. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  4. Production环境中iptables常用参数配置

    production环境中iptables常用参数配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我相信在实际生产环境中有很多运维的兄弟跟我一样,很少用到iptables的这个 ...

  5. 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?

    第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...

  6. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

  7. Java中的ThreadLocal深入理解

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  8. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  9. java面试3-对于java中值传递的理解(Hollis)

    这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...

随机推荐

  1. 钉钉 E应用 打开分享外链

    钉钉 E应用 打开分享外链 外部链接 https://open-doc.dingtalk.com/microapp/dev https://open-doc.dingtalk.com/microapp ...

  2. JAVA IDE IntelliJ IDEA使用简介(二)—之基本操作

    一.在编辑器中打开文件  1.可以使用下面的几种方式打开project内的文件进行编辑  (·)在project窗口中双击需要编辑的文件.  (·)在project窗口选择需要编辑的文件,按F4  ( ...

  3. js 复制到剪贴板 兼容还得自己想办法

    clipboard.js https://github.com/zenorocha/clipboard.js/ 主要问题还是ie8, 可以使用ie 特有的方法 if (window.clipboard ...

  4. 2011 Multi-University Training Contest 7 - Host by ECNU

    AC: F I. rank 40/88. 开场看了F发现是个简单的DP,随便写了一下WA,,,发现把样例倒着输就过不了了...原来是忘了最后的时候开始上课的话可能上不了多久... 想到一个简洁的状态方 ...

  5. HUAS 1476 不等数列(DP)

    考虑DP. 如果把转移看出当前位填什么数的话,这样是有后效性的. 如果考虑当前的序列是将1至n依次插入序列中的话. 考虑将i插入1到i-1的序列中,如果插入到<号中或者首部,那么最后就会多出一个 ...

  6. BZOJ4868 Shoi2017期末考试(三分+贪心)

    容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...

  7. BZOJ4867 Ynoi2017舌尖上的由乃(dfs序+分块)

    容易想到用dfs序转化为序列上的问题.考虑分块,对每块排序,修改时对于整块打上标记,边界暴力重构排序数组,询问时二分答案,这样k=sqrt(nlogn)时取最优复杂度nsqrt(nlogn)logn, ...

  8. BZOJ4240 有趣的家庭菜园(贪心+树状数组)

    显然相当于使序列变成单峰.给原序列每个数按位置标号,则要求重排后的序列原标号的逆序对数最少.考虑将数从大到小放进新序列,那么贪心的考虑放在左边还是右边即可,因为更小的数一定会在其两侧,与它自身放在哪无 ...

  9. libsvm 用在 婚介数据集中 预测 用户配对

     分类前具备的数据集: 书本第九章数据集(训练集):agesonly.csv和matchmaker.csv. agesonly.csv 格式是: 男年龄,女年龄,是否匹配成功 24,30,1 30,4 ...

  10. Oracle DB_LINK如何使用

    语句,或可通过可视化操作 -- Create database link create database link DBL_TESTconnect to UID identified by PSWus ...