久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4863|回復: 0
打印 上一主題 下一主題
收起左側

驅動程序和應用程序之間通信

[復制鏈接]
跳轉到指定樓層
樓主
ID:108531 發表于 2016-3-12 16:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Q:
請問有什么方法實現驅動程序主動和應用程序進行實時通訊,而不用應用程序采用定時查詢的方法?
比如驅動有一事件發生需要立即通知應用程序,或驅動程序需要向應用程序讀取一些內容.
A:
有一個很容易的方式,在驅動程序和應用程序之間用一個事件。
在應用程序CreateFile的時候,驅動程序IoCreateSynchronizationEvent一個有名的事件,然后應用程序CreateEvent/OpenEvent此有名事件即可。
注意點:
1,不要在驅動初始化的時候創建事件,此時大多不能成功創建;
2,讓驅動先創建,那么此后應用程序打開時,只能讀(Waitxxxx),不能寫(SetEvent/ResetEvent)。反之,如果應用程序先創建,則應用程序和驅動程序都有讀寫權限;
3,用名字比較理想,注意驅動中名字在\BaseNamedObjects\下,例如應用程序用“xxxEvent”,那么驅動中就是“\BaseNamedObjects\xxxEvent”;
4,用HANDLE的方式也可以,但是在WIN98下是否可行,未知。
5,此后,驅動對讀請求應立即返回,否則就返回失敗。不然將失去用事件通知的意義(不再等待讀完成,而是有需要(通知事件)時才會讀);
6,應用程序發現有事件,應該在一個循環中讀取,直到讀取失敗,表明沒有數據可讀;否則會漏掉后續數據,而沒有及時讀取;
Sample Code:

// Describe the share memory.
typedef struct _PKT_BUFFER
{
PMDL BufferMdl;
PVOID UserBaseAddress;
PVOID KernelBaseAddress;
}PKT_BUFFER, *PPKT_BUFFER;
typedef struct _SHARE_EVENT_CONTEXT
{
WCHAR EventName[128]; // Event name, the only connection btw ring0/ring3
HANDLE Win32EventHandle; // Ring3 copy of the event handle
HANDLE DriverEventHandle; // Ring0 copy of the event handle
PVOID DriverEventObject; // The event object
}SHARE_EVENT_CONTEXT, *PSHARE_EVENT_CONTEXT;

BOOLEAN CreateShareMemory(PPKT_BUFFER PktBuffer, ULONG Size)
{
PktBuffer->KernelBaseAddress = ExAllocatePoolWithTag(NonPagedPool,
Size,
'MpaM');
if(!PktBuffer->KernelBaseAddress)
return FALSE;
//
// Allocate and initalize an MDL that describes the buffer
//
PktBuffer->BufferMdl = IoAllocateMdl(PktBuffer->KernelBaseAddress,
Size,
FALSE,
FALSE,
NULL);
if(!PktBuffer->BufferMdl)
{
ExFreePool(PktBuffer->KernelBaseAddress);
PktBuffer->KernelBaseAddress =NULL;
return FALSE;
}
MmBuildMdlForNonPagedPool(PktBuffer->BufferMdl);
DEBUGP(DL_INFO, ("CreateShareMemory: KernelBaseAddress = 0x%p\n", PktBuffer->KernelBaseAddress));
return TRUE;
}
VOID DestroyShareMemory(PPKT_BUFFER PktBuffer)
{
if(PktBuffer->BufferMdl)
{
IoFreeMdl(PktBuffer->BufferMdl);
PktBuffer->BufferMdl = NULL;
}
if(PktBuffer->KernelBaseAddress)
{
ExFreePool(PktBuffer->KernelBaseAddress);
PktBuffer->KernelBaseAddress = NULL;
}
}
//This function works in user dispatch code.
BOOLEAN MapSharedMemory(PPKT_BUFFER PktBuffer)
{
if(!PktBuffer->BufferMdl)
return FALSE;
//
// The preferred V5 way to map the buffer into user space
//
PktBuffer->UserBaseAddress =
MmMapLockedPagesSpecifyCache(PktBuffer->BufferMdl, // MDL
UserMode, // Mode
MmCached, // Caching
NULL, // Address
FALSE, // Bugcheck?
NormalPagePriority); // Priority
if(!PktBuffer->UserBaseAddress)
return FALSE;
DEBUGP(DL_INFO, ("MapSharedMemory SUCCESS, UserBaseAddress %p\n", PktBuffer->UserBaseAddress));
return TRUE;
}
VOID UnmapSharedMemory(PPKT_BUFFER PktBuffer)
{
if(PktBuffer->UserBaseAddress)
{
MmUnmapLockedPages(PktBuffer->UserBaseAddress, PktBuffer->BufferMdl);
PktBuffer->UserBaseAddress = NULL;
}
}
BOOLEAN CreateShareEvent(PSHARE_EVENT_CONTEXT ShareEvent)
{
UNICODE_STRING UnicodeName;
WCHAR UnicodeBuffer[128] = L"\BaseNamedObjects\";
RtlInitUnicodeString(&UnicodeName, UnicodeBuffer);
UnicodeName.MaximumLength = 128;
RtlAppendUnicodeToString(&UnicodeName, ShareEvent->EventName);
ShareEvent->DriverEventObject = IoCreateSynchronizationEvent(&UnicodeName,
&ShareEvent->DriverEventHandle);
if(ShareEvent->DriverEventObject == NULL)
{
ShareEvent->DriverEventHandle = NULL;
DEBUGP(DL_INFO, ("CreateSynchronizationEvent FAILED Name=%ws\n", UnicodeBuffer));
return FALSE;
}
else
{
KeClearEvent(ShareEvent->DriverEventObject);
DEBUGP(DL_INFO, ("CreateSynchronizationEvent SUCCESS Name=%ws DriverEventObject=%p, DriverEventHandle=%u\n",
UnicodeBuffer,
ShareEvent->DriverEventObject,
ShareEvent->DriverEventHandle));
return TRUE;
}
}
VOID DestroyShareEvents(PSHARE_EVENT_CONTEXT ShareEvent)
{
if(ShareEvent->DriverEventHandle)
{
ZwClose(ShareEvent->DriverEventHandle);
ShareEvent->DriverEventObject = NULL;
ShareEvent->DriverEventHandle = NULL;
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产综合第一页 | 黑人巨大精品 | 毛片网在线观看 | 国产性生活一级片 | www.狠狠干 | 中文字幕中文字幕 | 亚洲啪啪一区 | 色欧美综合 | 在线视频一区二区 | 国产高清一二三区 | 色综合99| 亚洲成人精品影院 | 亚洲xxxxx | 欧美成人一级 | 毛片一区二区三区 | 天堂中文在线播放 | 羞羞涩涩在线观看 | 夜夜骑首页 | 在线观看黄色电影 | 91精品久久久久久久久 | 毛片网站免费观看 | 亚洲天堂中文字幕 | 日韩一级 | 日本在线视 | 久久久噜噜噜www成人网 | 一区2区| 国产成人精品a视频一区www | 伊人久久精品 | 97精品国产 | 爱综合 | 国产精品福利网站 | 夜夜久久 | 欧美精| 亚洲精品在线免费看 | 免费一级欧美在线观看视频 | 国产三级日本三级 | 日韩午夜电影在线观看 | 久久成人免费 | 久久五月婷 | 精品久久久久久亚洲国产800 | 欧美国产视频一区二区 |