我试图找到一个命名管道的名称给它的句柄。我找到了一个解决方案,其中使用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调用之后直接是垃圾。
垃圾我的意思是:
控制台输出为:
所以我正式陷入困境。或者,可能更好的解决方案是将两个命名管道句柄相互比较,以确定它们是否指向同一个命名管道。如果有办法,那么它也可以解决我的问题。
答案 0 :(得分:2)
在这里回答我自己的问题。 GetFileInformationByHandleEx使用FileNameInfo为FileInformationClass参数和CreateNamedPipe生成的句柄完成此操作。