驅動向應用程序發送消息

驅動向應用程序發送消息

這裏介紹一下常見的兩種辦法。 
1、驅動程序調用API SendNotifyMessage,發送特定的消息給應用程序,這就要求應用程序要有消息循環機制並且要事先做好消息的處理。參數 1爲窗口句柄,可以設置HWND_BROADCAST表示廣播消息。要注意的是不要在參數中傳遞指針(虛擬地址),因爲執行驅動程序的線程和應用程序並不在同一個進程空間中。解決辦法可以利用內存映射文件技術,比如在驅動程序中創建一個內存映射文件對象,申請一塊物理內存,然後把對象名稱和內存長度傳遞給應用程序,應用程序打開同名的內存映射文件對象,讀取裏面的數據。對象名稱可以事先協定好,也可以通過註冊表來傳遞,內存長度是32位值,通過消息參數就可以傳遞,也可以通過註冊表來傳遞。另外一種解決辦法是在定製內核時候預留一塊物理內存,這樣驅動程序和應用程序都可以通過VirtualAlloc和 VirtualCopy來映射到同一塊物理內存,其原理同內存映射文件技術一樣,但是這塊物理內存不具備通用性。最後一個辦法是應用程序事先將一個緩衝區地址傳遞給驅動程序,驅動程序調用MapPtrToProcess映射應用程序傳遞過來的地址,當驅動程序調用SendNotifyMessage後應用程序可以直接到該地址中讀取數據。 
設備管理器就是調用此函數廣播WM_DEVICECHANGE消息的。另外WINCE的一個例子程序RNAApp在撥號連接建立的時候也是調用這個函數廣播WM_NETCONNECT消息的。 
2、驅動程序調用API CeEventHasOccurred指明一個事件A發生,在此之前應用程序調用API CeRunAppAtEvent將驅動程序指明的A事件和一個應用程序名稱相關聯,或者和一個事件B相關聯。這樣當A事件發生時,如果指明和一個應用程序名稱關聯,那這個應用程序就會被啓動。如果指明瞭和一個事件B相關聯,那麼等待事件B的線程將被激活。如果想了解當前系統內部所有驅動程序支持哪些類似事件A的事件,調用 API CeNotifyPublic_FilterEvent,在該API的幫助文檔裏也列舉了常見的事件,例如 NOTIFICATION_EVENT_NET_CONNECT和 NOTIFICATION_EVENT_NET_DISCONNECT。 

 

例如: 我的CMMB FILTER 要反饋消息給應用程序。
在驅動和應用中加入
#define MSG_CMMB_FILTER   RegisterWindowMessage(L"WM_CMMB_MESSAGE")

 

驅動中SendNotifyMessage(HWND_BROADCAST, MSG_CMMB_FILTER, (WPARAM)wParam, (LPARAM)lParam);

 

應用程序中加入消息處理
  MESSAGE_HANDLER(MSG_CMMB_FILTER, OnCMMBFilter)


LRESULT OnCMMBFilter(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);

 

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