想做一个 Hook CreateFile 重定向到内存的功能,貌似可以假借命名管道实现这个功能。不熟悉命名管道,做了几个demo,如下:

Server:

// NamedPipeServer.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hPipe = CreateNamedPipe(L"\\\\.\\Pipe\\mypipe",PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT
,PIPE_UNLIMITED_INSTANCES,,,NMPWAIT_WAIT_FOREVER,); //waiting to be connected
if(ConnectNamedPipe(hPipe, NULL) == NULL)
return ; DWORD dwWrite;
const char *pStr = "data from server";
if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) )
{
cout << "write failed..." << endl<< endl;
return ;
}
cout << "sent data: " << endl << pStr<< endl<< endl; system("pause");
return ;
}

Client:

// NamedPipeClient.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
#define BUFSIZE 5 int _tmain(int argc, _TCHAR* argv[])
{
if (WaitNamedPipe(L"\\\\.\\Pipe\\mypipe", NMPWAIT_WAIT_FOREVER) == FALSE)
return ; HANDLE hPipe=CreateFile(L"\\\\.\\Pipe\\mypipe", GENERIC_READ | GENERIC_WRITE, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -)
return ; BOOL fSuccess = false;
DWORD len = ;
char buffer[BUFSIZE];
string recvData = "";
do
{
fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL);
char buffer2[BUFSIZE+] = {};
memcpy(buffer2,buffer,len);
recvData.append(buffer2);
if(!fSuccess || len < BUFSIZE)
break;
}while(true); cout<<"recv data:"<<endl<<recvData.c_str()<<endl<<endl; FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe); system("pause");
return ;
}

Server & Client:

// MultiThreadDemo.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
#define BUFSIZE 5 DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
wstring* pipeName = static_cast<wstring*>(lpParam); HANDLE hPipe = CreateNamedPipe((*pipeName).c_str(),PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT
,PIPE_UNLIMITED_INSTANCES,,,NMPWAIT_WAIT_FOREVER,); //waiting to be connected
if(ConnectNamedPipe(hPipe, NULL) == NULL)
return ; DWORD dwWrite;
const char *pStr = "data from server";
if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) )
{
cout << "write failed..." << endl<< endl;
return ;
}
cout << "sent data: " << endl << pStr<< endl<< endl;
} int _tmain(int argc, _TCHAR* argv[])
{
wstring pipeName = L"\\\\.\\Pipe\\mypipe"; DWORD dwThreadID = ;
HANDLE hThread = CreateThread(NULL, , ThreadFunction, &pipeName , , &dwThreadID); Sleep(); if (WaitNamedPipe(pipeName.c_str(), NMPWAIT_WAIT_FOREVER) == FALSE)
return ; HANDLE hPipe=CreateFile(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -)
return ; BOOL fSuccess = false;
DWORD len = ;
char buffer[BUFSIZE];
string recvData = "";
do
{
fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL);
char buffer2[BUFSIZE+] = {};
memcpy(buffer2,buffer,len);
recvData.append(buffer2);
if(!fSuccess || len < BUFSIZE)
break;
}while(true); cout<<"recv data:"<<endl<<recvData.c_str()<<endl<<endl; FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe); system("pause");
return ;
}

C++ 命名管道示例的更多相关文章

  1. Linux进程间通信-命名管道

    前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...

  2. C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通 ...

  3. 命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

  4. 邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

    邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...

  5. c# c++通信--命名管道通信

    进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...

  6. shell 匿名管道和命名管道

    管道的特点:如果管道中没有数据,那么取管道数据的操作就会滞留,直到管道内进入数据,然后读出后才会终止这一操作:同理,写入管道的操作如果没有读取管道的操作,这一动作也会滞留. 1,匿名管道 匿名管道使用 ...

  7. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

  8. Windows进程间通信—命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将 ...

  9. Linux学习笔记(13)-进程通信|命名管道

    匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...

随机推荐

  1. 出去就餐并且理解Express.js的基本知识

    Going out to eat and understanding the basics of Express.js出去就餐并且理解Express.js的基本知识 原文:Going out to e ...

  2. MySQL之Foreign_Key

    MySQL之Foregin_Key 一\\一对多 一.员工表和部门表 dep emp 类似与我们将所有的代码都写在一个py文件内 确立标语表之间的关系 思路:一定要要换位思考问题(必须两方都考虑周全之 ...

  3. centos 7 安装 nginx 或 apache,及其比较

    来自 知乎 陈湛翀 的回答:https://www.zhihu.com/question/19571087/answer/12313829 nginx 和 apache 比较 nginx 相对 apa ...

  4. PAT Advanced 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  5. TFServering和docker

    nvidia-docker安装:https://github.com/NVIDIA/nvidia-docker nvidia-docker的基本操作:https://blog.csdn.net/pan ...

  6. git如何将本地文件关联到远程服务器

    很多时候,当我们关联git服务器的时候,本地都有可能会有一些开发的东西需要同步上去.那怎么样设置同步呢!跟我来做,简易配置: git本地关联远程项目:      第一步:选择目录           ...

  7. 常用windbg命令(转)

    1.查看版本信息:version.vertarget. 2.查看模块信息:lm.!dlls.!lmvi等. 3.调用栈:用k命令显示调用栈,用.frames命令切换栈帧. 4.内存操作:读内存用d命令 ...

  8. 作用域变量 var

    var没有块级作用域,定义后在当前闭包中都可以访问,如果变量名重复,就会覆盖前面定义的变量,并且也有可能被其他人更改. 变量名重复,就会覆盖前面定义的变量,并且也有可能被其他人更改: console. ...

  9. 自定义任务状态来操作FreeRTOS任务的挂起,恢复,删除

    osThreadState osState2;//自定义一个线程的状态 osThreadState 系统枚举定义如下: typedef enum { osThreadRunning = 0x0, /* ...

  10. DevExpress v18.2版本亮点——Analytics Dashboard篇(一)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...