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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4935|回復: 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;
}
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 欧美国产视频 | 日韩欧美在线精品 | 国产九九九九 | 99精品一区二区 | 国产精品久久久久久久久久免费 | 日韩一区在线观看视频 | 亚洲成人日韩 | www.天天干.com | 91污在线| 欧美一区二区三区高清视频 | 福利视频二区 | 亚洲福利在线观看 | 亚洲国产精品99久久久久久久久 | 亚洲成人久久久 | 久久爱综合 | 国产精品久久午夜夜伦鲁鲁 | 久久国产亚洲 | 精品亚洲一区二区三区四区五区 | 91不卡在线| 在线观看午夜视频 | 欧美视频免费在线 | 亚州毛片 | 国产成人精品午夜视频免费 | 亚洲成人av在线播放 | 免费日本视频 | www.国产精品 | 国产精品夜色一区二区三区 | 国产精品亚洲视频 | 91久久国产精品 | 久久久久九九九女人毛片 | 四虎影院在线观看av | 欧美日韩精品久久久免费观看 | 日本国产精品视频 | 天天操夜夜看 | 男人视频网站 | 亚洲免费高清 | 红桃成人在线 | 国产成人福利 | 亚洲国产精品视频一区 | 欧美一区二区三区 |