0
我感到震驚的是,在我的應用程序通過DeviceIoControl()Win32 API向我的內核驅動程序(WDM)發送IOCTL請求時,我在用戶模式和內核模式之間獲得了相同的PID。進程ID在用戶模式和內核模式下是相同的
據我所知,驅動程序在內核模式下有自己的PID;應用程序擁有用戶模式下的PID,它們是分開的,可以通過IOCTL進行通信。但是今天,我在IOCTL請求中的用戶/內核模式之間獲得了相同的PID。我在用戶模式下通過GetCurrentProcessId()
函數獲得PID;在內核模式下通過PsGetCurrentProcessId()
函數獲得PID,顯示用戶模式應用的結果,這兩個PID是相同的。
有誰知道爲什麼?
嗨@thtse,謝謝:) Windows內核如何再次採用同一個線程?應用程序通過系統調用向內核發送IOCTL,內核處理請求然後返回結果,有兩個進程,一個處於用戶模式,另一個處於內核模式。或Windows以不同的方式做到這一點?有沒有任何文件提及它?我對它的機制感興趣。 – dougpuob
@dougpuob - 運行時每個進程和線程都有一些ID。這與查詢的用戶或內核模式沒有什麼不同 - 對於同一個線程或進程,結果當然是相同的。和「有兩個進程,一個在用戶模式下,另一個在內核模式下」 - 這絕對是錯誤的。進程與模式無關。在某個進程中調用你的驅動程序。它從用戶模式轉到內核。但這是相同的線程(具有相同的ID),並在相同的過程(所以和進程ID相同) – RbMm
@RbMm,謝謝。在得到你的消息後,我去跟蹤ractos項目的'DeviceIoControl()'函數。它和你說的從用戶模式到內核一樣。請給我一隻手來澄清我的觀念。據我所知,Windows內核在Ring 0執行,下面的調用堆棧由應用程序(Ring 3的用戶模式)通過'DeviceIoControl()'執行,當它改變爲Ring 0時,或者這個調用堆棧總是在Ring 3? [**調用棧**](http://i.imgur.com/uBIZPRZ.png) – dougpuob