如何确定两个Win32 API句柄表示相同的对象
How to determine that two Win32 API handles represent the same object?
假设我有两个韩尔德:
HANDLE h1;
HANDLE h2;
而且两者都接收到了一些Windows API函数产生的值——特别是,我对调用CreateFile()
产生的句柄很感兴趣。如何确定h1
和h2
引用相同的底层对象(在CreateFile()
的情况下)-相同的文件、目录或设备?是否有API来确定这一点?
适用于Windows 10的新功能:
CompareObjectHandles-比较两个对象句柄,以确定它们是否引用相同的底层内核对象。
https://msdn.microsoft.com/en-us/library/windows/desktop/mt438733(v=vs.85).aspx
GetFileInformationByHandle API返回可用于唯一标识引用对象的信息:
您可以比较BY_HANDLE_FILE_INFORMATION结构中返回的VolumeSerialNumber和FileIndex成员,以确定两个路径是否映射到同一目标;例如,您可以比较两个文件路径,并确定它们是否映射到同一目录。
例如:
bool SameFile( HANDLE h1, HANDLE h2 ) {
BY_HANDLE_FILE_INFORMATION bhfi1 = { 0 };
BY_HANDLE_FILE_INFORMATION bhfi2 = { 0 };
if ( ::GetFileInformationByHandle( h1, &bhfi1 ) &&
::GetFileInformationByHandle( h2, &bhfi2 ) ) {
return ( ( bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh ) &&
( bhfi1.nFileIndexLow == bhfi2.nFileIndexLow ) &&
( bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber ) );
}
return false;
}
您可以使用GetFinalPathNameByHandle并比较两个句柄的文件路径。https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- 如何确定两个Win32 API句柄表示相同的对象