2015-04-03 45 views
3

假設我有兩個hanldes:如何確定兩個Win32 API句柄表示相同的對象?

HANDLE h1; 
HANDLE h2; 

並且都收到值導致一些Windows API函數 - 尤其是我在把手interesed源於調用CreateFile()。我如何確定h1h2引用相同的基礎對象 - 在CreateFile()的情況下 - 相同的文件,目錄或設備?是否有一些API來確定?

回答

1

您可以使用GetFinalPathNameByHandle並比較兩個句柄的文件路徑。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx

+0

或者可以使用ZwQueryObject與ObjectNameInformation infoclass - 這將是工作和XP也 – sutol 2015-04-03 18:53:47

+0

根據MSDN,有沒有這樣的常數 - ObjectNameInformation。請檢查這裏:https://msdn.microsoft.com/en-us/library/windows/hardware/ff550964(v=vs.85).aspx – 2015-04-05 17:32:44

2

GetFileInformationByHandle API返回可用於唯一地標識所引用的對象的信息:

您可以比較VolumeSerialNumber和FileIndex成員在BY_HANDLE_FILE_INFORMATION結構中返回以確定是否兩個路徑映射到相同的目標;例如,您可以比較兩個文件路徑並確定它們是否映射到相同的目錄。

例如:

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

這是否適用於設備句柄,如問題中所述? – 2015-04-03 18:20:37

+0

不,只適用於文件。 – 2015-04-03 18:29:10

+0

處理設備 - 不存在。當您嘗試打開設備時,總是會創建FILE_OBJECT,並且您可以處理它。更快的需求問 - 這是不是文件系統設備的工作 - 沒有工作。甚至不是所有的文件系統序列號 - 主要用於NTFS – sutol 2015-04-03 18:36:55

相關問題