匿名管道的应用:首先在主程序中以主程序的读、写句柄建立一个匿名管道,然后在主程序中建立一个命令行进程,把命令行进程的写句柄给主程序,最后通过主程序的一个多线程函数从匿名管道中取出数据显示在主程序中。这样可以得到一个简陋的cmd程序的窗口版本。
以主程序的读、写句柄建立一个匿名管道:
SECURITY_ATTRIBUTES sa = {0} ;
sa.bInheritHandle = TRUE ;
sa.lpSecurityDescriptor = NULL ;
sa.nLength = sizeof(SECURITY_ATTRIBUTES) ;
if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0))
{
return ;
}
建立一个命令行进程:
PROCESS_INFORMATION pi = {0} ;
STARTUPINFO si = {0} ;
si.cb = sizeof(STARTUPINFO) ;
si.dwFlags=STARTF_USESTDHANDLES| STARTF_USESHOWWINDOW ;
si.hStdError = si.hStdOutput = m_hWrite ;
si.wShowWindow = SW_HIDE ;
TCHAR szCmdLine[500] = {0} ;
ZeroMemory(szCmdLine, 500) ;
GetSystemDirectory(szCmdLine, 500) ;
lstrcat(szCmdLine, TEXT("\\cmd.exe /c ")) ;
lstrcat(szCmdLine, szCmdBuf) ;
CloseHandle(m_PreProcHandle) ;
TerminateProcess(m_PreProcHandle, 0) ;
if(!CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
MessageBox(TEXT("创建进程失败!")) ;
}
创建一个多线程函数从匿名管道中取出数据显示在主程序中
m_ThreadHandle = CreateThread(NULL, 0, ShowCmdOutput, (LPVOID)pNode, 0, NULL) ;
do
{
bRet = PeekNamedPipe(hRead, NULL, 0, NULL, &dwTotalAvail, NULL) ;
if (bRet && dwTotalAvail > 0)
{
bReturn = ReadFile(hRead, szbuf, 4096, &dwReadLen, NULL) ;
if (bReturn && dwReadLen > 0)
{
lstrcat(szbufTemp, szbuf) ;
::SetWindowText(hwnd, szbufTemp) ;
}
}
Sleep(50) ;
}while(TRUE) ;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)