C++ 给定句柄的命名管道的名称

C++ 给定句柄的命名管道的名称,c++,winapi,named-pipes,C++,Winapi,Named Pipes,我正在尝试查找给定句柄的命名管道的名称。我找到了一个解决方案,其中命名的管道句柄使用NtDuplicateObject复制,然后使用NtQueryObject提取名称,但它不稳定,因此这是不可能的 目前,我正试图用GetFinalPathNameByHandle实现这一点,但运气不好。我甚至不确定是否有可能做到这一点,但有人提到这是一个潜在的解决方案,所以我会坚持下去。以下内容改编自示例代码: void\u cdecl\u tmain(int argc,TCHAR*argv[]){ TCHAR

我正在尝试查找给定句柄的命名管道的名称。我找到了一个解决方案,其中命名的管道句柄使用NtDuplicateObject复制,然后使用NtQueryObject提取名称,但它不稳定,因此这是不可能的

目前,我正试图用GetFinalPathNameByHandle实现这一点,但运气不好。我甚至不确定是否有可能做到这一点,但有人提到这是一个潜在的解决方案,所以我会坚持下去。以下内容改编自示例代码:

void\u cdecl\u tmain(int argc,TCHAR*argv[]){
TCHAR路径[BUFSIZE];
手柄管;
德沃德·德雷特;
printf(“\n”);
如果(argc!=2)
{
printf(“错误:\t参数数量正确\n\n”);
printf(“%s\n”,argv[0]);
返回;
}
管道=CreateNamedPipe(argv[1],管道访问入站,管道访问出站,管道等待,1,
10241024120*1000,空);
if(管道==无效的\u句柄\u值)
{
printf(“无法打开文件(错误%d\n)”,GetLastError();
返回;
}
dwRet=GetFinalPathNameByHandle(管道、路径、BUFSIZE、卷名称);
如果(dwRet
命令行参数是“\\\.\\pipe\\mynamedpipe”或“\\.\pipe\mynamedpipe”,我已经尝试了这两种方法。输出是垃圾,但更重要的是,在使用Visual Studio 2013 Express进行调试时,当单步执行程序时,path变量直接在GetFinalPathNameByHandle调用之后是垃圾

我所说的垃圾是指:

  • 路径0x0036fab4 L“쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌... wchar_t[100]
控制台输出为:

  • 最后一条路径是:??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????6?╫☻

因此我正式陷入困境。或者,可能更好的解决方案是将两个命名管道句柄相互比较,以确定它们是否指向同一个命名管道。如果有方法这样做,它也会解决我的问题。

在这里回答我自己的问题。使用FileInformation的FileNameInfo确实可以做到这一点onClass参数和CreateNamedPipe生成的句柄。

GetFinalPathNameByHandle很可能返回0,这意味着它遇到了错误。当GetFinalPathNameByHandle返回0时,调用GetLastError()获取错误代码。这可能会给您更多信息。它实际上返回0.GetLastError()返回1。我假设这是指GetFinalPathNameByHandle的第一个错误返回代码,它是error\u PATH\u NOT\u FOUND?该函数可能只适用于文件系统路径,而不适用于任何其他类型的句柄。因此,您可能会走错路径。好吧,那么,整个思路都是半途而废的。有没有想法比较两个句柄以确定如果它们指向同一命名管道,则进行挖掘?
GetLastError()
返回实际的错误代码,而不是类似于“的第一个错误返回代码…”。。。“。错误代码1是Error\u INVALID\u FUNCTION,而Error\u PATH\u NOT\u FOUND是错误代码3。”。查看
winerror.h
中的实际错误代码定义。有趣的是,明确表示“此句柄不应是管道句柄”,但它确实返回了本地管道的名称(典型
\.\pipe
(如果您是Process Explorer用户,则返回
\Device\NamedPipe
)后面的部分)
void __cdecl _tmain(int argc, TCHAR *argv[]){
   TCHAR Path[BUFSIZE];
   HANDLE pipe;
   DWORD dwRet;

   printf("\n");
   if (argc != 2)
   {
      printf("ERROR:\tIncorrect number of arguments\n\n");
      printf("%s <file_name>\n", argv[0]);
      return;
   }

   pipe = CreateNamedPipe(argv[1], PIPE_ACCESS_INBOUND | PIPE_ACCESS_OUTBOUND, PIPE_WAIT, 1,
          1024, 1024, 120 * 1000, NULL);

   if (pipe == INVALID_HANDLE_VALUE)
   {
      printf("Could not open file (error %d\n)", GetLastError());
      return;
   }

   dwRet = GetFinalPathNameByHandle(pipe, Path, BUFSIZE, VOLUME_NAME_NT);
   if (dwRet < BUFSIZE)
   {
      _tprintf(TEXT("\nThe final path is: %s\n"), Path);
   }
   else printf("\nThe required buffer size is %d.\n", dwRet);

   CloseHandle(pipe);}