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中的错误理解: 错误理解 ...
随机推荐
- 面试:谈谈你对Spring框架的理解
Spring是一个优秀的轻量级框架,大大的提高了项目的开发管理与维护.Spring有两个核心模块.一个是IOC,一个是AOP. IOC: 就是控制反转的意思,指的是我们将对象的控制权从应用代码本身转移 ...
- [剑指Offer] 55.链表中环的入口结点
题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. /* struct ListNode { int val; ...
- 如何正确实现Page接口分页,用PageImpl 自定义分页
/** * Constructor of {@code PageImpl}. * * @param content the content of this page, must not be {@li ...
- bzoj 3275: Number (最小割)
题目的意思是要选一些数,但是这些数如果满足两个条件的话就不能一起被选. type arr=record toward,next,cap:longint; end; const maxn=; maxm= ...
- spring任务执行器与任务调度器(TaskExecutor And TaskScheduler)
对于多线程及周期性调度相关的操作,spring框架提供了TaskExecutor和TaskScheduler接口为异步执行和任务调度.并提供了相关实现类给开发者使用.(只记录采用注解的使用形式,对于X ...
- BZOJ3197:[SDOI2013]刺客信条——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3197 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受 ...
- BZOJ3040:最短路——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3040 题意rt,使用pb_ds的堆解决本问题. 所以其实就是mark一下的. 不过有人确认过官方不 ...
- BZOJ1911:[Apio2010]特别行动队——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1911 又是一个显然的dp……好吧我懒得讲了. s[i]是战斗力前缀和. 我们仍然设k<j< ...
- CF939E:Maximize! ——题解
http://codeforces.com/problemset/problem/939/E https://vjudge.net/problem/CodeForces-939E 给一个集合,每次两个 ...
- BZOJ1597 土地购买 【dp + 斜率优化】
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5466 Solved: 2035 [Submi ...