ちょっとびっくりな情報を見つけました。winapi – How can I get a list of all open named pipes in Windows? – Stack Overflowに名前付きパイプの一覧を取得する方法として、こんなコードが載っています。
String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\"); |
「ということはWindows APIのFindFirstFileでもできるのかな?」と思い、試してみたところ、やはりできました。FindFirstFile系にそんな機能があったとは驚きです。
#include <iostream> #include <windows.h> constexpr int BUFFER_SIZE = 4096; int main() { auto hPipe1 = CreateNamedPipe(TEXT(R"(\\.\pipe\SamplePipe1)"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 1, BUFFER_SIZE, BUFFER_SIZE, 0, nullptr); auto hPipe2 = CreateNamedPipe(TEXT(R"(\\.\pipe\SamplePipe2)"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 1, BUFFER_SIZE, BUFFER_SIZE, 0, nullptr); auto hPipe3 = CreateNamedPipe(TEXT(R"(\\.\pipe\SamplePipe3)"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 1, BUFFER_SIZE, BUFFER_SIZE, 0, nullptr); auto hPipe4 = CreateNamedPipe(TEXT(R"(\\.\pipe\SamplePipe4)"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 1, BUFFER_SIZE, BUFFER_SIZE, 0, nullptr); auto hPipe5 = CreateNamedPipe(TEXT(R"(\\.\pipe\SamplePipe5)"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 1, BUFFER_SIZE, BUFFER_SIZE, 0, nullptr); WIN32_FIND_DATAA fd{}; auto hFind = FindFirstFileA(R"(\\.\pipe\*.*)", &fd); if (hFind == INVALID_HANDLE_VALUE) { return 1; } do { std::cout << "cFileName: " << fd.cFileName << std::endl; } while (FindNextFile(hFind, &fd)); FindClose(hFind); } |
std::coutで出力するため、A版のAPIを使っています。
これをほとんどまっさらのWindows 7で実行したところ、こんな出力になりました。自身のプロセスで作ったもの以外も表示されています。
lsass ntsvcs scerpc protected_storage plugplay Winsock2\CatalogChangeListener-2c8-0 epmapper Winsock2\CatalogChangeListener-174-0 LSM_API_service eventlog Winsock2\CatalogChangeListener-31c-0 atsvc Winsock2\CatalogChangeListener-390-0 wkssvc trkwks keysvc srvsvc Winsock2\CatalogChangeListener-1dc-0 Winsock2\CatalogChangeListener-1d4-0 TermSrv_API_service IPRT-VBoxTrayIPC-TestUser MsFteWds PIPE_EVENTROOT\CIMV2SCM EVENT PROVIDER SamplePipe1 SamplePipe2 SamplePipe3 SamplePipe4 SamplePipe5
これを動かした環境はVirtualBoxのゲストマシンで、ゲスト拡張もインストールしています。IPRT-VBoxTrayIPC-TestUserはそのためでしょう。
「名前付きパイプのハンドルから名前を得る方法はないのかな」と、軽い気持ちでググったら、最初に挙げたStack Overflowの回答を見つけました。なお、この当初の目的は、GetFileInformationByHandleExにFileNameInfoを渡すことで実現できました。
スポンサード リンク |