阅读:1234回复:7
驱动与应用程序数据交互的问题
请问大虾,wdm驱动程序如何把一个数组送给应用程序?
我在应用程序中定义了一个数组: DWORD RetInfo[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 然后: if ( ! DeviceIoControl(hDevice, W32IF_SET_MEASUREMODE, &AlarmFlag, sizeof(AlarmFlag), RetInfo, 17*sizeof(DWORD), &cbBytesReturned, NULL)) { AfxMessageBox("W32IF_SET_MEASUREMODE"); } else{ ....... =RetInfo[0] ............... } 在wdm中,我也定义了一个数组: DWORD SampleAngle[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 然后在 NTSTATUS UuuDevice::W32IF_SET_MEASUREMODE_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; .................. ................. I.IoctlBuffer() = SampleAngle;///这句话有问题吗? .................. ................. } 每次运行应用程序都死机 :( |
|
|
沙发#
发布于:2004-09-09 13:29
我认为,要定义一个指针指向I.IoctlBuffer,不能直接给I.IoctlBuffer赋值
|
|
板凳#
发布于:2004-09-09 14:36
数据少通过BUFFER拷贝,多的话用MDL锁定后直接访问
|
|
|
地板#
发布于:2004-09-09 16:32
不能那样直接赋值,用内核态的复制函数。
|
|
地下室#
发布于:2004-09-09 18:25
不能那样直接赋值,用内核态的复制函数。 VOID RtlCopyMemory( IN VOID UNALIGNED *Destination, IN CONST VOID UNALIGNED *Source, IN SIZE_T Length ); VOID RtlCopyMemory32 ( VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length ); [编辑 - 9/9/04 by zhiyuan19840428] |
|
5楼#
发布于:2004-09-09 20:27
我觉得你的思想弄错了,因为kernel mode 的地址对于user mode来说是不适用的,非要经过转换才行。
所以,正如wowocock所说,少量的数据可以copy到IRP的buffer里, 如果大量数据,你要先将数据锁定,然后再将地址映射到user mode 的进程空间,方法请再论坛里查找“Sharing Memory Between Drivers and Applications” |
|
|
6楼#
发布于:2004-09-10 17:25
为什么我在wdm驱动里面用这个函数把数组SampleAngle[17]通过I.IoctlBuffer()传给应用程序,应用程序接不到数呢???
RtlCopyMemory( I.IoctlBuffer(), SampleAngle, 17*sizeof(DWORD) ); 应用程序是这个函数: if ( ! DeviceIoControl(hDevice, W32IF_SET_MEASUREMODE, &AlarmFlag, sizeof(AlarmFlag), RetInfo, 17*sizeof(DWORD), &cbBytesReturned, NULL)) AfxMessageBox("W32IF_SET_MEASUREMODE"); else { 。。。。。 Angle[0]=RetInfo[0]; Angle[1]=RetInfo[1]; 。。。。。 } 还有一个问题: 以前我只传一个数(不是数组),我是这么传的: *(DWORD*)(I.IoctlBuffer()) = (DWORD)SampleAngle; 很成功~~应用程序确确实实接到了。 但是换成数组后,我是这么写的: I.IoctlBuffer() =SampleAngle编译能通过,就是一运行就死机! 然后咱们版的大牛们就说啦,什么“数据少通过BUFFER拷贝,多的话用MDL锁定后直接访问”什么“这个不能这么用,你思想弄错了”什么“因为kernel mode 的地址对于user mode来说是不适用的,非要经过转换才行。”什么“……RtlCopyMemory(),RtlCopyMemory32(),……” 但是!!!我想问一下:为什么我传输一个数据时就可以直接向 *(DWORD*)(I.IoctlBuffer())里面赋值呀?那时我也没用RtlCopyMemory(),这个函数呀? 为什么换成数组就不好使了尼? 不是一个道理嘛。 还有呀,上次下载ddk,不知道居然还扣分,下载到半路时短线了,回头一看,我辛辛苦苦得到的370多分都被扣掉了,现在我就剩10来分了,不能给回答问题的大牛们加分了:( 呜……………… [编辑 - 9/10/04 by chencheng] |
|
|
7楼#
发布于:2004-09-10 19:36
建议你还是C做,这样调试的可以清楚点,用SOFTICE从应用到驱动再带到应用都跟踪一下,看看就很清楚了....
最好能跟踪到汇编代码,这样是最直接的,很多问题都可以由汇编代码得到原因的...... |
|
|