brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1534回复:9

METHOD_IN_DERECT应用的问题,急

楼主#
更多 发布于:2002-10-15 11:33
要从系统向设备传送数据进行DMA,利用DeviceIoControl函数:
应用程序中:
union
{
    ULONG buf1[BUFFER_LENGTH+1];
    UCHAR buf2[BUFFER_LENGTH*4];
}bufIn;//四字节对齐,用户态字节为单位,驱动中双字为单位。
ULONG   nOut;
file.Read(bufIn.buf2,BUFFER_LENGTH*4);
DeviceIoControl(hdevice,
               IOCTL_PLAY_START,
   bufIn.buf1,
   BUFFER_LENGTH*4,
   NULL,NULL,
               &nOut,
   NULL);
驱动中:
  //**ioctl.h:
   #define TS_IOCTL_PLAY_START
    CTL_CODE(FILE_DEVICE_UNKNOWN,
             0x801,
             METHOD_IN_DIRECT,
             FILE_ANY_ACCESS
             )
  //**device.cpp:
  VOID TsDevice::Serial_IOCTL_PLAY_START_Handler(KIrp I)
  {
NTSTATUS status = STATUS_SUCCESS;
status = dma.Initiate(
                           this,
                           &m_Dma_Ts,
     I.Mdl(),
                           FromMemoryToDevice,
                           LinkTo(CallBack_Dma)
);
if(!NT_SUCCESS(status))
{
I.Information() = 0;
I.Status() = status;
m_DriverManagedQueue.NextIrp(I);
}
 }

调试发现,在dma.Initiate时出现页错误,现在可以肯定是访问IRP的Mdl造成的。
     关键不在Dma的流程,因为即使不进行DMA,在这里一访问I.Mdl就出现页错误。
     那位大侠能指点一二,如问题解决可以送好多可用分。
  :)

最新喜欢:

yjx2003yjx200...
打一枪……换个地方……再打一枪……
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-15 15:31
这个问题解决了,原来要传送的数据应放在bufOut。
但我的DMA(总线主控)还是有问题。肥虫虫对这有研究吗?有没有成功的例子共享一下?有重谢阿


那可能是因为ds封装的时候这样封装的
用ddk就没有这个问题 :D

你还有什么问题,拿出来看看
现成的例子没有呀
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-15 15:22
这个问题解决了,原来要传送的数据应放在bufOut。
但我的DMA(总线主控)还是有问题。肥虫虫对这有研究吗?有没有成功的例子共享一下?有重谢阿
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-15 15:18
这个原因在于,应该把要传送的数据放在bufOut里。
这个问题解决了,但我的DMA还是有问题,再发贴问吧。
分就少给点,不然ZN不愿意 ;)
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-15 13:35
这里出现页错的情况
就是定义ioctl和接受传下来的缓冲区不一致的时候会出现

但是我看你的程序是正确的 :mad:

天呀,怎么会这样? :(
打一枪……换个地方……再打一枪……
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-15 13:30
这里出现页错的情况
就是定义ioctl和接受传下来的缓冲区不一致的时候会出现

但是我看你的程序是正确的 :mad:
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-15 13:17
看不出来哪里有问题 :mad:

对,最头疼的就是这一点!
那么出现页错误的原因有可能有那些呢?我的框架是DS的向导生成的。
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-15 13:14
用的DS?DS不太会玩,你自己解决吧。

这不等于没说吗?
其实用DDK也一样,道理是相通的呀。我就是迷惑如何访问IRP携带的数据
打一枪……换个地方……再打一枪……
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-15 13:13
看不出来哪里有问题 :mad:
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2002-10-15 13:02
用的DS?DS不太会玩,你自己解决吧。
游客

返回顶部