2014-06-13 40 views
2

以前從不開發任何驅動程序。2窗口內核模式驅動程序之間的通信

無論如何,我現在正在編寫2個簡單的windows內核模式驅動程序,並將2個驅動程序安裝到連接到2個不同總線(ISA總線/ PCI總線)的2個不同設備上,並且不知何故2個驅動程序需要通話對方也希望數據交換,有沒有什麼有效的方法來實現這一點?

內核事件可能能夠啓用同步,但數據交換如何?

在用戶模式下,管道/套接字可能是一個選項,但在內核模式下,是否存在命名管道或對象?谷歌表示,有一個爲內核模式管道用法沒有說明的API ...

我不是很熟悉Windows驅動程序框架,希望我做的意義..

的感謝!

回答

2

內核模式組件之間的通信有IRP_MJ_INTERNAL_DEVICE_CONTROL。驅動程序#1通過其名稱打開驅動程序#2,並向內部IOCTL發送輸入或/和輸出數據。

+2

+1。請注意(如果您願意),您可以在驅動程序初始化期間使用此機制來交換回調例程地址和上下文指針,然後使用回調例程進行通信。內核驅動程序都加載到相同的地址空間,所以它不像進程間通信;驅動程序A可以直接調用驅動程序B中的函數,也可以直接寫入驅動程序B創建的內存緩衝區中 - 只需知道地址即可。 –

+0

酷!我認爲這正是我正在尋找的。並且您的評論確實有助於清除像我這樣的新手新手的頭腦! @HarryJohnston – Sean

+0

只有一件事,我該如何在驅動程序#1中「打開」#2驅動程序?我試過IoGetDeviceObjectPointer和ObReferenceObjectByName,都失敗了。第一個參數詢問應該看起來像「\\ ​​Device \\ somedevice」或「\\ Driver \\ somedriver」的設備/驅動程序的名稱,我嘗試過使用WdfDeviceInitAssignName來定製我的驅動程序的名稱,但是它又失敗了... – Sean

0

@Harry Johnston:您需要小心寫入共享內存位置。我假設你是在兩個設備之間實現串行緩衝區的情況下進行響應的(只有一個設備可以寫入,另一個只能讀取),但顯然應該添加的是,應該謹慎接近設備之間的共享內存位置,特別是如果兩個設備都要頻繁地寫入該位置,並導致不確定的行爲或中斷的鎖定似乎意外地得到處理。

相關問題