假設我有兩個hanldes:如何確定兩個Win32 API句柄表示相同的對象?
HANDLE h1;
HANDLE h2;
並且都收到值導致一些Windows API函數 - 尤其是我在把手interesed源於調用CreateFile()
。我如何確定h1
和h2
引用相同的基礎對象 - 在CreateFile()
的情況下 - 相同的文件,目錄或設備?是否有一些API來確定?
假設我有兩個hanldes:如何確定兩個Win32 API句柄表示相同的對象?
HANDLE h1;
HANDLE h2;
並且都收到值導致一些Windows API函數 - 尤其是我在把手interesed源於調用CreateFile()
。我如何確定h1
和h2
引用相同的基礎對象 - 在CreateFile()
的情況下 - 相同的文件,目錄或設備?是否有一些API來確定?
您可以使用GetFinalPathNameByHandle並比較兩個句柄的文件路徑。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx
的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;
}
這是否適用於設備句柄,如問題中所述? – 2015-04-03 18:20:37
不,只適用於文件。 – 2015-04-03 18:29:10
處理設備 - 不存在。當您嘗試打開設備時,總是會創建FILE_OBJECT,並且您可以處理它。更快的需求問 - 這是不是文件系統設備的工作 - 沒有工作。甚至不是所有的文件系統序列號 - 主要用於NTFS – sutol 2015-04-03 18:36:55
新的Windows 10:
CompareObjectHandles - 比較兩個對象處理,以確定它們是否指相同的底層內核對象。
https://msdn.microsoft.com/en-us/library/windows/desktop/mt438733(v=vs.85).aspx
或者可以使用ZwQueryObject與ObjectNameInformation infoclass - 這將是工作和XP也 – sutol 2015-04-03 18:53:47
根據MSDN,有沒有這樣的常數 - ObjectNameInformation。請檢查這裏:https://msdn.microsoft.com/en-us/library/windows/hardware/ff550964(v=vs.85).aspx – 2015-04-05 17:32:44