远程执行CMD命令部分代码

/******************************************************************************
 下面代码创建了一个子进程(cmd.exe),并且把cmd.exe的标准输入用第二个管道的
 读句柄替换。cmd.exe的标准输出和标准错误输出用第一个管道的写句柄替换。
 这两个管道的逻辑示意图如下:
   读hReadPipe1      写hWritePipe1
 (父进程)    read<---〔管道一〕<---write  标准输出(cmd.exe子进程)
   
   写hWritePipe2      读hReadPipe2
 (父进程)   write--->〔管道二〕--->read   标准输入(cmd.exe子进程)

 函数参数: 返回读写管道和建立的进程句柄(在CHCCDlg类里定义这几个全局变量)
******************************************************************************/
BOOL CreateCMD(HANDLE &hReadPipe1,HANDLE &hWritePipe1,//匿名管道1读写句柄
     HANDLE &hReadPipe2,HANDLE &hWritePipe2,//匿名管道2读写句柄
     HANDLE &hProcess)//创建的CMD.EXE进程句柄
{
 BOOL ret;  
 SECURITY_ATTRIBUTES sa;
 sa.nLength=12;sa.lpSecurityDescriptor=0;sa.bInheritHandle=true;
 ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);
 if (!ret) {
  return FALSE;
 }
 ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);
 if (!ret) {
  return FALSE;
 }

 STARTUPINFO si;
 ZeroMemory(&si,sizeof(si));
 si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
 si.wShowWindow = SW_HIDE;

 //将其标准输入设置为hReadPipe2
 //将其标准输出和错误输出设置为hWritePipe1
 //通信逻辑见上图
 si.hStdInput = hReadPipe2;
 si.hStdOutput = si.hStdError = hWritePipe1;
 char cmdLine[] = "cmd.exe";
 PROCESS_INFORMATION ProcessInformation;
 ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
 if (!ret) {
  return FALSE;
 }
 hProcess=ProcessInformation.hProcess;
 return TRUE;
}

//****************************************************************************
//此函数用来写已建立的管道
BOOL WriteCMD(CString cmdBuffer,HANDLE hWritePipe2){
 DWORD lBytesWrite;
 cmdBuffer+="/r/n";
 if (!WriteFile(hWritePipe2,(LPTSTR)(LPCTSTR)cmdBuffer,cmdBuffer.GetLength(),&lBytesWrite,NULL)) {
  return FALSE;
 }
 return TRUE;
}
//****************************************************************************
//此函数用来读已建立的管道
BOOL ReadCMD(HANDLE hReadPipe1,CString &cmdResult){
 BOOL ret;
 DWORD lBytesRead;
 char *buffer=new char [1024];
 while(true){
  memset(buffer,0,1024);
  ret=ReadFile(hReadPipe1,buffer,1023,&lBytesRead,0);
  if (!ret) {
   delete buffer;
   return FALSE;
  }
  buffer[lBytesRead]='/0';
  cmdResult += buffer;
  if(buffer[lBytesRead-1]=='>') {
   delete buffer;
   return TRUE;
  }
 }
 delete buffer;
 return TRUE;
}
//*****************************************************************************
//此函数用来关闭管道
void CloseCMD(HANDLE hReadPipe1,HANDLE hWritePipe1,//匿名管道1读写句柄
     HANDLE hReadPipe2,HANDLE hWritePipe2,//匿名管道2读写句柄
     HANDLE hProcess)//创建的CMD.EXE进程句柄
{
 CloseHandle(hReadPipe1);
 CloseHandle(hWritePipe1);
 CloseHandle(hWritePipe2);
 CloseHandle(hReadPipe2);
 TerminateProcess(hProcess,0);
}
//*****************************************************************************
//此函数用来清空管道数据
void EmptyPipe(HANDLE hReadPipe1){
 BOOL ret;
 DWORD bytesRead;
 char *buffer=new char [1024];
 while(true){
  memset(buffer,0,1024);
  ret=PeekNamedPipe(hReadPipe1,buffer,1024,&bytesRead,0,0);
  if (bytesRead==0||!ret) {
   delete buffer;
   return;
  }
  ReadFile(hReadPipe1,buffer,bytesRead,&bytesRead,0);
 }

//以上函数只需在SOCKET的OnReveive( )函数中调用便可以方便的开一个远程SHELL执行命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值