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

devtools/2024/11/15 1:46:04/

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

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

文章目录

  • windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)
  • 主进程创建子进程并运行Ping 命令


主进程创建子进程并运行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;
}

http://www.ppmy.cn/devtools/100751.html

相关文章

ptrade排坑日记——一键脚本报错,启动jupyterhub失败。

前言 今天要和大家分享的是在使用ptrade过程中遇见的问题——一键脚本报错&#xff0c;启动jupyterhub失败。 一、问题描述 server_operation.pyc-一键脚本报错&#xff0c;启动jupyterhub失败&#xff0c;jupyterhub.log报错&#xff1a; Traceback(most recent call last)…

Linux异步通知

1.异步通知简介 我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。 信号类似于我们硬件上使用的“中断”,只不过信号是软件…

在前端开发中使用命令模式:JavaScript和Vue的实现技巧

在前端开发中使用命令模式&#xff1a;JavaScript和Vue的实现技巧 1. 引言 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求的发送者和请求的接收者解耦。该模式允许将请求封装为一个对象&#xff0c;从而可以使用不同的请求、队列请…

【LeetCode Cookbook(C++ 描述)】平衡二叉树

目录 平衡二叉树基础不同插入节点方式的不同旋转LL 型失衡RR 型失衡LR 型失衡RL 型失衡 删除操作删除节点为二叉树的叶子节点删除的节点只有左子树或者右子树删除的节点既有左子树又有右子树 LeetCode #110&#xff1a;Balanced Binary Tree 平衡二叉树递归法&#xff08;自底向…

01-Python的发展历史和特点

Python 的发展历史&#xff1f; 荷兰的计算机程序员吉多范罗苏姆&#xff08;Guido Van Rossum&#xff09;创建了 Python。他于 1989 年在荷兰国家数学与计算机科学研究中心 (CWI) 开启了 Python 之旅&#xff0c;最初只是为在圣诞节期间能保持依旧忙碌的业余爱好。语言的名字…

基于SpringBoot+Vue+uniapp的“村游网”系统的微信小程序开发的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 &#x1f31e;博主介绍 &#xff1a;✌全网粉丝15W,CSDN特邀作者、21…

Datawhale 夏令营 Task1:跑通YOLO方案baseline!

YOLO数据处理 一.YOLO数据格式 YOLO数据格式为 <class> <x_center> <y_center> <width> <height> 二.制作数据集 1.新建文件夹及配置文件 if not os.path.exists(yolo-dataset/):os.mkdir(yolo-dataset/) if not os.path.exists(yolo-datas…

机械学习—零基础学习日志(如何理解概率论9)

大数定律与中心定律 来看一道习题&#xff1a; 这个题目看看&#xff0c;应该是什么呢~下一章来看看解析~ 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;