如何确定两个Win32 API句柄表示相同的对象

How to determine that two Win32 API handles represent the same object?

本文关键字:表示 句柄 对象 API Win32 何确定 两个      更新时间:2023-10-16

假设我有两个韩尔德:

HANDLE h1;
HANDLE h2;

而且两者都接收到了一些Windows API函数产生的值——特别是,我对调用CreateFile()产生的句柄很感兴趣。如何确定h1h2引用相同的底层对象(在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