關於windows 僞句柄

      《windows核心編程》裏提到了“僞句柄”一詞,故名思議,它並不是真的句柄,有時候不會達到你想要的效果。邊看代碼,邊解釋

代碼如下:

 

      

這段代碼的意圖,是要在 ChildThread 這個線程函數裏獲得其父線程的一些時間參數(例如:創建時間,結束時間,執行用戶代碼所需要的時間等等)   ,因此,在父線程裏,通過 GetCurrentThread() 函數,獲得當前線程的句柄,並作爲子線程函數的參數傳遞

 代碼是這句:HANDLE hThreadC = (HANDLE)_beginthreadex(NULL,0,(unsigned  (_stdcall*)( void*))ChildThread,(PVOID)hThreadParent,0,0);

 然後在子線程裏,接收 父線程的句柄,用GetThreadTimes(hThreadParent,&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime)

    獲得相應的時間參數。但是輸出結果並不是我們想要的 父線程的時間參數,而是子線程的時間參數,因爲我們傳遞的是一個 “僞句柄”,而線程的僞句柄是一個指向當前線程的句柄;換言之,指向的是發出函數調用的那個線程!

     要想獲得真句柄,很簡單,只需要用我們 註釋的代碼,換掉  GetCurrentThread() ,正確代碼如下:

 

DuplicateHandle()函數獲得一個進程表中的記錄項,在另一個進程的句柄表中創建這個記錄項的副本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章