2012-05-02 53 views
0

我想使用ioctl的反轉模型。我的意思是我想安排一些工作項目,當驅動程序檢測到特定活動時,這是一個用戶空間線程。例如。 1.我在我的內核模式驅動程序中註冊了一個特定中斷的回調。
2.每當我得到一箇中斷,我想安排用戶使用ioctl註冊的一些用戶空間線程。通過windows內核驅動程序調度用戶空間線程

我可以使用DPC,APC或IRP來做到這一點。我知道不應該/不能將驅動程序空間工作與用戶空間不同。我想要的是在特定的硬件事件發生時在用戶空間中進行一些獨立的活動。

感謝

回答

1

從驅動器創建用戶模式線程是非常糟糕的做法,你不能老是從內核模式到用戶模式簡單的傳輸控制。您必須在用戶應用程序中創建工作線程並在此線程中等待事件。有兩種主要的等待方法。 1)你可以等一些事件,巫婆你在ioctl發佈到驅動程序。在某些時刻,驅動程序將事件設置爲可警告和線程去處理事件。這是主要的和簡單的方法

2)您可以發表IOCTL同步和驅動程序掛起這個IRP - >線程塊中DeviceIoControl調用。事件發生時,驅動程序完成這些irp和線程喚醒並進行處理。

每當我得到一箇中斷,我想安排一些用戶空間線程,用戶使用ioctl註冊。

你必須進入安全IRQL(< DISPATCH_IRQL)第一:中斷 - > DPC推到隊列 - >工作線程,因爲比如你不能老是在高IRQL信號事件。

閱讀本 http://www.osronline.com/article.cfm?id=108

和Walter Oney的書

+0

我不會創建一個新的用戶空間thread.However,第一種方法聽起來很有趣。我可以詳細說明一點。 –

+0

其實這篇文章解釋了它。謝謝 –

0

你並不需要排隊一個工作項或做任何事發布活動下來太花哨。調度程序可在DISPATCH_LEVEL中調用,因此DPC足以向任何人發送信號。

只需使用一個正常的反向的調用:

1)應用程序中降下的IOCTL(如果超過一個線程必須發出信號,它必須使用FILE_FLAG_OVERLAPPED和異步I/O)。

2)駕駛員將所得IRP成驅動程序管理的隊列設定解除例程之後等標記未決IRP和返回STATUS_PENDING。

3)中斷到達...從ISR排隊一個DPC(或者如果這是USB或一些其他的堆棧,你可能已經在DISPATCH_LEVEL)。

4)從隊列中移除請求並調用IoCompleteRequest。

對於步驟2和步驟4使用KMDF。有很多東西可以用排隊irps搞砸,所以最好使用經過良好測試的代碼。

相關問題