函数原型,这里写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. Android基础------通知栏

    前言:Android通知栏提示笔记 通知几乎是每一款app都拥有的功能 1.发送通知 发送一个通知栏必须用到两个类:  NotificationManager . Notification. Noti ...

  2. react-event-pooling

    react-event-pooling 事件池 https://codesandbox.io/s/3xp4y9zp7q https://reactjs.org/docs/events.html#eve ...

  3. linux 环境变量配置(node)

    控制台 env 查看当前的环境变量配置 修改/etc/profile文件,在末尾添加以下内容 export NODE_HOME=/usr/local/node //Node所在路径 export PA ...

  4. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  5. Qt——设计颜色编辑选取对话框

    Qt中已经有一些封装好的对话框,比如QMessageBox.QColorDialog等,使用起来快捷方便,但缺点是我们无法为它们自定义样式,所以可能难以“融入”我们的项目.既然如此,那就自己做一个把. ...

  6. [洛谷P4900]食堂

    题目大意:$n(n\leqslant10^6)$组询问,每组询问给出$l,r(l,r\leqslant10^6)$,求($\{\dfrac ij\}$表示$\dfrac ij$的小数部分): $$\s ...

  7. HDU 2083(排序+绝对值+中间值求和)

    简易版之最短距离 点我跳转到HDOJ Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  8. bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)

    题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...

  9. BZOJ1999 NOIP2007 洛谷P1099 P2491 SDOI 2011

    Description: 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各 ...

  10. sed 用法 转https://www.cnblogs.com/Dev0ps/p/8441255.html

    假设文档内容如下: [root@localhost ~]# cat /tmp/input.txt null test 要求:在1111之前添加AAA,方法如下: sed -i 's/指定的字符/要插入 ...