驅動程式和應用程式之間通訊

2021-04-15 09:02:56 字數 1583 閱讀 9356

正文

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,...