社区
C++ 语言
帖子详情
匿名管道句柄使用DuplicateHandle行不通??
RabbitLBJ
2011-03-07 06:20:52
非父子进程,自己传递句柄,复制。总是在调用DuplicateHandle时候失败。如果复制的是个普通文件句柄则成功。难道非父子进程真的不能用匿名管道了吗??
...全文
154
6
打赏
收藏
匿名管道句柄使用DuplicateHandle行不通??
非父子进程,自己传递句柄,复制。总是在调用DuplicateHandle时候失败。如果复制的是个普通文件句柄则成功。难道非父子进程真的不能用匿名管道了吗??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xuhaibo86
2011-11-03
打赏
举报
回复
我想通过调用adb。exe 这个控制台程序多次执行shell 命令,但是执行完第二条命令,再次通过writefile输入的时候就无法执行,通过readFile 读出的数据是第三次写入的数据。
源码。。。
char szconmand[MAX_PATH]={0};
HANDLE stdOutPipeRd,stdOutPipeWt,stdInPipeWt,stdInPipeRd;
STARTUPINFOA startUp;
SECURITY_ATTRIBUTES lpSecurity, lpSec2;
PROCESS_INFORMATION processInfo;
lpSecurity.nLength=sizeof(SECURITY_ATTRIBUTES);
lpSecurity.lpSecurityDescriptor=NULL;
lpSecurity.bInheritHandle=true;
if (!CreatePipe(&stdOutPipeRd,&stdOutPipeWt,&lpSecurity,0))
{
DWORD err=GetLastError();
return -1;
}
lpSec2.nLength=sizeof(SECURITY_ATTRIBUTES);
lpSec2.bInheritHandle=true;
lpSec2.lpSecurityDescriptor=NULL;
if (!CreatePipe(&stdInPipeRd,&stdInPipeWt,&lpSec2,0))
{
DWORD err=GetLastError();
return -1;
}
memset(&startUp,0,sizeof(STARTUPINFOA));
GetStartupInfoA(&startUp);
startUp.cb=sizeof(STARTUPINFOA);
startUp.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
startUp.wShowWindow=HIDE_WINDOW;
startUp.hStdInput=stdOutPipeRd;
startUp.hStdOutput=stdInPipeWt;
startUp.hStdError=stdInPipeWt;
char str[MAX_PATH]={0};
strcpy(str,"adb.exe shell");
char *pdata=NULL;
pdata=(char*)malloc(strlen(str)+strlen(szconmand));
if (pdata==NULL)
{
return -1;
}
memset(pdata,0,strlen(str)+strlen(szconmand));
int n=0;
n=strlen(str);
int k=strlen(szconmand);
memcpy(pdata,str,sizeof(str));
memcpy(pdata+n," ",sizeof(char));
memcpy(pdata+n+1,szconmand,k);
if (!CreateProcessA(NULL,str,NULL,NULL,TRUE,0,NULL,NULL,&startUp,&processInfo))
{
DWORD err=GetLastError();
return -1;
}
DWORD stdlen=0;
char szbuffer[MAX_PATH]={0};
while (true)
{
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL))
{
DWORD err=GetLastError();
return -1;
}
memset(szbuffer,0,MAX_PATH);
char sqlCommand[MAX_PATH]={0};
strcpy(sqlCommand,"sqlite3 /data/data/com.android.providers.telephony/databases/mmssms.db\r\n");//程序执行到这还是正常的
if (!WriteFile(stdOutPipeWt,sqlCommand,strlen(sqlCommand)+1,&stdlen,0))
{
DWORD erro=GetLastError();
return -1;
}
memset(szbuffer,0,MAX_PATH);
while (true)
{
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL))//独处正常执行结果
{
DWORD err=GetLastError();
return -1;
}
//memset(szbuffer,0,MAX_PATH);
memset(sqlCommand,0,MAX_PATH);
strcat(szbuffer,"select * from sms;\r\n");
if (!WriteFile(stdOutPipeWt,sqlCommand,strlen(sqlCommand),&stdlen,0))//这次写入的命令,在读的时候是原封不动的被读出来了,没有执行。只能执行两次命令,,,为什么?
{
DWORD erro=GetLastError();
return -1;
}
Sleep(5000);
while (true)
{
memset(szbuffer,0,MAX_PATH);
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,1024,&stdlen,NULL))
{
DWORD err=GetLastError();
return -1;
}
RabbitLBJ
2011-03-08
打赏
举报
回复
自己顶!!!
RabbitLBJ
2011-03-07
打赏
举报
回复
求教高人,能解释下原因吗??还是复制匿名管道句柄和普通的不一样。
按理说匿名管道句柄属于内核对象,应该是可以跨进程访问的啊!!
RabbitLBJ
2011-03-07
打赏
举报
回复
DUP的时候是传递的和原句柄相同的权限。普通文件句柄传这个权限就可以打开。
我是在本机通行的,而且是只传递READ句柄给另外的进程,主进程只负责发送。
但是好像DUP总是失败。
nickliwei
2011-03-07
打赏
举报
回复
匿名管道只能在父子进程之间进行通信,不能在网络间进行通信,而且数据传输是单向的,只能一端读,一端写。命名管道可以在任意进程之间进行通信,而且数据传输是双向的。
look_back
2011-03-07
打赏
举报
回复
你的权限呢?父子进程是一种共享资源,其他进行需要提升权限
Dupli
cat
e
Handle
进程间
句柄
复制
BOOL
Dupli
cat
e
Handle
(
HANDLE
hSourceProcess
Handle
,
HANDLE
hSource
Handle
,
HANDLE
hTargetProcess
Handle
, LP
HANDLE
lpTarget
Handle
, DWORD dwDesiredAccess, BOOL bInherit
Handle
, DWORD dwOpt
句柄
详解,什么是
句柄
?
句柄
有什么用?
最近在做项目时遇到了
句柄
的概念,之前只知道在编译原理里有
句柄
的概念,在实际的编程时会经常用到
句柄
。 参考地址:https://www.cnblogs.com/zpcdbky/p/4652151.html 这里需要说明: 1.这里将
句柄
所能标识的所有...
Centos 7 中的ulimit -n 65535 对进程的文件
句柄
限制不生效??
Centos 7 中的ulimit -n 65535 对进程的文件
句柄
限制不生效?? 转载自 https://www.cnblogs.com/linuxk/p/11989559.html 今日闲来无事,就看群里大佬吹牛逼了,偶然一条技术疑问提出来了,神奇啊,作为广大老司机...
[C++]
匿名
管道
的理解与实现
相对于命名
管道
,其占用小实现简单,在特定情况下,比如实现两围棋引擎本地对战可以
使用
匿名
管道
。 怎样实现
匿名
管道
双向通信? 由于
匿名
管道
是单工的,所以为实现父子进程双向通信需要创建两根
管道
,并由子进程...
获得线程或者进程的真实
句柄
的方法
一个方法是
使用
dupli
cat
e
Handle
把伪
句柄
转化程实
句柄
Dupli
cat
e
Handle
原本是进程间复制
句柄
的函数,原理其实很简单把一个进程的
句柄
复制到另一个进程
句柄
表 在这里我们要说下,什么是伪
句柄
,伪
句柄
返回了对象的...
C++ 语言
64,653
社区成员
250,478
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章