2017-07-04 104 views
0

我感到震驚的是,在我的應用程序通過DeviceIoControl()Win32 API向我的內核驅動程序(WDM)發送IOCTL請求時,我在用戶模式和內核模式之間獲得了相同的PID。進程ID在用戶模式和內核模式下是相同的

據我所知,驅動程序在內核模式下有自己的PID;應用程序擁有用戶模式下的PID,它們是分開的,可以通過IOCTL進行通信。但是今天,我在IOCTL請求中的用戶/內核模式之間獲得了相同的PID。我在用戶模式下通過GetCurrentProcessId()函數獲得PID;在內核模式下通過PsGetCurrentProcessId()函數獲得PID,顯示用戶模式應用的結果,這兩個PID是相同的。

有誰知道爲什麼?

回答

1

你看到的是正常的。在Windows中,線程花費部分時間運行用戶模式代碼,部分時間運行內核模式代碼是正常的。在你的情況下,在一個線程執行完調用來執行IOCTL的應用程序之後,Windows內核使用這個相同的線程來執行你的內核模式驅動程序代碼來處理這個IOCTL。

希望這會有所幫助。

+0

嗨@thtse,謝謝:) Windows內核如何再次採用同一個線程?應用程序通過系統調用向內核發送IOCTL,內核處理請求然後返回結果,有兩個進程,一個處於用戶模式,另一個處於內核模式。或Windows以不同的方式做到這一點?有沒有任何文件提及它?我對它的機制感興趣。 – dougpuob

+0

@dougpuob - 運行時每個進程和線程都有一些ID。這與查詢的用戶或內核模式沒有什麼不同 - 對於同一個線程或進程,結果當然是相同的。和「有兩個進程,一個在用戶模式下,另一個在內核模式下」 - 這絕對是錯誤的。進程與模式無關。在某個進程中調用你的驅動程序。它從用戶模式轉到內核。但這是相同的線程(具有相同的ID),並在相同的過程(所以和進程ID相同) – RbMm

+0

@RbMm,謝謝。在得到你的消息後,我去跟蹤ractos項目的'DeviceIoControl()'函數。它和你說的從用戶模式到內核一樣。請給我一隻手來澄清我的觀念。據我所知,Windows內核在Ring 0執行,下面的調用堆棧由應用程序(Ring 3的用戶模式)通過'DeviceIoControl()'執行,當它改變爲Ring 0時,或者這個調用堆棧總是在Ring 3? [**調用棧**](http://i.imgur.com/uBIZPRZ.png) – dougpuob

相關問題