mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2003-04-05 12:48
bbs上的代码不好排版,费心看了,呵呵

另外,觉得你不应该传文件指针,而应该在用户态将文件中的数据保存在缓冲区中,然后直接将缓冲区指针传给ioctl
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2003-04-05 12:59
bbs上的代码不好排版,费心看了,呵呵

另外,觉得你不应该传文件指针,而应该在用户态将文件中的数据保存在缓冲区中,然后直接将缓冲区指针传给ioctl


非常感谢!
能否再说详细一点,“将文件中的数据保存在缓冲区中”是什么意思?我试过将一个数组的首地址传下去,好象还是不行。

[编辑 -  4/5/03 by  kittylh]
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2003-04-05 13:07
大侠,我说你好歹也放几分先嘛,也好让我们安安心先啊,呵呵,不情之请 :D
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2003-04-05 13:15
大侠,我说你好歹也放几分先嘛,也好让我们安安心先啊,呵呵,不情之请 :D


SORRY    :D
一急竟然忘了,明天是最后期限。  :(
我的代码和你的差不多啊,可是缓冲区里的始终是0
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2003-04-05 13:22
[quote]bbs上的代码不好排版,费心看了,呵呵

另外,觉得你不应该传文件指针,而应该在用户态将文件中的数据保存在缓冲区中,然后直接将缓冲区指针传给ioctl


非常感谢!
能否再说详细一点,“将文件中的数据保存在缓冲区中”是什么意思?我试过将一个数组的首地址传下去,好象还是不行。

[编辑 -  4/5/03 by  kittylh] [/quote]

就是将文件中的数据读到缓冲区(堆或者栈),再将这个缓冲区首地址传给ioctol

数组应该没问题,我的驱动也用的数组,懒得开堆给他了
如果不行,你看看你传给ioctl的参数,注意两点:缓冲区的大小,以及缓冲区指针是否放在正确的参数位置

你在softice中能看到正确的数据吗?
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2003-04-05 13:33
在SOFTICE中看不到正确数据,dx->MdlAddress下面有个MappedSystemVa,调用MmGetSystemAddressForMdlSafe得到的值与它相同,然后点开它旁边的加号,下面只有一个数,是0,而我给的是一个1024元素的数组首地址。
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2003-04-05 13:44
整理了一下,我的要求和现在的情况如下。
我的要求:一个PCI板卡,每60ms传输64K的数据,大约要连续传输十多分钟
目前情况:我创建了一个使用DIRECT I/O的IOCTL(在初始化时设备被初始化为BUFFERED I/O),利用DeviceIoControl的第三和第四个参数带下来源文件的指针和大小。

现在IRP的流程好象是对的,主要问题是DIRECT I/O方式下,一直没有得到正确的指针,所以发送的数据不对。

..........

谢谢!


知道你问题出在哪里了,呵呵
问题出在你的用户态程序上,direct方式往下传数据时,DeviceIoControl的输出缓冲区(第5、6个参数!)才是你真正的往下传数据的缓冲区,也就是说你的文件中的数据应该放在第5、6个参数中!!!

mdl获取的是deviceiocontrol中输出缓冲区参数,他的输入缓冲区仍采用buffer方式,你可以在里面放一些无关紧要的参数
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2003-04-05 13:47
给你贴一下我的用户态方式:
// 声明
#define IOCTL_WRITE_DATABUFFER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
// 注意,是METHOD_IN_DIRECT

/////////////////////////////////////////////////////////////////////////////
//写数据

//返回值->如果例程执行成功就返回true,否则为false

bool WriteDataBuffer( ULONG Reg, PVOID pData, ULONG ulSize )
{
DWORD code;
if( (Reg < 0x10000) && ( pData != NULL ) && ( hCard != NULL ) )
code = IOCTL_WRITE_DATABUFFER;
else
return false;

// 构造传输的数据变量
const ULONG ulNum = 2;
ULONG InData[ulNum];
InData[0] = Reg;
InData[1] = ulSize;

//写数据
DWORD ReturnBytes;
if( DeviceIoControl( hCard, code, InData, 4 * ulNum, pData, ulSize, &ReturnBytes, NULL) )
return true;
else
return false;
}
早起早睡 精神百倍
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2003-04-05 13:50
当然,我获取mdl大小的方式不好,你应该采用mdl指定的例程。我是因为我的驱动用的还可以,也就懒得改了,呵呵

[编辑 -  4/5/03 by  mailme]
早起早睡 精神百倍
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2003-04-05 14:12
当然,我获取mdl大小的方式不好,你应该采用mdl指定的例程。我是因为我的驱动用的还可以,也就懒得改了,呵呵

[编辑 -  4/5/03 by  mailme]


太谢谢你了,果然是这样的。
但是我看到书上都是说METHOD_IN_DIRECT方式下,输入缓冲区的MDL放在IRP首部的MDLADDRESS域中,或者说来自调用者的IOCTL数据使用直接I/O传递,从驱动程序回到调用者的数据通过一个中间系统空间缓冲区传递。这里意思应该是第三第四个参数对应到MDL呀,难道我理解有误,能说说是怎么回事吗?
真的很感谢你。
BTW,我要追加分数怎么加?谢谢!
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2003-04-05 14:41
[quote]
太谢谢你了,果然是这样的。
但是我看到书上都是说METHOD_IN_DIRECT方式下,输入缓冲区的MDL放在IRP首部的MDLADDRESS域中,或者说来自调用者的IOCTL数据使用直接I/O传递,从驱动程序回到调用者的数据通过一个中间系统空间缓冲区传递。这里意思应该是第三第四个参数对应到MDL呀,难道我理解有误,能说说是怎么回事吗?
真的很感谢你。
BTW,我要追加分数怎么加?谢谢!


我不记得怎么从驱动程序的向调用者返回数据了,你可以试试用输入缓冲区的数据返回,也许可行,毕竟都是buffer方式嘛
呵呵,至于追加分数我看就不用咯,要把好钢用在刀刃上啊,继续努力吧,呵呵
早起早睡 精神百倍
上一页 下一页
游客

返回顶部