kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1391回复:6

怎么实现应用程序和驱动的通信

楼主#
更多 发布于:2004-04-15 15:22
我想在驱动中分配以内存,然后传给应用程序,现在我知道是怎么做得了,可是我想在这块内存中设置一个标志位,当在驱动中做完了就为1,然后应用程序当看到共享内存的标志位为1时,就开始做事情。可是我不知道怎么在驱动中的这块内存中,设这个标志位,能设么?

最新喜欢:

flyingflying
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-04-15 17:03
直接设即可,只要你自己清楚就行。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
jackxin
驱动牛犊
驱动牛犊
  • 注册日期2002-07-29
  • 最后登录2009-06-16
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-04-17 12:21
好象通过DeviceIO...函数就可以了;
liuiang
驱动牛犊
驱动牛犊
  • 注册日期2002-11-21
  • 最后登录2007-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-17 16:59
只要你确定两个地址是描述同一快内存就可以,
在app中得到地址(DeviceIOControl(...,pAppMem,...))之后,
直接 *pAppMem = 1;就是了--
被上帝遗忘的天使......
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-23 15:38
/******************************************************/
只要你确定两个地址是描述同一快内存就可以,
在app中得到地址(DeviceIOControl(...,pAppMem,...))之后,
直接 *pAppMem = 1;就是了--
/***************************************************/
liuiang:
怎样确定两个地址描述是同一块内存?我这么做怎么不行呢?
急!!急!!!!
我的程序是这样的:
DWORD DataBuf[1024];
if(!DeviceIoControl(hAMCC5920, IOCTL_AMCC5920_MAP_MEMORY, NULL, 0,(PDWORD)&DataBuf, sizeof(1024), &dwReturnedLength, NULL))
{
printf(\"Ioctl mapmemory failed x%\\n \",GetLastError());
}

驱动程序:
SystemVirtualAddress = ExAllocatePool(NonPagedPool,1024*9); //allocate memory in driver
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024*4, FALSE, FALSE, NULL);
if(!Mdl)
{
ExFreePool(SystemVirtualAddress);
return(NULL);
}

MmBuildMdlForNonPagedPool(Mdl);

case IOCTL_AMCC5920_MAP_MEMORY:
try
{
UserVirtualAddress = MmMapLockedPagesSpecifyCache(Mdl,
UserMode,NULL,NULL,FALSE,NULL); // Priority
DbgPrint(\"IO_GETADD:pUserVirAdd=%d\\n\",UserVirtualAddress);//
*((PVOID *)(pIrp->UserBuffer)) = UserVirtualAddress;
if(UserVirtualAddress==0)
{
DbgPrint(\"UserVirtualAddress==0\\n\");//
Status=(!STATUS_SUCCESS);
break;
}

pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = sizeof(PVOID);

中断处理:
AMCC5920_ReadWriteBlock(hAMCC5920,AMCC5920_AD_BAR3,0x0,1,SystemVirtualAddress,2048*2,AMCC5920_MODE_DWORD)
 
不知道为什么应用程序中读到的数,不是驱动中地址得到数。
帮帮忙好么?是函数用错了,还是应用程序中错了?

 
zytzjx
驱动牛犊
驱动牛犊
  • 注册日期2001-12-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望41点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-04-29 13:23
这个有三种方法,不过本人只推荐用以下一种方法来操作。也就是用DoubleBuffer.
这种方法好用,楼上的兄弟说的很清楚了。
Wecan
he_x_p
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2005-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-30 13:04
还有一种办法可以解决你的问题。
在Ring3层创建一个Event,并传到Ring0层Driver中,然后在Ring3层中等待该事件(KeWaitForSingleObject),Driver中需通知时用KeSetEvent()即可。
乘着梦的翅膀, 借助黎明时柔和的阳光, 化着一只自由自在的冲天鸟, 在有梦的地方潇洒地飞翔......
游客

返回顶部