用途
-
调用外部命令来协助完成某些功能
-
如很多扫描工具实际上是调用nmap来帮助扫描任务的
#include <stdio.h>
//#include <string.h>
#include <windows.h>
int main(int argc,char *argv[])
{
SECURITY_ATTRIBUTES sa; //保存设定管道的安全属性
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; //安全描述符
sa.bInheritHandle = TRUE; //安全描述的对象能否被新创建的进程继承
if (!CreatePipe(&hRead,&hWrite,&sa,0)) //创建一个匿名管道
{
printf("Error On CreatePipe()");
return -1;
}
STARTUPINFO si; //用于指定新进程的主窗口特性的一个结构
PROCESS_INFORMATION pi; //构返回有关新进程及其主线程的信息
si.cb = sizeof(STARTUPINFO);//包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段
GetStartupInfo(&si); //取得进程在启动时被指定的 STARTUPINFO 结构
//hWrite为匿名管理写入句柄
si.hStdError = hWrite; //错误输出写入匿名管道
si.hStdOutput = hWrite; //标准输出写入匿名管道
//si.hStdInput //标准输入,这里没用到
si.wShowWindow = SW_HIDE; //隐藏窗口
si.dwFlags = STARTF_USESHOWWINDOW | //使用wShowWindow 成员(用于隐藏窗口)
STARTF_USESTDHANDLES; //使用hStdInput 、hStdOutput和hStdError成员(重定向到匿名管道)
if (!CreateProcess(NULL,"C:\\windows\\system32\\cmd.exe /c dir /?"//创建进程
,NULL,NULL,TRUE,(DWORD)NULL,NULL,NULL,&si,&pi))
{
printf("Error on CreateProcess()");
return -2;
}
CloseHandle(hWrite); //关闭匿名管道写入
//char str[40960] = {0};
char buffer[4096] = {0}; //用于保存输出信息
DWORD bytesRead;
printf("################################################################################\n");
while (TRUE)
{
if (!ReadFile(hRead,buffer,4095,&bytesRead,NULL))//读取匿名管道信息
break;
//strcpy(str,buffer);
printf("%s\n",buffer);
}
//printf("%s\n",str);
CloseHandle(hRead);
return 0;
}