阅读:1334回复:5
DeviceIoControl()怎么用的
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()我还不清楚怎么搞呢 久久我把神啊 |
|
沙发#
发布于:2004-09-07 18:01
MSDN不是很清楚了
一个读一个写 nOutput一般存放实际写的字节数,由STATUS.INFORMATION来决定 |
|
|
板凳#
发布于:2004-09-07 18:37
STATUS.INFORMATION
是指驱动下的吗 还是 kIRP::iNFORMATION()???? 我现在只要通过BUFFERED方式 读写控制字符 能给个DEVICEIOCONTROL() 和DEVICECONTROL()代码吗? 谢谢了 |
|
地板#
发布于: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; } |
|
|
地下室#
发布于:2004-09-08 09:55
这不是DDK里的一个函数吗!DDK文档里有注释的!应该是应用程序何驱动通信的关键吧!
|
|
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,第九章 |
|
|