【发布时间】:2015-04-03 17:12:41
【问题描述】:
假设我有两个句柄:
HANDLE h1;
HANDLE h2;
两者都收到了来自某些 Windows API 函数的值 - 特别是,我对调用 CreateFile() 产生的句柄很感兴趣。如何确定 h1 和 h2 引用相同的底层对象 - 在 CreateFile() 的情况下 - 相同的文件、目录或设备?是否有一些 API 可以确定这一点?
【问题讨论】:
假设我有两个句柄:
HANDLE h1;
HANDLE h2;
两者都收到了来自某些 Windows API 函数的值 - 特别是,我对调用 CreateFile() 产生的句柄很感兴趣。如何确定 h1 和 h2 引用相同的底层对象 - 在 CreateFile() 的情况下 - 相同的文件、目录或设备?是否有一些 API 可以确定这一点?
【问题讨论】:
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;
}
【讨论】:
Windows 10 的新功能:
CompareObjectHandles - 比较两个对象句柄以确定它们是否引用相同的底层内核对象。
https://msdn.microsoft.com/en-us/library/windows/desktop/mt438733(v=vs.85).aspx
【讨论】:
您可以使用 GetFinalPathNameByHandle 并比较两个句柄的文件路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx
【讨论】: