这种匿名管道,和读写文件类似。最好是一个进程读,一个进程写,适合单向通信,不适于双向通信,双向通信容易导致的问题是有可能,读到自己进程刚才写的内容。

纯手工代码,没有一丝拷贝

父进程代码:


// PipeServer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
#define BUFF_SIZE 1024



void Test()
{
SECURITY_ATTRIBUTES sec_handle = {0};
sec_handle.bInheritHandle = TRUE;
sec_handle.lpSecurityDescriptor = NULL;
sec_handle.nLength = sizeof(sec_handle);

HANDLE hReadPipe = INVALID_HANDLE_VALUE;
HANDLE hWritePipe = INVALID_HANDLE_VALUE;
BOOL bCrtPipeOk = CreatePipe(&hReadPipe,&hWritePipe,&sec_handle,BUFF_SIZE);
if(!bCrtPipeOk) return ;

STARTUPINFO siStartInfo;
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);

PROCESS_INFORMATION piProcInfo;
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );

TCHAR szCommandLine[256] = {0};
_stprintf_s(szCommandLine,_T("-hReadPipe %d -hWritePipe %d"),hReadPipe,hWritePipe);

if(!::CreateProcess(
_T("PipeClient.exe"),
szCommandLine,
NULL,
NULL,
TRUE,
0 | CREATE_NEW_CONSOLE,
NULL,
NULL,
&siStartInfo,
&piProcInfo))
{
int nError = ::GetLastError();
cout<<"创建进程失败:"<<nError<<endl;
return;
}


while(1)
{
char szReadBuf[BUFF_SIZE] = {0};
cout<<"Server Reading....."<<endl;
DWORD dwReaded = 0;
BOOL bRead = ::ReadFile(hReadPipe,szReadBuf,BUFF_SIZE,&dwReaded,NULL);
if(!bRead)
cout<<"ReadFile Error: "<<::GetLastError()<<endl;
else
wcout<<L"Readed content:"<<szReadBuf<<endl;


cout<<"Server Writeing ... "<<endl;
char szWrite[] = {"I'm Server"};
DWORD dwWritten = 0;
if(!::WriteFile(hWritePipe,szWrite,
sizeof(szWrite),
&dwWritten,
NULL))
{
cout<<"Server Write Error:"<<::GetLastError()<<endl;
}
else
cout<<"ServerWrite Ok!!!"<<endl;


Sleep(1000);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
system("pause");
return 0;
}





子进程  代码 


// PipeClient.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;

void Test(HANDLE hRead,HANDLE hWrite)
{
char szWrite[] = ("I'm Client!!");
DWORD dwWritten = 0;
cout<<"client now Write...."<<endl;
if(!::WriteFile(hWrite,
szWrite,
sizeof(szWrite),
&dwWritten,
NULL))
{
int nError = ::GetLastError();
cout<<"写文件出错:"<<nError<<endl;
return ;
}


cout<<"client write finished"<<endl;
char szRead[256] = {0};
DWORD dwReaded = 0;
cout<<"client start read......"<<endl;
if(!ReadFile(hRead,szRead,sizeof(szRead),&dwReaded,NULL))
{
int nError = ::GetLastError();
cout<<"读文件出错:"<<nError<<endl;
return ;
}
else
cout<<"client read:"<<szRead<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{

if(argc <= 1)
return 0;


HANDLE hReadPipe = (HANDLE) _tstoi(argv[1]);
HANDLE hWritePipe = (HANDLE) _tstoi(argv[3]);
//DebugBreak();
Test(hReadPipe,hWritePipe);
system("pause");
return 0;
}






本人新博客网址为:​​http://www.hizds.com​

作者:张东升 技术交流群:69148232

本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段。c++/lua/windows逆向交流群:69148232