用途
-
調用外部命令來協助完成某些功能
-
如很多掃描工具實際上是調用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;
}