wildluo
驱动牛犊
驱动牛犊
  • 注册日期2003-07-10
  • 最后登录2003-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1660回复:4

DS中关于I.ioctlBuffer()函数一问

楼主#
更多 发布于:2003-09-16 10:52
在应用程序中调用下面的函数,带一个输入缓冲区指针bufInput和一个输出缓冲区指针bufOutput作为参数。
DeviceIoControl(hDevice, D12_5402DRV_IOCTL_GET_DEVICE_DESCRIPTOR, bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)

在驱动程序DeviceControl函数中得到IRP包实例I。该实例调用I.ioctlBuffer()函数时返回指针对应应用程序中的哪个指针呢?
请教。谢谢!
Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-17 11:12
刚才回复帖子之后总觉得不妥,回去看了一眼书再来解答。
对于DeviceIoControl的4种方式,METHOD_BUFFERD方式可用这种方法
,可能你用的也是这种吧,但是对于I.IoctlBuffer()做输出缓冲区,也就是返回给应用程序的缓冲区时,必须要指定I.Information,
他代表实际返回给应用程序的字节数,系统会根据I.Information,将输出缓冲区copy到应用程序。
  如果你的DeviceIoContrl中既有Inbuffer,又有OutBuffer的话,
I.IoctlBuffer的大小是Inbuffersize和outbuffersize中大的那一个,而且驱动程序此时必须先读Inbuffer,再写Outbuffer,具体情况我觉得你可以看看武安河写的\"WDM设备驱动程序开发\"一书
Tomorrow Never Die
Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-17 10:26
就是这个意思。对于你来说他只是名字一样,其实我理解还是有两个读写缓冲区。
Tomorrow Never Die
wildluo
驱动牛犊
驱动牛犊
  • 注册日期2003-07-10
  • 最后登录2003-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-09-16 14:03
也就是说跟我的代码相关的?

如果我在驱动的DeviceControl()函数中有如下代码(pBuffer出现
在赋值操作符的左边)
PVOID pBuffer = I.IoctlBuffer();
*pBuffer=2;
则pBuffer指向bufOutput.

如果有下面的代码(pBuffer出现在赋值操作符的右边)

PVOID pBuffer = I.IoctlBuffer();
char a = *pBuffer;
则pBuffer指向bufInput.

我的理解对吗?
会不会出现既读又写的情况?那样的话岂不是没法区别了。

Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-09-16 11:17
如果你是读这块缓冲区,他就是bufInput,如果你写这块缓冲区,他就是bufOutput,也就是给应用程序返回的缓冲区,函数名都一样,是I.ioctlBuffer()
Tomorrow Never Die
游客

返回顶部