管道截获win 32 exe 的printf消息

本文介绍了一种通过创建管道并利用CreateProcess函数将子进程的标准输出和标准错误输出重定向到管道的方法,以此来获取子进程的输出。文章详细展示了如何设置SECURITY_ATTRIBUTES结构体、创建管道、配置STARTUPINFO结构体以及使用CreateProcess启动进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;


sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
{
return;

char command[1024]; //长达1K的命令行,够用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,para_sys);
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;
//关键步骤,CreateProcess函数参数意义请查阅MSDN



if (!CreateProcess(NULL, A2W(command),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 
{
CloseHandle(hWrite);
CloseHandle(hRead);
AfxMessageBox(_T("Feature Detection Failed!"));
return;
}
CloseHandle(hWrite);


char buffer[4096] = {0}; //用4K的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
DWORD bytesRead; 
while (true) 
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
AfxMessageBox(A2W(buffer)); //这里是弹出对话框显示
}
CloseHandle(hRead);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值