首页
社区
课程
招聘
[旧帖] [求助]匿名管道pipe的问题 0.00雪花
发表于: 2011-12-30 21:24 1495

[旧帖] [求助]匿名管道pipe的问题 0.00雪花

2011-12-30 21:24
1495
以前没接触过,现在读代码时遇到了进程间匿名管道通信的问题,在网上找了一个例子,通过管道技术,将“dir c:\” 的信息输入到主进程中

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "kernel32.lib")
void main()
{
              SECURITY_ATTRIBUTES pipe;
        HANDLE hRead,hWrite;
       
        pipe.nLength = sizeof(SECURITY_ATTRIBUTES);
        pipe.lpSecurityDescriptor = NULL;
        pipe.bInheritHandle = TRUE;

        if (!CreatePipe(&hRead,&hWrite,&pipe,0)) {
                printf ("CreateProcess Error!\n");
                return;
        }
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        si.cb = sizeof(STARTUPINFO);
        GetStartupInfo(&si);
        si.hStdError = hWrite;
        si.hStdOutput = hWrite;
        si.wShowWindow = SW_HIDE;
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        if (!CreateProcess(NULL,"cmd.exe /c dir c:\\"
                ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
                printf ("CreateProcess Error!\n");
                return;
        }
        CloseHandle(hWrite);        //??????不理解
       
        char buffer[4096] = {0};
        DWORD bytesRead;
        while (true) {
                if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
                        break;
                puts(buffer) ;
                Sleep(200);
        }
}

其中的原文中讲到了下面的几句:“我们管道一端连在了新进程的标准输出端了,一端可以自己用API函数ReadFile读取了。等等,不对,我们的管道还有问题。我们把 hWrite给了hStdOutput和hStdError,那么在新的进程启动时就会在新进程中打开一个管道写入端,而我们在当前进程中使用了 CreatePipe创建了一个管道,那么在当前进程中也有这个管道的写入端hWrite。好了,这里出现了一个有两个写入端和一个读出端的畸形管道。这样的管道肯定是有问题的。由于当前进程并不使用写端,因此我们必须关闭当前进程的写端。这样,我们的管道才算真正的建立成功了。”

我的问题是还是不理解畸形管道是如何产生的?在新进程cmd中也会打开一个管道写入端吗?请大家分析一下,讲一下原理,谢谢了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2676
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果程序本身不关闭hWrite的话,使用ReadFile永远不能得到EOF,即便子进程关闭了管道的另一端,因为还有一个句柄是有效的,而这个就是那个需要关闭的hWrite。
2011-12-30 21:39
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
他描述为“畸形管道”本身就不切当吧,你别“认真”的去理解他。
我理解的是,windows很多类型句柄都可以复制的。
“畸形管道”的意思就像hWrite被复制了一个新的句柄值出来(或继承)到另一个进程中使用,两个句柄都可以写数据到管道中,实际操作的是同个管道端口。
一旦要关闭这个管道端口,就要把对应的句柄都关闭掉。
2011-12-30 22:37
0
雪    币: 221
活跃值: (40)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
当子进程cmd有了输出后写入管道,这时管道另一端管道读句柄hRead就自动有了数据结果吗?
因为其后使用ReadFile(hRead,buffer,4095,&bytesRead,NULL) 把结果写入buffer中

在其他程序中,主程序先创建2个线程,然后创建子进程,线程和进程是什么样的关系,就是tini后门的那个程序
2011-12-31 11:14
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
它这个说法有问题。

建议楼主看Windows NT高级编程

简单来说,一个双向的管道有2个句柄可用。
一个是读句柄,一个是写句柄。

在这个情况下,由于你不用写句柄只用读句柄,你就必须记得先关闭写句柄,要不然就是内核对象泄露了。

它那个说法是错误的。
2011-12-31 20:46
0
游客
登录 | 注册 方可回帖
返回
//