双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)
简介:
在本地,用父进程创建一个cmd.exe子进程,这个子进程的输入输出被重定向到两条匿名管道,从而实现与父进程通信。父进程输入命令到一条管道,子进程读取后执行并输出到另一条管道,父进程读取后输出到窗口。
此版本源代码借鉴并修改、优化了前人的创作,详见:https://blog.csdn.net/aq782645210/article/details/16370409 中的评论
源代码:
#include <stdio.h>
#include <WINDOWS.H>
#define SEND_BUFF_SIZE 1024//实现去除执行结果中的 "命令\n"
void print(char *cmdstr)
{while(*((char*)cmdstr++)!='\n');printf(cmdstr);
}int main()
{HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道CHAR Buff[SEND_BUFF_SIZE] = {0};CHAR sendBuff[SEND_BUFF_SIZE] = ("dir \n");//安全属性的东西SECURITY_ATTRIBUTES sa;sa.nLength=sizeof(sa);sa.lpSecurityDescriptor=0;sa.bInheritHandle=true; int ret;if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道,以改变DOS的标准输入输出{return -1;}if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0)){return -1;}//启动信息STARTUPINFO si;ZeroMemory(&si,sizeof(si));//GetStartupInfo(&si);si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.hStdInput = hReadPipe2;si.hStdOutput = si.hStdError = hWritePipe1;char cmdLine[256] = {0};GetSystemDirectory(cmdLine,sizeof(cmdLine));strcat(cmdLine, ("\\cmd.exe"));PROCESS_INFORMATION ProcessInformation;if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0){return -1;}unsigned long lBytesRead,lBytesWrite;//存放实际读写字节的变量while(TRUE){lBytesRead=0;Sleep(50);//等待cmd程序执行ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读if(lBytesRead) {//第一次可以读到cmd的初始化信息ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据//如果读到数据,则对数据进行下一步处理print(Buff);ZeroMemory(Buff,sizeof(Buff)); }else{//管道中无数据时输入命令,以回车结束char ch;int count=0;ZeroMemory(sendBuff,sizeof(sendBuff));while((ch=getchar())!='\n'){sendBuff[count]=ch;count++;}sendBuff[count++]='\n';if(!WriteFile(hWritePipe2, sendBuff,count,&lBytesWrite,0))//写入数据 {printf("WriteFile Error!!\n");return -1;}//等待cmd程序执行Sleep(100);}}}
编译好的程序:
https://pan.baidu.com/s/1VUtnTyqMHnv588RcJweohQ
双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)相关推荐
- Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信
一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...
- 为什么本地sqlservr.exe进程占用内存如此之大?
机器配置: P4 3.0G64bit+ddr2 1G 环境: win2003 sp1 + sql server 2000 sp4 没有发现机器有中毒症状啊,大家的sql servr进程也是这样么? 转 ...
- 托盘图标在explorer.exe进程退出重启后图标消失(应用程序进程依然存在)的问题
杀掉explorer进程后,windows taskbar也就没有了,托盘图标也就跟着消失了.当explorer进程重启,taskbar将会被创建,taskbar创建后会使用字符串"Task ...
- 利用钩子技术控制进程创建(附源代码)
源码下载地址:http://download.csdn.net/detail/swanabin/6575541 一. 简介 最近,我了解到一个叫做Sanctuary的相当有趣的安全产品.它能够阻止任何 ...
- cmd.exe专杀工具
症状:开机CPU就是100%,查进程,原来是cmd.exe 占用了绝大部分的CPU.关闭cmd.exe后,CPU实用率恢复正常.但是再次开机的时候,CPU又是100%,cmd.exe 依然占用了绝大部 ...
- cmd.exe病毒查杀(网络整理版)
阿鱼终于中毒了!就是当今流行的cmd.exe,症状:CPU占有率达100%,资源管理器里出现CMD.EXE进程.还把阿鱼的各类上网工具的用户名和密码都盗走!用了多种查杀***工具,均未治愈. 本小生人 ...
- Linux进程通信(一)——pipe管道
本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信 进程通信就是两个进程之间进行数据交换, ...
- TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
TCP与UDP协议初步学习--网络环境中分布式进程通信的基本概念 一.单机系统中进程通信方法 进程和进程通信是操作系统中最基本的概念,首先通过回忆操作系统课程中,关于单击系统中进程和进程通信的问题描述 ...
- Linux 进程通信fifo,Linux 进程通信之FIFO的实现
FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信. 创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkf ...
- Linux 进程通信之FIFO
FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信. ----创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int ...
最新文章
- 徒手撸出一个类Flask微框架(三)根据业务进行路由分组
- 关于Euclid算法
- 实现盒子动画和键盘特效
- 对等网不要求文件服务器,对等网文件共享技术研究与应用
- 7-14 排座位 (25 分)
- Kubernetes1.91(K8s)安装部署过程(一)--证书安装
- 支付宝推出“轻会员”;iPhone11 或将主动禁用双向无线充电;Java 13 发布 | 极客头条...
- Excel 如何解决下标越界问题
- win10使用nssm注册服务
- LTE无线网络规划的四大要点
- pc模仿移动端滚动条样式,好看就对了
- C语言信息学一本通题库答案,信息学奥赛一本通(C++版)在线评测系统
- 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?电脑添加双系统启动菜单的方法...
- 计网考点 无线局域网
- android 读build.prop,Android build.prop简介
- Echarts不显示X轴Y轴网格线
- play 认证相关的组件 silhouette
- 动图制作工具---LICEcap
- 开源的毕业设计—3D虚拟社区
- 求助!利用pycharm爬取拉勾网Python相关职位招聘信息,报错json.decoder.JSONDecodeError