kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2672回复:30

在设备扩展开多大的区域比较合适

楼主#
更多 发布于:2003-04-01 21:47
我修改了CHRIS CANT的例子程序作为一个PCI板卡的驱动,每往端口发送一个数据需要调用一次DeviceIoControl。现在用户的要求有变,希望能在60ms时间内发送64K个数据,我应该怎么办?在例子程序中有个分支可以发送多个字,但是如果希望60ms不停的发送,难道要在设备扩展中准备64K的空间来存放发送数,这样是不是太夸张?
老板催的很紧,各位大虾帮帮俺了,谢谢。

最新喜欢:

leavepeaceleavep...
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-01 22:15
64k不大,我还开过10Mbyte咧,没有什么大问题,只是记住不用后记得释放
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-01 22:25
不会吧,这么大,设备扩展是在非分页内存中,最大能开多少啊?并且,用完后释放是不是在CLOSEHANDLE时做,具体要做哪些工作啊,谢谢大虾了,我真高兴这么快有回音。  :D
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-01 23:26
原理上来说,64k的非分页内存没有问题。不过,你为什么要开在设备扩展中呢?设备扩展中保留一个指针不就行了嘛

释放不一定非要在closehandle中做,原则上是一用完就释放,越快越好,呵呵,毕竟危险啊。直接调用释放函数就可以了,具体参数看ddk咯,记得释放后将指针赋值null

BTW,我不是什么大侠,偶也是一个新手,有机会一起研究啊
早起早睡 精神百倍
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-04-02 00:57
直接64k,或象mailme说的,用个pointer也可以啊。如果是在passive level发送数据的话,更方便。
释放什么“设备扩展”?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-04-02 01:00
到处问同样的问题。。。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-03 20:33
到处问同样的问题。。。


SORRY,真的很急,以后不会了。

那就是说用DIRECT I/O的方式,传递一个指针,是吗?
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-04-04 13:47
直接64k,或象mailme说的,用个pointer也可以啊。如果是在passive level发送数据的话,更方便。
释放什么“设备扩展”?


释放内存,按楼主的说法是“设备扩展中的内存”
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-04 13:51
[quote]到处问同样的问题。。。


SORRY,真的很急,以后不会了。

那就是说用DIRECT I/O的方式,传递一个指针,是吗? [/quote]

对,DIRECT_IO应该可以满足你的要求,这个版里有DIRECT_IO的相关资料,一位大侠的经验总结,你好好找找
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-04 13:59
找到咯,文章标题为“DeviceControl()通信实现心得”,作者chrys,链接为:

http://www.driverdevelop.com:90/forum/viewthread.php?tid=18545#pid262156

呵呵
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-04-04 14:24
找到咯,文章标题为“DeviceControl()通信实现心得”,作者chrys,链接为:

http://www.driverdevelop.com:90/forum/viewthread.php?tid=18545#pid262156

呵呵


谢谢!正在看!
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-04-04 14:34
找到咯,文章标题为“DeviceControl()通信实现心得”,作者chrys,链接为:

http://www.driverdevelop.com:90/forum/viewthread.php?tid=18545#pid262156

呵呵


找不到下载的地方拉
http://www.driverdevelop.com/dlit.php?id=70 :(
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-04-04 19:06
http://www.driverdevelop.com/dlit.php?id=70
改为
http://www.driverdevelop.com:90/dlit.php?id=70

都是黑客(不知道算不算,呵呵)倒的鬼啦,你没看驱动的主页上都加了断口90的限制吗,呵呵
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-04 23:47
http://www.driverdevelop.com/dlit.php?id=70
改为
http://www.driverdevelop.com:90/dlit.php?id=70

都是黑客(不知道算不算,呵呵)倒的鬼啦,你没看驱动的主页上都加了断口90的限制吗,呵呵


下完了,谢谢。

我现在的做法是这样的:
1、创建一个IOCTL,它的TRANSFER TYPE是METHOD_IN_DIRECT
2、用DeviceIoControl调用时把一个文件指针作为第3个参数,需要一次性写的数据个数作为第4个参数,比如说1024个

用SOFTICE跟踪时也正确的从DISPATCH到STARTIO,再到真正的设备读写处,整个工作流程没有问题,但是我发现每次写的数据却是错误的,好象是从缓冲区中读出来的随机数,反正不是我给定的文件中的数据(我的文件中数据全部是0x4C)。

我想可能是直接I/O的使用方法有误,我是直接读出缓冲区地址的:
Buffer = (PULONG)Irp->MdlAddress;
然后, ULONG temp = *Buffer;
       向设备写temp;
       Buffer++

这样的用法有什么不对吗?为什么每次temp的值都不对啊?谢谢。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2003-04-05 00:56
ft,mdl不是这样用的。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-04-05 01:06
ft,mdl不是这样用的。

是我错了!
先MmProbeAndLockPages,再MmGetSystemAddressForMdlSafe,对吗?
我从未用过MDL,大虾不要取笑。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-05 05:56
整理了一下,我的要求和现在的情况如下。
我的要求:一个PCI板卡,每60ms传输64K的数据,大约要连续传输十多分钟
目前情况:我创建了一个使用DIRECT I/O的IOCTL(在初始化时设备被初始化为BUFFERED I/O),利用DeviceIoControl的第三和第四个参数带下来源文件的指针和大小。

现在IRP的流程好象是对的,主要问题是DIRECT I/O方式下,一直没有得到正确的指针,所以发送的数据不对。
我想问:
1、当IOCTL的指定DIRECT方式,是否不管以前驱动怎么指定,I/O管理器对此IOCTL都按DIRECT方式
2、如果I/O管理器按DIRECT方式,那么是否在STARTIO例程中读出Irp->MdlAddress是否已经由I/O管理器将输入缓冲的地址放入了,是否还需要我调用MmProbeAndLockPages,在真正读写时,是否还需要调用MmGetSystemAddressForMdlSafe
3、CHRIS CANT的例子程序中(WdmIo)的PHD_IO_CMDS中有个PHDIO_WRITES,有谁用过吗?能贴段代码吗?

谢谢!
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-04-05 12:40
[quote]ft,mdl不是这样用的。

是我错了!
先MmProbeAndLockPages,再MmGetSystemAddressForMdlSafe,对吗?
我从未用过MDL,大虾不要取笑。 [/quote]

ddk中明确指出,上层的过滤器驱动已经调用了MmProbeAndLockPages,所以用户的功能驱动程序不需要(也不能)再调用MmProbeAndLockPages。
我的实际经历也证明情况确实如此,一开始我的驱动也和你的流程一样,但是如果这个ioctl调用很频繁的话(连续调用2000~2500次),系统就会自动重起,后来在ddk中找到了上述说明,把MmProbeAndLockPages一去掉,驱动就很稳定的工作了:)

呵呵,大家都有第一次用mdl的时候,没人取笑你,是帮你指正错误嘛,呵呵

[编辑 -  4/5/03 by  mailme]
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-04-05 12:44
整理了一下,我的要求和现在的情况如下。
我的要求:一个PCI板卡,每60ms传输64K的数据,大约要连续传输十多分钟
目前情况:我创建了一个使用DIRECT I/O的IOCTL(在初始化时设备被初始化为BUFFERED I/O),利用DeviceIoControl的第三和第四个参数带下来源文件的指针和大小。

现在IRP的流程好象是对的,主要问题是DIRECT I/O方式下,一直没有得到正确的指针,所以发送的数据不对。
我想问:
1、当IOCTL的指定DIRECT方式,是否不管以前驱动怎么指定,I/O管理器对此IOCTL都按DIRECT方式
2、如果I/O管理器按DIRECT方式,那么是否在STARTIO例程中读出Irp->MdlAddress是否已经由I/O管理器将输入缓冲的地址放入了,是否还需要我调用MmProbeAndLockPages,在真正读写时,是否还需要调用MmGetSystemAddressForMdlSafe
3、CHRIS CANT的例子程序中(WdmIo)的PHD_IO_CMDS中有个PHDIO_WRITES,有谁用过吗?能贴段代码吗?

谢谢!


首先回答你的问题:
1、对
2、MmProbeAndLockPages不需要也不能要,MmGetSystemAddressForMdlSafe是访问mdl的正确方式
3、没用过,代码后面跟贴
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-04-05 12:46
case IOCTL_WRITE_DATABUFFER:
{ // IOCTL_WRITE_DATABUFFER
if (cbin < 8 || cbout < sz || (MemOffset > ( pdx->memsize-16 )) )
{
status = STATUS_INVALID_BUFFER_SIZE;
break;
}

// WIN2000下用户数据缓冲区首地址
PULONG pulInBuffer = (PULONG) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

for(int i = 0; ulTempSize < sz; i += 4) {
if(i > 12)
i=0;
WRITE_REGISTER_ULONG( (PULONG)(pdx->membase + MemOffset + i), *pulInBuffer++ );
ulTempSize += 4;
}

info = sz;
break;
} // IOCTL_WRITE_DATABUFFER
早起早睡 精神百倍
上一页
游客

返回顶部