首页 > 系统相关 >windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

时间:2024-08-23 20:51:56浏览次数:9  
标签:1024 CreatePipe GRS windows CreateProcess 管道 进程 NULL define

windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

文章目录


主进程创建子进程并运行Ping 命令

/*
主进程创建子进程并运行Ping 命令
*/
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>	

#define GRS_USEPRINTF() TCHAR pBuf[1024] = {}
#define GRS_PRINTF(...) \
		StringCchPrintf(pBuf,1024,__VA_ARGS__);\
		WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),pBuf,lstrlen(pBuf),NULL,NULL);

#define GRS_USEPRINTFA() CHAR pBufA[1024] = {}
#define GRS_PRINTFA(...) \
		StringCchPrintfA(pBufA,1024,__VA_ARGS__);\
		WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE),pBufA,lstrlenA(pBufA),NULL,NULL);

#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(),0,sz)	
#define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)	
#define GRS_SAFEFREE(sz) if(NULL != p){HeapFree(GetProcessHeap(),0,p);p=NULL;}	

//获取应用程序所在的路径
void GetAppPath(PTSTR pszPath)
{
	DWORD dwLen = 0;
	//获取当前进程已加载模块的文件的完整路径
	dwLen = GetModuleFileName(NULL, pszPath, MAX_PATH);//NULL表示获取当前exe全路径

	if (dwLen == 0) return;
	
	for (DWORD i = dwLen; i > 0; i--)
	{
		if ('\\' == pszPath[i])
		{
			pszPath[i + 1] = '\0';
			break;
		}
	}
}


int _tmain()
{
	GRS_USEPRINTF();
	TCHAR pszAppPath[MAX_PATH + 1] = {};
	TCHAR pszExe[MAX_PATH + 1] = {};
	GetAppPath(pszAppPath);//获取当前exe文件所在的目录

	STARTUPINFO si = { sizeof(STARTUPINFO) };
	PROCESS_INFORMATION pi = {};
	SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) };
	sa.bInheritHandle = FALSE;//该子进程不可继承


	printf("这是父进程的控制台窗口!\r\n");
	
	//重定向到管道,接受ping命令的输出
	GRS_USEPRINTFA();
	StringCchPrintf(pszExe, MAX_PATH, _T("PING www.baidu.com"));
	BYTE pBuffer[1024] = {};//缓存
	DWORD dwLen = 0;
	HANDLE hRead1, hWrite1;//管道读写句柄
	BOOL bRet;
	sa.bInheritHandle = TRUE;

	//创建匿名管道,管道句柄是可被继承的
	bRet = CreatePipe(&hRead1, &hWrite1, &sa, 1024);
	if (!bRet)
	{
		GRS_PRINTF(_T("管道创建失败,Error Code:%d\n"), GetLastError());
		_tsystem(_T("PAUSE"));
		return 0;
	}
	/**/
	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;//隐藏子进程窗口
	si.hStdOutput = hWrite1;//将子进程的输出输入通道
	//创建子进程,ping命令,子进程是可继承的
	CreateProcess(NULL, pszExe, NULL, NULL, TRUE,
		DETACHED_PROCESS, NULL, pszAppPath, &si, &pi);

	//管道句柄已被继承,本地则可关闭,否则管道内核对象没有释放,
	// 之后的读管道操作人会一直等待管道吸入数据
//	HANDLE pHandle = GetCurrentProcess();//0xfffffff
//	HANDLE tHandle = GetCurrentThread();//0xfffffffe
	//党ping指向完毕,已经没有数据写入,就会因ReadFile读不到数据,而进程阻塞
	CloseHandle(hWrite1);
	printf("执行子进程:运行ping命令!\r\n");

	//读管道知道管道关闭
	dwLen = 1000;
	DWORD dwRead = 0;
	while (ReadFile(hRead1,pBuffer,dwLen,&dwRead,NULL))
	{
		if (0 == dwRead)
		{
			break;
		}
		GRS_PRINTFA("%s\n", pBuffer);
		ZeroMemory(pBuffer, 1024);
	}
	GRS_PRINTF(_T("Read Completion!\n\n"));
	CloseHandle(hRead1);
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
 
	_tsystem(_T("PAUSE"));
	return 0;
}

标签:1024,CreatePipe,GRS,windows,CreateProcess,管道,进程,NULL,define
From: https://blog.csdn.net/zhyjhacker/article/details/141463486

相关文章

  • 编程达人Windows核心编程 第18章 演示如何使用堆
    18_Heap.cpp演示如何使用堆18_Heap.cpp演示如何使用堆文章目录18_Heap.cpp/*------------------------------------------------------------------------18_Heap.cpp演示如何使用堆----------------------------------------------------------------------......
  • WPF ystem.Windows.Markup.XamlParseException HResult=0x80131501 Message='Spec
    System.Windows.Markup.XamlParseExceptionHResult=0x80131501Message='Specifiedclassname'WpfApp268.MainWindow'doesn'tmatchactualrootinstancetype'System.Windows.Window'.RemovetheClassdirectiveorprovideanin......
  • windows下安装es与elasticsearch报错
    发现网上很少关于windows安装elasticsearch的文章,所以本人结合一天的报错,解决问题的过程,写一下这篇文章,希望对大家有用,有帮助的话请点一个免费的赞,谢谢。安装es下载:点击https://www.elastic.co/cn/downloads/elasticsearch-->点击'Viewpastreleases'-->下拉栏中,找到7.10......
  • 【软件逆向】第11课,软件逆向安全工程师之windows API函数,每天5分钟学习逆向吧!
    资料获取关注作者,备注课程编号,获取本课配套课件和工具程序。干货开始-windowsAPI函数。微软官方提供的应用程序接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件提供的能力。地址:https://learn.microsoft.com/zh-cn/windows/win32/dlgbox/dialo......
  • WINGET windows视窗下的命令安装工具
    (WindowsPackageManager)是近年来微软推出的一款命令行工具,用于简化应用程序的安装、升级和管理。它在管理多台机器或维护开发环境时非常有用。以下是对winget的详细介绍以及一些高级用法的示例。什么是winget?winget是WindowsPackageManager的命令行工具,它允许你从命令行安装......
  • 如何在Windows下使用make编译Makefile
    最近有小伙伴咨询我去编译运行一个程序。我一开始以为是CMakeLists,结果发现是makefile。 什么是Makefile‌Makefile是一种用于自动化构建和管理程序的工具‌,它定义了项目中文件的依赖关系和构建步骤,帮助程序员自动化编译、链接和打包程序,从而提高软件开发效率。Makefile的主......
  • 【AI绘画入门】Stable diffusion安装教程,Windows+Mac系统,新手也能学会,看不懂算我输,文
    大家好,我是设计师子衿一、Stablediffusion简介Stablediffusion(简称SD),这是一个文本到图像生成模型,简单来说就是目前一个比较流行且效果较好的AI文生图工具,对比其他AI文生图工具,SD的最大优势就是开源免费,定制化强,目前有很多大佬帮我们弄了sd的安装包,整个安装流程难度几......
  • spring boot简单运用ollama大模型(windows版本)
    1、下载模型(windows为例)打开官方网站https://ollama.com/download/windows。打开exe文件,打开命令行工具,直接运行ollamarun要下载的模型(右上角的models能找到你想要的,例子以llama3.1展示,springai暂时非全支持,支持模型步骤2列出)运行完后直接是这样显示......
  • Windows11 Docker镜像存储路径更改(非C盘路径)
    前言基于WSL2安装docker后,在使用过程中会发现大量的docker镜像文件,使系统C盘容量激增,对电脑后续使用造成不便,所以需要在安装的时候,手动修改docker的镜像地址,使得镜像文件保存到另外的非系统盘中。原因最新的windows提供了新的虚拟化技术(WSL/WSL2),所以设置页面不能镜像的存储位......
  • Windows11下安装Docker
    一、准备工作先下载以下资源,暂时不要安装:Docker安装包Wsl2安装包二、开始安装1.打开主板BIOS的虚拟化选项,可以在任务管理器中确实是否已经打开2.勾上虚拟机平台所有选项(建议完成这一步骤重启)3.用管理员身份打开PowerShell,执行下面命令启动wsldism.exe/online/enable-f......