chencheng
驱动小牛
驱动小牛
  • 注册日期2003-06-27
  • 最后登录2007-08-30
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1234回复:7

驱动与应用程序数据交互的问题

楼主#
更多 发布于:2004-09-09 11:16
请问大虾,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;///这句话有问题吗?
           ..................
           .................

}
每次运行应用程序都死机 :(
好好学习,天天向上
wbinw
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-09 13:29
我认为,要定义一个指针指向I.IoctlBuffer,不能直接给I.IoctlBuffer赋值
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-09-09 14:36
数据少通过BUFFER拷贝,多的话用MDL锁定后直接访问
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kissfire
驱动牛犊
驱动牛犊
  • 注册日期2004-09-09
  • 最后登录2006-01-05
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-09 16:32
不能那样直接赋值,用内核态的复制函数。
zhiyuan19840428
驱动小牛
驱动小牛
  • 注册日期2004-05-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
hollychen2002
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2005-11-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-09 20:27
我觉得你的思想弄错了,因为kernel mode 的地址对于user mode来说是不适用的,非要经过转换才行。

所以,正如wowocock所说,少量的数据可以copy到IRP的buffer里,
如果大量数据,你要先将数据锁定,然后再将地址映射到user mode 的进程空间,方法请再论坛里查找“Sharing Memory Between Drivers and Applications”
要学做事,先学做人
chencheng
驱动小牛
驱动小牛
  • 注册日期2003-06-27
  • 最后登录2007-08-30
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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]
好好学习,天天向上
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-09-10 19:36
建议你还是C做,这样调试的可以清楚点,用SOFTICE从应用到驱动再带到应用都跟踪一下,看看就很清楚了....
最好能跟踪到汇编代码,这样是最直接的,很多问题都可以由汇编代码得到原因的......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部