阅读:1170回复:4
请教关于DeviceControl的问题。。。
论坛上发现很多人提到在应用程序中使用DeviceIoControl与驱动通讯时报参数无效(87),说是驱动的派遣函数DeviceControl没写对。
我参照《WIN2000驱动程序设计》--翟洪涛 里的代码也不行啊,不知道还要处理什么?我也是新手,望过来人带带路,谢谢。 我的派遣函数如下: NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS status; ULONG controlCode; // IOCTL请求代码 PIO_STACK_LOCATION pIrpStack; //堆栈区域存储了用户缓冲区信息 pIrpStack = IoGetCurrentIrpStackLocation(Irp); // 取出IOCTL请求代码 controlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode; switch (controlCode) { case SAMPLE_IOCTL_Disable: Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; status = STATUS_ACCESS_DENIED; return status; break; case SAMPLE_IOCTL_Enable: Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; status = STATUS_SUCCESS; return status; break; default: // 驱动程序收到了未被承认的控制代码 status = STATUS_INVALID_DEVICE_REQUEST; break; } pIrp->IoStatus.Information = 0; // 数据没有传输 IoCompleteRequest( Irp, IO_NO_INCREMENT ) ; return status; } 其中: #define SAMPLE_IOCTL_Disable CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define SAMPLE_IOCTL_Enable CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) |
|
沙发#
发布于:2005-02-04 13:39
大家都放假啦?怎么没人响应?
自己UP一下先。。。 |
|
板凳#
发布于:2005-02-04 13:56
是不是你应用层打开你的设备时就没有成功呀。
|
|
地板#
发布于:2005-02-04 15:02
建议找一个例子对比一下看看,例如filemon,里面都有现成的代码,参考一下其中DeviceIoControl的代码。
|
|
|
地下室#
发布于:2005-02-04 15:04
首先你要确认你驱动的代码有没有被调用,下断点看看,不然的话,你还得在你的应用程序里找找问题.
而且我认为大多是应用层的问题. |
|
|