ちょっとびっくりな情報を見つけました。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を渡すことで実現できました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ 名前付きパイプの全取得にFindFirstFileが使える
  • ⇒ 名前付きパイプの全取得にFindFirstFileが使える
  • ⇒ 名前付きパイプの全取得にFindFirstFileが使える