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

时间:2014-12-05 17:00:49

标签: c++ winapi named-pipes

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

目前我尝试使用GetFinalPathNameByHandle但没有运气。我甚至不确定是否可以这样做,但它被提到是一个潜在的解决方案,所以我会顺其自然。以下内容改编自以下示例代码:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx

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);}

命令行参数是&#34; \\\\。\\ pipe \\ mynamedpipe&#34;或者&#34; \\。\ pipe \ mynamedpipe&#34;,我试过了两个。输出是垃圾,但更重要的是在使用Visual Studio 2013 Express进行调试时,在调试程序时,路径变量在GetFinalPathNameByHandle调用之后直接是垃圾。

垃圾我的意思是:

  • 路径0x0036fab4 L&#34;쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌... wchar_t [100]

控制台输出为:

  • 最后的路径是:????????????????????????????? ?????????????????????????????????????????????????? ????????????? 6?╫☻

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

1 个答案:

答案 0 :(得分:2)

在这里回答我自己的问题。 GetFileInformationByHandleEx使用FileNameInfo为FileInformationClass参数和CreateNamedPipe生成的句柄完成此操作。