|
5鱼币
本帖最后由 杞人 于 2013-6-1 13:28 编辑
今天写了一段CMD回显的程序,是用C语言写的也就是控制台程序,苦逼的是只能显示
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp
D:\桌面数据\TEST程序\EXE\EXE\Debug>
然后无论我打什么命令都是
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp
D:\桌面数据\TEST程序\EXE\EXE\Debug>
好痛苦啊调试了一早上,代码改的乱七八糟
自能来这里求助了
- #include <stdio.h>
- #include <windows.h>
- #define nops _asm nop
- void main()
- {
- while (1)
- {
- HANDLE m_hReadPipeHandle; //度管道句柄
- HANDLE m_hWritePipeHandle; //写管道句柄
- HANDLE m_hReadPipeShell;
- HANDLE m_hWritePipeShell;
- SECURITY_ATTRIBUTES sa = {0};
- sa.nLength = sizeof(sa);
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = TRUE;
- //创建管道
- if(!CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0))
- {
- if(m_hReadPipeHandle != NULL) CloseHandle(m_hReadPipeHandle);
- if(m_hWritePipeShell != NULL) CloseHandle(m_hWritePipeShell);
- return;
- }
- if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0))
- {
- if(m_hWritePipeHandle != NULL) CloseHandle(m_hWritePipeHandle);
- if(m_hReadPipeShell != NULL) CloseHandle(m_hReadPipeShell);
- return;
- }
- STARTUPINFO si = {0};
- GetStartupInfo(&si);
- si.cb = sizeof(STARTUPINFO);
- si.wShowWindow = SW_HIDE;
- si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
- si.hStdInput = m_hReadPipeShell; //这里指定cmd的输出管道
- si.hStdOutput = si.hStdError = m_hWritePipeShell; //这里指定cmd输入管道
- char strShellPath[MAX_PATH];
- ZeroMemory(strShellPath,MAX_PATH);
- GetSystemDirectory(strShellPath,MAX_PATH);
- strcat(strShellPath,"\\cmd.exe");//如果是一个\cmd.exe,会错误
- HANDLE m_hProcessHandle; //进程句柄
- PROCESS_INFORMATION pi = {0};
- memset((void *)&pi, 0, sizeof(pi));
- //用si 参数创建进程 就是说指定了他的输入输出
- if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
- NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
- {
- CloseHandle(m_hReadPipeShell);
- CloseHandle(m_hWritePipeShell);
- return;
- }
- m_hProcessHandle = pi.hProcess;
- //CreateProcess()
- char m_strCmd[MAX_PATH]={0,0};
- DWORD dword=0;
- OVERLAPPED a;
- a.Internal=0;
- a.InternalHigh=0;
- a.Offset=0;
- a.OffsetHigh=0;
- a.hEvent=0;
- scanf("%s",&m_strCmd);
- WriteFile(m_hWritePipeHandle,m_strCmd,sizeof(m_strCmd)-1,&dword,&a);
- //写人管道
- //=======读==========================
- unsigned long BytesRead = 0;
- char ReadBuff[1024];
- DWORD TotalBytesAvail;
- //管道缓冲区是否有数据
- PeekNamedPipe(m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL);
- memset(ReadBuff, 0, sizeof(ReadBuff));
- //分配空间
- LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, TotalBytesAvail+1);
- ZeroMemory(lpBuffer,TotalBytesAvail+1);
- //读取缓冲空间的数据
- ReadFile(m_hReadPipeHandle, lpBuffer, TotalBytesAvail, &BytesRead, NULL);
- // 发送数据
- printf("%s",(char*)lpBuffer);
- ZeroMemory(m_strCmd,MAX_PATH);
- ZeroMemory(lpBuffer,TotalBytesAvail+1);
- }
- }
复制代码
|
-
|