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就可以了,必须用的时候可以深入了解一下。
CreateProcess中的部分参数理解的更多相关文章
- 如何理解javaSript中函数的参数是按值传递
本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...
- 关于vue自定义事件中,传递参数的一点理解
例如有如下场景 先熟悉一下Vue事件处理 <!-- 父组件 --> <template> <div> <!--我们想在这个dealName的方法中传递额外参数 ...
- 深入理解python中函数传递参数是值传递还是引用传递
深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...
- Production环境中iptables常用参数配置
production环境中iptables常用参数配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我相信在实际生产环境中有很多运维的兄弟跟我一样,很少用到iptables的这个 ...
- 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?
第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...
- C++中 类的构造函数理解(一)
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...
- Java中的ThreadLocal深入理解
提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...
- C语言中函数可变参数解析
大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...
- java面试3-对于java中值传递的理解(Hollis)
这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...
随机推荐
- 用svmpredict输出的结果为空
源程序:
- web传参
页面通过对象,将表单数据传送给后端,后端通过对象接收参数值,
- 第一篇:python基础_1
本篇内容 Python介绍 安装 第一个程序(hello,world) 变量 用户输入(input) 数据类型 数据运算 if判断 break和continue的区别 while 循环 一. Pyth ...
- javabean 参数收集 设置属性 设置不同级别的域对象的属性 默认存储在pagecontext中
javabean 参数收集 设置属性 设置不同级别的域对象的属性 默认存储在pagecontext中
- BZOJ 1818 内部白点(离散化+树状数组)
此题就是1227 的弱化版. 画个图或者稍微证明一下就能够知道,一定不会超过一次变换. 那么我们只需要统计有多少个白点会变黑,换句话说就是有多少个白点上下左右都有黑点. 离散化横坐标,因为没有黑点在的 ...
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- [COGS2652]秘术「天文密葬法」
description 题面 给个树,第\(i\)个点有两个权值\(a_i\)和\(b_i\),现在求一条长度为\(m\)的路径,使得\(\frac{\sum a_i}{\sum b_i}\)最小 d ...
- [CF785E]Anton and Permutation
题目大意:有一串数为$1\sim n(n\leqslant2\times10^5)$,$m(m\leqslant5\times10^4)$次询问,每次问交换位置为$l,r$的两个数后数列中逆序对的个数 ...
- 【QQ】前端实现QQ会话功能
<a href="tencent://message/?uin=客服QQ号码&Menu=yes" target="blank"></a ...
- POJ1389:Area of Simple Polygons——扫描线线段树题解+全套代码注释
http://poj.org/problem?id=1389 题面描述在二维xy平面中有N,1 <= N <= 1,000个矩形.矩形的四边是水平或垂直线段.矩形由左下角和右上角的点定义. ...