使用CreateProcess函数实现隐秘的程序调用之二:使用匿名管道
2010-10-10 12:26
507 查看
// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
前一篇文章已经实现了基本功能,但有一个问题,就是需要读写硬盘上的文件。
如果实在不想读写文件,可以将进程启动信息中的输出重定向到一个匿名管道,再从管道中读取进程的输出即可。
界面和其余部分与上一篇提到的小例子相同。
// blackboycpp(AT)gmail.com
// QQ群: 135202158
前一篇文章已经实现了基本功能,但有一个问题,就是需要读写硬盘上的文件。
如果实在不想读写文件,可以将进程启动信息中的输出重定向到一个匿名管道,再从管道中读取进程的输出即可。
void CCPTFDlg::OnBnClickedBtnPing() { UpdateData(TRUE); BOOL bRet = FALSE; // 拼接要执行的命令行,如"ping.exe www.google.com" CString sAddr; GetDlgItem(IDC_EDIT_ADDR)->GetWindowText(sAddr); CString sCmdLine = _T("ping.exe ") + sAddr; // 设置管道句柄安全属性 SECURITY_ATTRIBUTES sa; ::ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; // 必须为TRUE sa.lpSecurityDescriptor = NULL; // 创建匿名管道 HANDLE hPipeRead, hPipeWrite; bRet = ::CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0); ASSERT(bRet == TRUE); // 设置进程的启动信息,这是一个输入参数 STARTUPINFO si; ::ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 这个必须设置,否则仍将显示窗口 si.hStdOutput = hPipeWrite; // 设置为写管道 si.wShowWindow = SW_HIDE; // 不显示窗口 // 设置进程信息,这是一个输出参数。我们需要从这个结构中取得创建成功的进程及其主线程的句柄 PROCESS_INFORMATION pi; ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); // 使用刚才设置的各个参数创建隐秘的进程 // 此进程将把ping程序运行的结果写到管道 bRet = ::CreateProcess(NULL, sCmdLine.GetBuffer(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); ASSERT(bRet == TRUE); // 等待进程对象的结束。即等待ping程序运行完成 ::WaitForSingleObject(pi.hProcess, INFINITE); // 结束进程 ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); // 从管道读取上述进程的输出,并显示于界面 char buffer[1024] = {0}; DWORD dwBytesRead; bRet = ::ReadFile(hPipeRead, buffer, 1023, &dwBytesRead, 0); ASSERT(bRet == TRUE); ASSERT(dwBytesRead > 0); GetDlgItem(IDC_EDIT_OUT)->SetWindowText(CString(buffer)); // 关闭管道 ::CloseHandle(hPipeRead); ::CloseHandle(hPipeWrite); }
界面和其余部分与上一篇提到的小例子相同。
相关文章推荐
- 使用CreateProcess函数实现隐秘的程序调用之二:使用匿名管道
- 使用CreateProcess函数实现隐秘的程序调用
- Linux:使用rpcgen实现64位程序调用32位库函数
- Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令
- JS自调用匿名函数具体实现
- Dll调用主程序(客户端、外部程序、宿主)函数的实现
- 转:使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 调用实现使用popen()函数获取其他Console中的内容
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- C程序使用不同函数调用约定调用汇编子过程
- 飘逸的python - 几行代码实现unix管道风格的函数调用
- 问题九:编写函数stringcat,实现字符串的连接,程序中需要使用指针形式访问字符串
- 使用sql Server 的函数功能返回 表,方便在程序中调用
- C#中使用托管C++类,委托调用,以供托管C++类的成员函数回调的实现方式
- 使用匿名管道双向通讯的方式,实现pc端和Android端通讯。
- pvtrace和Graphviz实现对linux下C程序的函数调用跟踪
- Python使用django框架实现多人在线匿名聊天的小程序
- 程序启动时对于不同函数的调用过程在windows平台下的实现
- 使用JNI技术实现JAVA程序调用dll
- 使用CreateProcess函数运行其他程序