15,471
社区成员
发帖
与我相关
我的任务
分享
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道
UINT __stdcall sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联
{
char Buff[SEND_BUFF_SIZE];
TCHAR sendBuff[SEND_BUFF_SIZE];
SECURITY_ATTRIBUTES sa;
sa.nLength=12;
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=true;
int ret;
if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道
{
return -1;
}
if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
{
return -1;
}
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
TCHAR cmdLine[256] = {0};
GetSystemDirectory(cmdLine,sizeof(cmdLine));
wcscat(cmdLine,L"\\cmd.exe");
PROCESS_INFORMATION ProcessInformation;
if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
{
return -1;
}
unsigned long lBytesRead;
Sleep(100);
while(TRUE) //开始循环读取或写入信息
{
ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
if(lBytesRead)
{
//第一次可以读到cmd的初始化信息
ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
if(!ret)
break;
//如果读到数据,则对数据进行下一步处理。。。。。。。
}
else
{
if(!WriteFile(hWritePipe2,L"dir",sizeof(L"dir"),&lBytesRead,0))
{
return -1;
}
//这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0
}
}
return 0;
}
if(!WriteFile(hWritePipe2,Buff,sizeof(Buff),&lBytesRead,0))
{
return -1;
}
int errcode = GetLastError();
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道
UINT __cdecl sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联
{
TCHAR Buff[SEND_BUFF_SIZE] = {0};
TCHAR sendBuff[SEND_BUFF_SIZE] = _T("dir \n");
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=true;
int ret;
if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道
{
return -1;
}
if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
{
return -1;
}
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
TCHAR cmdLine[256] = {0};
GetSystemDirectory(cmdLine,sizeof(cmdLine));
_tcscat(cmdLine, _T("\\cmd.exe"));
PROCESS_INFORMATION ProcessInformation;
if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
{
return -1;
}
unsigned long lBytesRead;
Sleep(100);
while(TRUE) //开始循环读取或写入信息
{
ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
if(lBytesRead)
{
//第一次可以读到cmd的初始化信息
memset(Buff, 0, sizeof(Buff));
ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
if(!ret)
break;
//如果读到数据,则对数据进行下一步处理。。。。。。。
}
else
{
if(!WriteFile(hWritePipe2, sendBuff,sizeof(sendBuff),&lBytesRead,0))
{
return -1;
}
//这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0
}
AfxMessageBox(CString(Buff));
}
return 0;
}