正文
q: 請問有什麼方法實現驅動程式主動和應用程式進行實時通訊,而不用應用程式採用定時查詢的方法?
比如驅動有一事件發生需要立即通知應用程式,或驅動程式需要向應用程式讀取一些內容.
a: 有乙個很容易的方式,在驅動程式和應用程式之間用乙個事件。
在應用程式createfile的時候,驅動程式iocreatesynchronizationevent乙個有名的事件,然後應用程式createevent/openevent此有名事件即可。
注意點:
1,不要在驅動初始化的時候建立事件,此時大多不能成功建立;
2,讓驅動先建立,那麼此後應用程式開啟時,只能讀(wait***x),不能寫(setevent/resetevent)。反之,如果應用程式先建立,則應用程式和驅動程式都有讀寫許可權;
3,用名字比較理想,注意驅動中名字在/basenamedobjects/下,例如應用程式用「***event」,那麼驅動中就是「/basenamedobjects/***event」;
4,用handle的方式也可以,但是在win98下是否可行,未知。
5,此後,驅動對讀請求應立即返回,否則就返回失敗。不然將失去用事件通知的意義(不再等待讀完成,而是有需要(通知事件)時才會讀);
6,應用程式發現有事件,應該在乙個迴圈中讀取,直到讀取失敗,表明沒有資料可讀;否則會漏掉後續資料,而沒有及時讀取;
sample code:
// describe the share memory.
typedef struct _pkt_buffer
pkt_buffer, *ppkt_buffer;
typedef struct _share_event_context
share_event_context, *pshare_event_context;
boolean createsharememory(ppkt_buffer pktbuffer, ulong size)
mmbuildmdlfornonpagedpool(pktbuffer->buffermdl);
debugp(dl_info, ("createsharememory: kernelbaseaddress = 0x%p/n", pktbuffer->kernelbaseaddress));
return true;
} void destroysharememory(ppkt_buffer pktbuffer)
if(pktbuffer->kernelbaseaddress) }
//this function works in user dispatch code.
boolean mapsharedmemory(ppkt_buffer pktbuffer)
void unmapsharedmemory(ppkt_buffer pktbuffer) }
boolean createshareevent(pshare_event_context shareevent)
else }
void destroyshareevents(pshare_event_context shareevent) }
驅動程式與應用程式之間的通訊
驅動程式與應用程式之間的通訊 驅動程式必須與應用程式進行通訊,才能最終達到應用程式控制裝置的目的,不然驅動有qiu用。要通訊就涉及到3個方面 1.應用程式與驅動程式通訊 2.驅動程式與應用程式通訊 3.資料傳輸 下面分別討論 1。應用程式與驅動程式通訊 2。驅動程式與應用程式通訊 2 1 驅動程式在...
驅動程式和應用程式通訊方法
驅動程式必須與應用程式進行通訊,才能最終達到應用程式控制裝置的目的,不然驅動有qiu用。要通訊就涉及到3個方面 1.應用程式與驅動程式通訊 2.驅動程式與應用程式通訊 3.資料傳輸 下面分別討論 1。應用程式與驅動程式通訊 1 1 應用程式實現與驅動通訊的過程 用createfile開啟裝置,用de...
應用程式與驅動程式6種通訊方式
應用程式與驅動程式6種通訊方式 於網際網路,交流學習 應用程式與驅動程式通訊方式據我所知,細分可以分6種,readfile,wirtefile方式的緩衝區裝置讀寫,直接方式讀寫,和其他方式讀寫。io裝置控制操作 即 devicecontrol 的緩衝記憶體模式ioctl,直接記憶體方式的ioctl,...