阅读:1390回复:6
怎么实现应用程序和驱动的通信
我想在驱动中分配以内存,然后传给应用程序,现在我知道是怎么做得了,可是我想在这块内存中设置一个标志位,当在驱动中做完了就为1,然后应用程序当看到共享内存的标志位为1时,就开始做事情。可是我不知道怎么在驱动中的这块内存中,设这个标志位,能设么?
|
|
最新喜欢:![]() |
沙发#
发布于:2004-04-15 17:03
直接设即可,只要你自己清楚就行。
|
|
|
板凳#
发布于:2004-04-17 12:21
好象通过DeviceIO...函数就可以了;
|
|
地板#
发布于:2004-04-17 16:59
只要你确定两个地址是描述同一快内存就可以,
在app中得到地址(DeviceIOControl(...,pAppMem,...))之后, 直接 *pAppMem = 1;就是了-- |
|
|
地下室#
发布于: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) 不知道为什么应用程序中读到的数,不是驱动中地址得到数。 帮帮忙好么?是函数用错了,还是应用程序中错了? |
|
5楼#
发布于:2004-04-29 13:23
这个有三种方法,不过本人只推荐用以下一种方法来操作。也就是用DoubleBuffer.
这种方法好用,楼上的兄弟说的很清楚了。 |
|
|
6楼#
发布于:2004-04-30 13:04
还有一种办法可以解决你的问题。
在Ring3层创建一个Event,并传到Ring0层Driver中,然后在Ring3层中等待该事件(KeWaitForSingleObject),Driver中需通知时用KeSetEvent()即可。 |
|
|