C++ 如何确定两个Win32 API句柄代表同一个对象?

C++ 如何确定两个Win32 API句柄代表同一个对象?,c++,winapi,handle,C++,Winapi,Handle,假设我有两个汉尔德: HANDLE h1; HANDLE h2; 它们都收到了一些Windows API函数产生的值——特别是,我对调用CreateFile()产生的句柄感兴趣。我如何确定h1和h2引用了相同的基础对象-在CreateFile()的情况下-相同的文件、目录或设备?是否有一些API来确定这一点?您可以使用GetFinalPathNameByHandle并比较两个句柄的文件路径。 API返回可用于唯一标识引用对象的信息: 您可以比较结构中返回的VolumeSerialNumber和

假设我有两个汉尔德:

HANDLE h1;
HANDLE h2;

它们都收到了一些Windows API函数产生的值——特别是,我对调用
CreateFile()
产生的句柄感兴趣。我如何确定
h1
h2
引用了相同的基础对象-在
CreateFile()
的情况下-相同的文件、目录或设备?是否有一些API来确定这一点?

您可以使用GetFinalPathNameByHandle并比较两个句柄的文件路径。

API返回可用于唯一标识引用对象的信息:

您可以比较结构中返回的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-比较两个对象句柄以确定它们是否引用相同的底层内核对象


这是否适用于问题中提到的设备句柄?设备句柄-不存在。当您尝试打开设备时,始终会创建文件_对象,并获得该对象的句柄。更快的需求询问—这是否适用于非文件系统设备—不适用。即使不是所有文件系统的序列号-主要用于NTFS网络共享和网络驱动器如何?假设我已将\\server\share装载为驱动器X:并通过以\\server\share\somefile.txt打开文件获得一个文件句柄,通过打开X:\somefile.txt获得另一个文件句柄。事实上,我在这两种情况下都打开了相同的文件。在这种情况下,如果我指定标志file\u NAME\u NORMALIZED,那么使用文件路径的方法有效吗?副手柄信息有效吗?我想更详细地了解情况。假设\\server\share由运行Samba的Linux主机提供。什么适用于这种情况?或者可以将ZwQueryObject与ObjectNameInformation信息类一起使用-这将是有效的,根据MSDN,在xp上没有此类常量-ObjectNameInformation。请检查这里: