如何判断两个Win32 API句柄代表同一个对象?

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

假设我有两个汉尔德:

HANDLE h1;
HANDLE h2;

并且两者都收到了一些 Windows API 函数产生的值 - 特别是,我对调用 CreateFile() 产生的句柄感兴趣。我如何确定 h1h2 引用相同的底层对象 - 在 CreateFile() 的情况下 - 相同的文件、目录或设备?有一些 API 可以确定吗?

您可以使用 GetFinalPathNameByHandle 并比较两个句柄的文件路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx

GetFileInformationByHandleAPIreturns可用于唯一标识引用对象的信息:

You can compare the VolumeSerialNumber and FileIndex members returned in the BY_HANDLE_FILE_INFORMATION structure to determine if two paths map to the same target; for example, you can compare two file paths and determine if they map to the same directory.

例如:

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

Windows10 的新内容:

CompareObjectHandles - 比较两个对象句柄以确定它们是否引用相同的底层内核对象。

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