简介:

在本地,用父进程创建一个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进程通信(附源代码及编译好的程序,免费下载)相关推荐

  1. Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信

    一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...

  2. 为什么本地sqlservr.exe进程占用内存如此之大?

    机器配置: P4 3.0G64bit+ddr2 1G 环境: win2003 sp1 + sql server 2000 sp4 没有发现机器有中毒症状啊,大家的sql servr进程也是这样么? 转 ...

  3. 托盘图标在explorer.exe进程退出重启后图标消失(应用程序进程依然存在)的问题

    杀掉explorer进程后,windows taskbar也就没有了,托盘图标也就跟着消失了.当explorer进程重启,taskbar将会被创建,taskbar创建后会使用字符串"Task ...

  4. 利用钩子技术控制进程创建(附源代码)

    源码下载地址:http://download.csdn.net/detail/swanabin/6575541 一. 简介 最近,我了解到一个叫做Sanctuary的相当有趣的安全产品.它能够阻止任何 ...

  5. cmd.exe专杀工具

    症状:开机CPU就是100%,查进程,原来是cmd.exe 占用了绝大部分的CPU.关闭cmd.exe后,CPU实用率恢复正常.但是再次开机的时候,CPU又是100%,cmd.exe 依然占用了绝大部 ...

  6. cmd.exe病毒查杀(网络整理版)

    阿鱼终于中毒了!就是当今流行的cmd.exe,症状:CPU占有率达100%,资源管理器里出现CMD.EXE进程.还把阿鱼的各类上网工具的用户名和密码都盗走!用了多种查杀***工具,均未治愈. 本小生人 ...

  7. Linux进程通信(一)——pipe管道

    本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信 进程通信就是两个进程之间进行数据交换, ...

  8. TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念

    TCP与UDP协议初步学习--网络环境中分布式进程通信的基本概念 一.单机系统中进程通信方法 进程和进程通信是操作系统中最基本的概念,首先通过回忆操作系统课程中,关于单击系统中进程和进程通信的问题描述 ...

  9. Linux 进程通信fifo,Linux 进程通信之FIFO的实现

    FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信. 创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkf ...

  10. Linux 进程通信之FIFO

    FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信. ----创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int ...

最新文章

  1. 徒手撸出一个类Flask微框架(三)根据业务进行路由分组
  2. 关于Euclid算法
  3. 实现盒子动画和键盘特效
  4. 对等网不要求文件服务器,对等网文件共享技术研究与应用
  5. 7-14 排座位 (25 分)
  6. Kubernetes1.91(K8s)安装部署过程(一)--证书安装
  7. 支付宝推出“轻会员”;iPhone11 或将主动禁用双向无线充电;Java 13 发布 | 极客头条...
  8. Excel 如何解决下标越界问题
  9. win10使用nssm注册服务
  10. LTE无线网络规划的四大要点
  11. pc模仿移动端滚动条样式,好看就对了
  12. C语言信息学一本通题库答案,信息学奥赛一本通(C++版)在线评测系统
  13. 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?电脑添加双系统启动菜单的方法...
  14. 计网考点 无线局域网
  15. android 读build.prop,Android build.prop简介
  16. Echarts不显示X轴Y轴网格线
  17. play 认证相关的组件 silhouette
  18. 动图制作工具---LICEcap
  19. 开源的毕业设计—3D虚拟社区
  20. 求助!利用pycharm爬取拉勾网Python相关职位招聘信息,报错json.decoder.JSONDecodeError

热门文章

  1. 快速上手python websockets
  2. Python数学建模系列(九):回归
  3. 生意参谋 data 16进制数据解析还原
  4. 小程序直播送礼物svga展示
  5. Java - 类加载器
  6. java双向循环链表
  7. Matlab的dq变换模块到底选哪一种变换方式?90 degree behind phase A axis和 Aligned with phase A axis有什么区别?
  8. lldp协议代码阅读_LLDP协议、STP协议 笔记
  9. mac系统如何连接服务器地址,mac如何远程连接服务器地址
  10. Android项目(完整版+免费版)