windows内核 创建进程

#include <Windows.h>
#include <TCHAR.H>

int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow){

	//Specifies the window station, desktop, standard handles, and appearance of the main window for a process at creation time.
	//Windows在创建新进程的时候使用这个结构的成员。大多数应用程序都希望生成的应用程序只是使用默认值。最起码要将此结构中的所有成员初始化为0,并将cb成员设为此结构的大小
	STARTUPINFO si = {sizeof(si)};
	//The SECURITY_ATTRIBUTES structure contains the security descriptor for an object and specifies whether the handle retrieved by specifying this structure is inheritable. This structure provides security settings for objects created by various functions, such as CreateFile, CreatePipe, CreateProcess, RegCreateKeyEx, or RegSaveKeyEx.。
	//如果想使用线程内核对象的默认安全属性,可以向此参数传入NULL(一般都会这样做)。如果希望所有子进程都能继承到这个线程对象的句柄,必须指定一个SECURITY_ATTRIBUTES结构,该结构的bInheritHandle成员初始化为TRUE
	SECURITY_ATTRIBUTES saProcess, saThread;

	//Contains information about a newly created process and its primary thread. It is used with the CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, or CreateProcessWithTokenW function.
	//创建一个新的进程,会导致系统创建一个进程内核对象和一个线程内核对象。在创建时,系统会为每个对象指定一个初始的使用计数1。然后,就在CreateProcess返回之前,它会使用完全访问权限来打开进程对象和线程对象,并将各自的与进程相关的(相对于进程的)句柄放入PROCESS_INFORMATION结构的hProcess和hThread成员中。当CreateProcess在内部打开这些对象时,每个对象的使用计数就变为2,还有两个成员dwProcessId和dwThreadId分别存放进程ID和第一个线程ID
	PROCESS_INFORMATION piProcessB, piProcessC;
	TCHAR szPath[MAX_PATH];

	saProcess.nLength = sizeof(saProcess);
	//A pointer to a SECURITY_DESCRIPTOR structure that controls access to the object. If the value of this member is NULL, the object is assigned the default security descriptor associated with the access token of the calling process. This is not the same as granting access to everyone by assigning a NULL discretionary access control list (DACL). By default, the default DACL in the access token of a process allows access only to the user represented by the access token.
	saProcess.lpSecurityDescriptor = NULL;
	//继承性
	saProcess.bInheritHandle = TRUE;



	saThread.nLength = sizeof(saThread);
	saThread.lpSecurityDescriptor = NULL;
	saThread.bInheritHandle = FALSE;

	//防止读写冲突
	_tcscpy_s(szPath, _countof(szPath), TEXT("ProcessB"));
	//第二个参数:可以使用pszCommandLine参数来指定一个完整的命令行,供CreateProcess用于创建新进程。当CreateProcess解析pszCommandLine字符串时,它会检查字符串中的第一个标记(token),并假定此标记是你想运行的执行体文件的名称。如果执行体文件的名称没有扩展名,就会默认是.exe扩展名,以上情况需要第一个参数为NULL(第一个参数也是指定一个执行体,不过限制更多),当第一个参数不为NULL时,将pszCommandLine参数中的内容作为新进程的命令行传给它
	//第三、四个参数可以用来设定进程、线程的安全权限
	//第五个参数若为True,则继承可继承的所有句柄
	//第六个参数 fdwCreate参数标识了影响新进程创建方式的标志(flag)。多个标志可以使用按位OR运算符来组合。fdwCreate参数还允许你指定一个优先级类
	//第七个参数 pvEnvironment参数指向一个内存块,其中包含了新进程要使用的环境字符串。大多数时候,为这个参数传入的值都是NULL,这将导致子进程继承其父进程使用的一组环境字符串。
	//第八个参数 pszCurDir参数允许父进程设置子进程的当前驱动器和目录。如果这个参数为NULL,则新进程的工作目录与生成新进程的应用程序一样。如果这个参数不为NULL,则pszCurDir必须指向一个用0来终止的字符串,其中包含了你希望的工作驱动器和目录。注意,必须在路径中指定一个盘符(驱动器号)。
	//第九个参数 psiStartInfo参数指向一个STARTUPINFO结构或STARTUPINFOEX结构
	//第十个参数 ppiProcInfo参数指向你必须分配的一个PROCESS_INFORMATION结构
	CreateProcess(NULL, szPath, &saProcess, &saThread, FALSE, 0, NULL, NULL, &si, &piProcessB);


	_tcscpy_s(szPath, _countof(szPath), TEXT("ProcessC"));
	CreateProcess(NULL, szPath, NULL, NULL, TRUE, 0, NULL, NULL, &si, &piProcessC);

	return 0;
}

参考windows内核编程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值