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

DeviceIoControl()怎么用的

楼主#
更多 发布于:2004-09-07 17:02
DeviceIoControl(hUsb,
USB_IOCTL_WRITE,
&bufInput,  //输入数据地址
sizeof(bufInput),
NULL,
0,
&nOutput, 
NULL)

用这表示向驱动"写"数据,是否是这样的?

DeviceIoControl(hUsb,
USB_IOCTL_READ,
NULL,  
0,
&bufOutput, //输出数据地址
sizeof(bufOutput),
&nOutput,
NULL)

"读"是这样表示的吗?
看了MSDN,估计是E文太差就是不理解!nOutput又是对应什么
解释一下吗?

对应驱动的DeviceControl()我还不清楚怎么搞呢
久久我把神啊


wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-09-07 18:01
MSDN不是很清楚了
一个读一个写
nOutput一般存放实际写的字节数,由STATUS.INFORMATION来决定
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
archill
驱动牛犊
驱动牛犊
  • 注册日期2004-07-28
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-07 18:37
STATUS.INFORMATION

是指驱动下的吗
还是 kIRP::iNFORMATION()????

我现在只要通过BUFFERED方式
读写控制字符
能给个DEVICEIOCONTROL()
和DEVICECONTROL()代码吗?

谢谢了
zhouandraw
驱动牛犊
驱动牛犊
  • 注册日期2004-03-19
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-08 09:10
假设你使用DS编写驱动程序要实现:将bufInput中的数据写入设备偏移地址为0x08的寄存器中。

在你的应用程序中有如下代码:
ULONG nOutput;
ULONG      bufInput;

DeviceIoControl(hUsb,
USB_IOCTL_WRITE,
&bufInput,  //输入数据地址
sizeof(bufInput),
NULL,
0,
&nOutput, 
NULL);
在你的驱动程序例程中有如下代码:
NTSTATUS USBDevice::USB_IOCTL_WRITE_Handler(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG buff;
ULONG fwLength=0;
buff=*(ULONG*)I.IoctlBuffer(); // 拷贝从应用程序得到的数据到驱动程序局部数据区
m_MemoryRange0.outd(0x08,buff);
I.Information() = fwLength; // 返回信息长度
return status;
}
扒皮周
shiqiao
驱动牛犊
驱动牛犊
  • 注册日期2004-07-18
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-08 09:55
这不是DDK里的一个函数吗!DDK文档里有注释的!应该是应用程序何驱动通信的关键吧!
hollychen2002
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2005-11-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-09 20:11
BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);
如果要向驱动写数据,那就将lpInBuffer指向数据,nInBufferSize是数据量。你在调用DeviceIoControl时系统会将lpInBuffer所指的数据copy进去,然后驱动就可以访问这些数据了。

如果要从驱动读书据,将lpOutBuffer指向你的buffer,nOutBufferSize指明buffer的大小。然后你在调用DeviceIoControl后系统会将数据写入buffer中,写入(读出)的数据量为lpBytesReturned

如果想了解driver是怎么操作的,请参考walter oney的 programming the microsoft windows Driver Model,第九章
要学做事,先学做人
游客

返回顶部