WindowsAPI 之 CreatePipe、CreateProcess

时间:2022-10-21 14:32:06
  • MSDN介绍

CreatePipe

A pipe is a section of shared memory that processes use for communication. The process that creates a pipe is the pipe server. A process that connects to a pipe is a pipe client. One process writes information to the pipe, then the other process reads the information from the pipe. This overview describes how to create, manage, and use pipes.

管 道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
BOOL WINAPI CreatePipe(
_Out_ PHANDLE hReadPipe,
_Out_ PHANDLE hWritePipe,
_In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
_In_ DWORD nSize
);

Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

CreatePipe creates the pipe, assigning the specified pipe size to the storage buffer. CreatePipe also creates handles that the process uses to read from and write to the buffer in subsequent calls to the ReadFile and WriteFile functions.

To read from the pipe, a process uses the read handle in a call to the ReadFile function. ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs.

When a process uses WriteFile to write to an anonymous pipe, the write operation is not completed until all bytes are written. If the pipe buffer is full before all bytes are written, WriteFile does not return until another process or thread uses ReadFile to make more buffer space available.

Anonymous pipes are implemented using a named pipe with a unique name. Therefore, you can often pass a handle to an anonymous pipe to a function that requires a handle to a named pipe.

If CreatePipe fails, the contents of the output parameters are indeterminate. No assumptions should be made about their contents in this event.

To free resources used by a pipe, the application should always close handles when they are no longer needed, which is accomplished either by calling the CloseHandle function or when the process associated with the instance handles ends. Note that an instance of a pipe may have more than one handle associated with it. An instance of a pipe is always deleted when the last handle to the instance of the named pipe is closed.

CreateProcess

Creates a new process and its primary thread. The new process runs in the security context of the calling process.
BOOL WINAPI CreateProcess(
_In_opt_ LPCTSTR lpApplicationName,
_Inout_opt_ LPTSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
  • 先简单介绍一下重定向

stdin是标准输入,stdout是标准输出,stderr是标准错误输出。大多数的命令行程序从stdin输入,输出到stdout或 stderr,有时我们需要重定向stdout,stderr,stdin。比如:将输出写入文件,又或者我们要将命令行程序输出结果显示到 Windows对话框中。

在Windows编程中,重定向需要用到管道(Pipe)的概念。管道是一种用于在进程间共享数据的机制。一个管道类似于一个管子的两端,一端是写入的,一端是读出的。由一个进程从写入端写入、另一个进程从读出端读出,从而实现通信,就向一个“管道”一样。

重定向的原理是:

首先声明两个概念:主程序(重定向的操纵者)、子进程(被重定向的子进程)

如果要重定位stdout的话,先生成一个管道, 管道的写入端交给子进程去写,主程序从管道的读出端读数据,然后可以把数据写成文件、显示等等。重定向stderr和stdout是相同的。

同理,要重定向stdin的话,生成一个管道, 管道的写入端由主程序写,子进程从管道的读出端读数据。

其中需要用到几个Windows API :  CreatePipe, DuplicateHandle, CreateProcess, ReadFile, WriteFile 等,函数详解可参见MSDN.

比如一个控制台程序打印一行文字:

aaarticlea/png;base64,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" alt="" />

会在windows弹出的对话框中输出:

aaarticlea/png;base64,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" alt="" />

为什么会输出到这里而不是别的地方呢?因为这里就是所说的StdOut(标准输出)的地方。如果你想输出到别的地方,那就得把stdout重定向到别的地方才行。

比如,某网友写了一个重定向程序将stdout重定向到自己写的一个窗口中,就会产生如下的效果:

aaarticlea/png;base64,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*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PI6LFYvHEXmptoepNfQlVVVVFRUX0Xzpmujmjb8f2Guj0q70mT54cHByclZUFAFu3bkWXdkM/2SsoKOjWW28NDw8HgKSkJDxDlzmv2Ovqq6+uqqpS96TC2bBhw9///ndEpCvIrl27VKtpGTx4MAA89NBD9IZae1GBpKWlAcDGjRsREQAmT56MiI8++igAIGJKSgoAfPvtt/TsAw88sGPHDgDIzs5GxKioqF7Yi56i837jjTfSB7ktGVcGoL2oPp9zzjl0xX/qqacAQJbl7OxsAPjyyy8REQCuueYaRPzrX/96SnuVl5cDwNKlSxExODiYbllWrFhBVdRoNALAqlWrEPG888679NJLEfHFF18EAKvVeuTIkTvvvBMRrVbrzJkzv//++yVLlrz00kvffvutk72ys7OvvvpqRHzooYfUekiQlm6//XZ015xqamoiRyLibbfdFhoaOmPGDLU0qqurqYqyvRjEfrbXNddcExgYiIifffYZAGRmZtKzH3zwAV1tW1tbqYbdf//99AtBR02dOHEiADz77LN0j3nxxRfn5uZqf1rUt+6kQ/qJDh8+PCQkBBGffPJJAKipqVGPAQCCg4PVI5w6dSo9+OKLL9JHA8DMmTMR8d5776VrK11xgoKC6If3pz/9iT7rd7/7Hb32nXfeQcSGhgb6L7VRioqKEHHz5s30WrpxJuUg4qhRo9S76bi4OESMjY1VWzb0pTxpe5G91q1b98QTTyDi+PHjSZOPPvroF198gYgRERF33HEHlYzZbAaARYsWoWNIoBt7ObXhAICuUPPnz6diIXvRN62vr+/KXu3t7XTw9LekpAQROzs78WR70Ym76KKL6D0///xzejwmJkb9yhdffDE9+MgjjwAAfQX6FEVRzj77bPXiSDVt9+7d9EhQUBBd05cvXw4AjY2NZWVlALBmzRpEPOecc8aOHYuIzz//PABUVlYi4hdffEFHcsEFF6i15frrr6cHn332WTqSyspK9TympaXRg++99x7tRm9LBXLllVcCwNChQ1Xl010dfTWqLYj46quvAgDdryiKQsVy1lln3XLLLT/99BO9bUdHB9lr//799913n3pqSBXFxcVqfZZlGQBuueUWtcz7Yq+oqKinn376X//61zfffDN//vxvv/22K3v1YtZGL+zVzbjXkSNHEPHo0aP0oC4hAdHC416i4bP2Gj1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*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" alt="" />

  • 先详细介绍一下管道,这里以匿名管道为例:

第一:匿名管道只能实现本地进程之间的通信,不能实现跨网络之间的进程间的通信。

第二:匿名管道只能实现父进程和子进程之间的通信,而不能实现任意两个本地进程之间的通信。

匿名管道主要用于本地父进程和子进程之间的通信,在父进程中的话,首先是要创建一个匿名管道,在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄,然后父进程就可以向这个匿名管道中写入数据和读取数据了,但是如果要实现的是父子进程通信的话,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄,因为在子进程中必须要使用父进程创建的匿名管道的读写句柄,通过这个匿名管道才能实现父子进程的通信,所以必须继承父进程的公开句柄。同时在创建子进程的时候,必须将子进程的标准输入句柄设置为父进程中创建匿名管道时得到的读管道句柄,将子进程的标准输出句柄设置为父进程中创建匿名管道时得到的写管道句柄。然后在子进程就可以读写匿名管道了。

  • 下面来讲CreatePipe:

CreatePipe时会获取两个句柄,一个是读句柄,一个是写句柄(这里的读句柄表示要从哪里读取数据,写句柄表示要把数据写到哪里)。

父进程可以调用进程创建函数CreateProcess()生成子进程。如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管 道(传递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据。(如果是父进程从子进程读取数据,那么由子进程调用GetStdHandle()取得管道的写入句柄,并调用WriteFile()将数据写入到管道。然后,父进程调用ReadFile()从管道读取出数据(传递管道读句柄给函数))//GetStdHandle()是由子进程调用

在 用WriteFile()函数向管道写入数据时,只有在向管道写完指定字节的数据后或是在有错误发生时函数才会返回。如管道缓冲已满而数据还没有写 完,WriteFile()将要等到另一进程对管道中数据读取以释放出更多可用空间后才能够返回。管道服务器在调用CreatePipe()创建管道时以 参数nSize对管道的缓冲大小作了设定。
   匿名管道并不支持异步读、写操作,这也就意味着不能在匿名管道中使用ReadFileEx()和WriteFileEx()(它只能用于异步读写文件操作,异步操作完成后会调用指定的回调函数),而且ReadFile() 和WriteFile()中的lpOverLapped参数也将被忽略。匿名管道将在读、写句柄都被关闭后退出,也可以在进程中调用 CloseHandle()函数来关闭此句柄(个人理解就是,匿名管道,只能是你全部往管道中读写完之前,就不能干别的事,只能写或等待(管道满的时候处在等待状态);而子进程在全部接收完管道的数据之前也只能读或等待(没数据时等待),也不能去干其它的事)。

根据上边API的原型,通过hReadPipe和hWritePipe所指向的句柄可分别以只读、只写的方式去访问管道。在使用匿名管道通信时,服务器进程(父进程)必须将其中的一个句柄传送给客户机进程。句柄的传递多通过继承来完成(如何继承?请往下看),服务器进程也允许这些句柄为子进程所继承。

在调用CreatePipe()函数时,如果管道服务器将lpPipeAttributes 指向的SECURITY_ATTRIBUTES数据结构的数据成员bInheritHandle设置为TRUE,那么CreatePipe()创建的管道读、写句柄将会被继承(管道服务器可调用DuplicateHandle()函数改变管道句柄的继承。管道服务器可以为一个可继承的管道句柄创建一个不可 继承的副本或是为一个不可继承的管道句柄创建一个可继承的副本。CreateProcess()函数还可以使管道服务器有能力决定子进程对其可继承句柄是 全部继承还是不继承)。

在生成子进程之前,父进程首先调用Win32 API SetStdHandle()使子进程、父进程可共用标准输入、标准输出和标准错误句柄(StdOut、StdIn、StdErr)。当父进程向子进程发送数据时,用SetStdHandle()将 管道的读句柄赋予标准输入句柄(这样就不会从标准输入读入数据,而从读句柄所表示的位置读取数据);在从子进程接收数据时,则用SetStdHandle()将管道的写句柄赋予标准输出(或标准错误)句柄。然后,父进程可以调用进程创建函数CreateProcess()生成子进程。如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管道(传 递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据。//SetStdHandle()是由父进程调用

  • 举例:
#include <iostream>
#include <windows.h>
#include <Shlwapi.h> using namespace std; #define BUFSIZE 4096 int main()
{
BOOL bRet = FALSE;
DWORD dwRead = ;
DWORD dwAvail = ;
char cbBuf[] = { };
HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
char *pCommandLine = new TCHAR[0x200];//
char szPath[] = "C:\\Windows\\System32\\calc.exe";
CreatePipe(&hReadPipe, &hWritePipe, &sa, );
STARTUPINFO si = { };
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
PROCESS_INFORMATION pi = { }; memset(pCommandLine, , sizeof(szPath));
lstrcpy(pCommandLine, szPath); if (!CreateProcess(NULL, pCommandLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))//创建子进程
{
if (pCommandLine)
delete pCommandLine; CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe); return ;
}
std::string strResult;
do
{
cout << "test.." << endl;
if (!PeekNamedPipe(hReadPipe, NULL, NULL, &dwRead, &dwAvail, NULL) || dwAvail <= )//PeekNamePipe用来预览一个管道中的数据,用来判断管道中是否为空
{
break;
}
if (ReadFile(hReadPipe, cbBuf, BUFSIZE, &dwRead, NULL))//这里是读管道,即便已经没有数据,仍然会等待接收数据,因为,子进程会认为父进程仍有数据要发送,只是暂时没法送,
{ //所以,会“卡”在这里。所以才需要PeekNamePipe
if (dwRead == )
break;
cout << dwRead << endl;
cout << cbBuf << endl;
}
} while (TRUE); if (pCommandLine)
delete pCommandLine;
cout << "delete" << endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe); return ;
}
  • 参考:
 一篇比较好的参考文章: