如何枚举进程中所有命名pipe道的名称?

我需要打开一个特定的命名pipe道,因此我可以进行模糊testing,但是我的testing代码无法访问用于生成命名pipe道名称的相同数据。 但是,我可以识别pipe道的名称,然后使用该名称打开pipe道进行模糊处理。

我使用这个论坛post来开始枚举系统上的句柄名称: http : //forum.sysinternals.com/howto-enumerate-handles_topic18892.html

但是,由于某种原因,似乎不能使用命名pipe道。

TL; DR:我需要使用哪些API来列出Windows上当前进程中所有命名pipe道的名称?

Solutions Collecting From Web of "如何枚举进程中所有命名pipe道的名称?"

这将枚举系统中的所有命名管道,或者至少使您朝着正确的方向迈出了一步。

这个在MinGW中用-fpermissive构建。 它应该与MSVC中的类似设置一起工作。

#ifndef _WIN32_WINNT // Windows XP #define _WIN32_WINNT 0x0501 #endif #include <Windows.h> #include <Psapi.h> // mycreatepipeex.c is at http://www.davehart.net/remote/PipeEx.c // I created a simple header based on that. #include "mycreatepipeex.h" #include <iostream> #include <cstdio> #include <errno.h> void EnumeratePipes() { WIN32_FIND_DATA FindFileData; HANDLE hFind; #define TARGET_PREFIX "//./pipe/" const char *target = TARGET_PREFIX "*"; memset(&FindFileData, 0, sizeof(FindFileData)); hFind = FindFirstFileA(target, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "FindFirstFileA() failed: " << GetLastError() << std::endl; return; } else { do { std::cout << "Pipe: " << TARGET_PREFIX << FindFileData.cFileName << std::endl; } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } #undef TARGET_PREFIX return; } int main(int argc, char**argv) { HANDLE read = INVALID_HANDLE_VALUE; HANDLE write = INVALID_HANDLE_VALUE; unsigned char pipe_name[MAX_PATH+1]; BOOL success = MyCreatePipeEx(&read, &write, NULL, 0, 0, 0, pipe_name); EnumeratePipes(); if ( success == FALSE ) { std::cerr << "MyCreatePipeEx() failed: " << GetLastError() << std::endl; return 1; } FILE *f = fopen((const char*)pipe_name, "rwb"); if ( f == NULL ) { std::cerr << "fopen(\"" << pipe_name << "\") failed: " << (int)errno << std::endl; } CloseHandle(read); CloseHandle(write); return 0; }