阅读:1034回复:5
驱动程序自定义例程的问题!!!在驱动程序自定义例程中的输入参数验证语句: if(I.IoctlOutputBufferSize() || I.IoctlInputBufferSize() || I.IoctlBuffer()) __leave; 中,验证输入和输出缓冲区的大小是否为零(我自己的看法),而在应用程序中: bRet = DeviceIoControl( hDev, //设备句柄 dwIoCtrlCode, //所要执行的操作命令码 NULL, //输入缓冲区 0, // 输入缓冲区的空间大小 NULL, // 接收缓冲区 0, //接收缓冲区的空间大小 &dwReturned, //实际所接收的数据个数 NULL //异步结构 ); DeviceIoControl()函数传递给应用程序的输入和输出缓冲区的大小就是零,这是怎么回事?会不会出错呀?还是我的理解有错? 我是用DS开发的驱动程序,仅仅控制测试灯的开关!! 期待各位的指导!!!先谢啦!! |
|
|
沙发#
发布于:2004-06-19 08:37
<Microsoft Windows驱动程序模型设计>里讲,驱动程序有三中方法访问用户缓冲区:Buffer,Direct和Neithor.
1.设备可以定义一种缓冲方式,在AddDevice(): PDEVICE_OBJECT fdo; IoCreateDevice(..., &fdo); fdo->Flags |= DO_BUFFERED_IO; <or> fdo->Flags |= DO_DIRECT_IO; <or> fdo->Flags |= 0; 2. IOCTL也可以定义一种缓冲方式: #define IOCTL_USB_RESET_DEVICE CTL_CODE (FILE_DEVICE_UNKNOWN,1000,METHOD_BUFFERED, \FILE_ANY_ACCESS) 不同的缓冲方式,将来对应的数据缓冲地址在IRP的不同的域里面. |
|
板凳#
发布于:2004-06-19 09:37
大侠,能不能说得再清楚一点,能解释一下我给的那两句话吗?先谢啦!
|
|
|
地板#
发布于:2004-06-21 12:52
你这里用DeviceIoControl发送IOCTL,先要明白你的IOCTL是如何定义的.
如果指定是METHOD_IN_DIRECT或METHOD_OUT_DIRECT操作方式,则I/O管理器为你的请求使用的输出缓冲区创建一个MDL。就是说驱动里面是从Irp->MdlAddress获得用户态数据缓冲区; 如果指定的是METHOD_BUFFERED方式,I/O管理器就会在Irp->AssociatedIrp.SystemBuffer获得或返回用户缓冲区. 至于你这里为什么输入输出缓冲区大小为零,我没用DS做过,可能帮不了什么!你从驱动端调试下看看吧! |
|
地下室#
发布于:2004-06-22 08:34
非常感谢 neworcom 的指导!!!!
|
|
|
5楼#
发布于:2004-06-22 08:57
wanggang508过奖!谈不上指导,大家共同努力! ;)
|
|