• 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;
    }
  • 相关阅读:
    motion
    Owe Her
    优于自己的过去
    eclipse中开发js会卡,去掉.project中的validate即可
    项目经理的责任
    话不说满_话不说绝_要给自己留后路_留余地
    create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;
    Introduction to Mathematical Thinking
    coursera 《现代操作系统》 -- 第十三周 期末考试
    coursera 《现代操作系统》 -- 第十一周 IO系统
  • 原文地址:https://www.cnblogs.com/nanfei/p/10858307.html
Copyright © 2020-2023  润新知