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中的错误理解: 错误理解 ...
随机推荐
- iOS-开发中的时间处理
做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单.我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制. 时间的形式 ...
- BZOJ 2306 幸福路径(DP)
题解来源:http://www.cnblogs.com/jianglangcaijin/p/3799494.html 最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j ...
- bzoj4753[JSOI2016]最佳团体
题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选). 虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案 即 ...
- 【题解】NOI2016区间
Two - pointer 第一题…… 大概就是对于一段连续的区间求解,使用两个指针不断卡区间的长度直到区间不满足条件吧. 这题只要对区间以长度从小到大排一下序,然后使用两个指针指向区间.线段树维护被 ...
- 洛谷 P2906 [USACO08OPEN]牛的街区Cow Neighborhoods | Set+并查集
题目: https://www.luogu.org/problemnew/show/P2906 题解: 垃圾水题 #include<cstdio> #include<algorith ...
- BZOJ2434 [Noi2011]阿狸的打字机 【AC自动机 + fail树 + 树状数组】
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3610 Solved: 1960 [Submit][S ...
- BZOJ3156: 防御准备 【斜率优化dp】
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2207 Solved: 933 [Submit][Status][Discu ...
- bzoj1968: [Ahoi2005]COMMON 约数研究(数论)
计算每一个数的贡献就好了..O(N) n/i只有2*sqrtn个取值于是可以优化到O(sqrtn) #include<bits/stdc++.h> #define ll long long ...
- NOIP2016Day2T3愤怒的小鸟(状压dp) O(2^n*n^2)再优化
看这范围都知道是状压吧... 题目大意就不说了嘿嘿嘿 网上流传的写法复杂度大都是O(2^n*n^2),这个复杂度虽然官方数据可以过,但是在洛谷上会TLE[百度搜出来前几个博客的代码交上去都TLE了], ...
- IE下textarea去除回车换行符
在textarea中回车,会产生转义字符\r\n,有些时候我们不需要这两个转移字符,也就是清空textarea.下面的方法并不是清空,但是能够起到差不多的效果. 如果在textarea中按回车,内容提 ...