最近在开发一个项目。需要PHP Sock连接到服务器中执行DOS 命令 , 所以想到了命名管道 CreatePipe 其函数原型
BOOL CreatePipe(
PHANDLE hReadPipe, // 指定一个变量,设为管道读入(输出)端的一个句柄
PHANDLE hWritePipe, // 指定一个变量,设为管道写入(输入)端的一个句柄
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 安全属性
DWORD nSize // 管道尺寸
);
该CreatePipe函数创建一个匿名管道,并返回句柄的读取和写入管道的末端。
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
string str= "cmd /k net user"; //命令行
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
//MessageBox("Error On CreatePipe()");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;//数据输出用的文件句柄
si.hStdOutput = hWrite;//数据输出用的文件句柄
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
OutputDebugString("1");
if (!CreateProcess(NULL,(char*)str.c_str()//执行cmd命令,并在命名中管道中写入cmd命令返回的串
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
//MessageBox("Error on CreateProcess()");
return FALSE;
}
CloseHandle(hWrite);
//OutputDebugString("2");
char buffer[4096] ={0} ;
DWORD bytesRead;
string strResult="";
while(1)
{
memset(buffer,0,4096);
if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
{
strResult += buffer;
cout << strResult;
OutputDebugString(buffer);
}
else
{
break;
}
}
CloseHandle(hRead);
0 条评论