C++ 命名管道示例
想做一个 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,0,0,NMPWAIT_WAIT_FOREVER,0); //waiting to be connected if(ConnectNamedPipe(hPipe, NULL) == NULL) return 0; DWORD dwWrite; const char *pStr = "data from server"; if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) ) { cout << "write failed..." << endl<< endl; return 0; } cout << "sent data: " << endl << pStr<< endl<< endl; system("pause"); return 0; }
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 0; HANDLE hPipe=CreateFile(L"\\\\.\\Pipe\\mypipe", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -1) return 0; BOOL fSuccess = false; DWORD len = 0; char buffer[BUFSIZE]; string recvData = ""; do { fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL); char buffer2[BUFSIZE+1] = {0}; 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 0; }
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,0,0,NMPWAIT_WAIT_FOREVER,0); //waiting to be connected if(ConnectNamedPipe(hPipe, NULL) == NULL) return 0; DWORD dwWrite; const char *pStr = "data from server"; if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) ) { cout << "write failed..." << endl<< endl; return 0; } cout << "sent data: " << endl << pStr<< endl<< endl; } int _tmain(int argc, _TCHAR* argv[]) { wstring pipeName = L"\\\\.\\Pipe\\mypipe"; DWORD dwThreadID = 0; HANDLE hThread = CreateThread(NULL, 0, ThreadFunction, &pipeName , 0, &dwThreadID); Sleep(1000); if (WaitNamedPipe(pipeName.c_str(), NMPWAIT_WAIT_FOREVER) == FALSE) return 0; HANDLE hPipe=CreateFile(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -1) return 0; BOOL fSuccess = false; DWORD len = 0; char buffer[BUFSIZE]; string recvData = ""; do { fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL); char buffer2[BUFSIZE+1] = {0}; 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 0; }
桂棹兮兰桨,击空明兮溯流光。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战