zoukankan      html  css  js  c++  java
  • Win32之创建进程

    CreateProcess函数介绍

    BOOL CreateProcessA(
    		LPCSTR lpApplicationName,                   //可执行文件的名称完整的路径+程序名字)
    		LPSTR lpCommandLine,                        //指定了要传递给执行模块的参数
    		LPSECURITY_ATTRIBUTES lpProcessAttributes,  //进程安全性
    		LPSECURITY_ATTRIBUTES lpThreadAttributes,   //线程安全性
    		BOOL bInheritHandles,                       //指定了当前进程中可继承句柄是否可被新进程继承
    		DWORD dwCreationFlags,                      //指定进程优先级和其它创建标志
    		LPVOID lpEnvironment,                       //指定新进程使用的环境变量
    		LPCSTR lpCurrentDirectory,                  //新进程使用的当前目录
    		LPSTARTUPINFOA lpStartupInfo,               //指定新进程中主窗口的位置、大小和标准句柄等
    		LPPROCESS_INFORMATION lpProcessInformation  //返回新建进程的标志信息,如ID号、句柄等
    	);
    
    
    typedef struct _STARTUPINFO {
    	DWORD cb;                //本结构的长度 
    	LPTSTR lpReserved;       //保留字段 
    	LPTSTR lpDesktop;        //指定一个字符串,包括该进程的桌面名或窗口位置名
    	LPTSTR lpTitle;          //指定控制台进程创建的新控制台窗口标题 
    	DWORD dwX;               //指定新窗口的左上角的 x 和 y 的偏移量(以像素为单位)
    	DWORD dwY; 
    	DWORD dwXSize;           //指定新窗口的宽度和高度
    	DWORD dwYSize; 
    	DWORD dwXCountChars;     //指定新窗口的屏幕缓冲区宽度和高度
    	DWORD dwYCountChars; 
    	DWORD dwFillAttribute;   //指定新窗口的初始文字和背景颜色
    	DWORD dwFlags;           //创建窗口标志
    	WORD wShowWindow;        //新窗口显示状态 
    	WORD cbReserved2;        //保留,必须为0 
    	LPBYTE lpReserved2;      //保留,必须为NULL 
    	HANDLE hStdInput;        //指定一个句柄,该句柄用作进程的标准输入句柄
    	HANDLE hStdOutput;       //指定一个句柄,改句柄作为进程的标准输出句柄
    	HANDLE hStdError;        //指定一个句柄,该句柄用作进程的标准错误句柄
    } STARTUPINFO, *LPSTARTUPINFO;
    
    typedef struct _PROCESS_INFORMATION {
        HANDLE hProcess;           //进程句柄
        HANDLE hThread;            //线程句柄
        DWORD dwProcessId;         //进程id
        DWORD dwThreadId;          //线程id
    } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
    

    什么是命令行?

    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
    	printf("%s - %s", argv[0], argv[1]);
    	return 0;
    }
    

    说明把参数传了进去,这就是命令行
    创建新的控制台 :

    CreateProcess(
    	NULL,
    	TEXT("cmd"),
    	NULL,
    	NULL,
    	FALSE,
    	CREATE_NEW_CONSOLE,
    	NULL,
    	NULL, 
    	&si,
    	&pi); 
    

    创建非控制台进程 :

    CreateProcess(NULL,
    	"notepad.exe", 
    	NULL,
    	NULL,
    	FALSE,
    	NULL,
    	NULL,
    	NULL,
    	&si, 
    	&pi); 
    

    创建自定义程序的进程 :

    CreateProcess(
    	NULL,
    	"child.exe", 
    	NULL, 
    	NULL, 
    	FALSE, 
    	CREATE_NEW_CONSOLE,   ////指定进程优先级和其它创建标志
    	NULL, 
    	NULL, 
    	&si, 
    	&pi);
    

    创建进程

    #include <stdio.h>
    #include <windows.h>
    
    BOOL CreateChildProcess(PTCHAR szChildProcessName, PTCHAR szCommandLine)
    {
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    	ZeroMemory(&pi, sizeof(pi));
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    
    	//创建子进程 返回成功与失败
    	if (!CreateProcess(
    		szChildProcessName,  //对象名称(完整的路径+exe)
    		szCommandLine,		 //命令行
    		NULL,				 //不继承进程句柄
    		NULL,				 //不继承线程句柄
    		FALSE,				 //不继承句柄
    		0,				     //没有创建标志
    		NULL,                //使用父进程环境变量
    		NULL,				 //使用父进程目录作为当前目录,可以自己设置目录
    		&si,				 //STARTUPINFOW结构体详细信息
    		&pi)				 //PROCESS_INFOMATION结构体进程信息
    	) 
    	{
    		printf("CreateChildProces Error: %d
    ", GetLastError());
    		return FALSE;
    	}
    	//打印进程
    	printf("进程ID:%d
    ", pi.dwProcessId);
    	printf("线程ID:%d
    ", pi.dwThreadId);
    	printf("进程句柄:%d
    ", pi.hProcess);
    	printf("线程句柄:%d
    ", pi.hThread);
    
    	//释放句柄
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    	return TRUE;
    }
    
    
    int main(int argc, char* argv[])
    {
    	TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");
    	//TCHAR szCmdline[] = TEXT("ipconfig");
    	CreateChildProcess(szApplicationName, NULL);
    
    	getchar();
    	return 0;
    }
    
  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/0x7e/p/13814951.html
Copyright © 2011-2022 走看看