阅读:1408回复:12
再放50分求解! :)关于处理对IRP_MJ_DEVICE_IOCTL主功能代码的处理!
IRP_MJ_DEVICE_IOCTL 在什么情况下处理??
就是说 应用程序在处理什么情况下, 上层的驱动会对这个主功能代码进行处理? 而处理IRP_MJ_DEVICE_IOCTL 时,需要从哪些方面来确定 需要处理哪些 IOCTL_XXX 或者说在头文件里需要设置哪些IOCTL_XXX ? :( [编辑 - 1/13/03 by wavelight] |
|
最新喜欢:ABUABU
|
沙发#
发布于:2003-01-13 09:08
来人帮我啊 :(
|
|
|
板凳#
发布于:2003-01-13 09:40
不太明白你的意思 :(
|
|
|
地板#
发布于:2003-01-13 09:53
兄弟,你的表达有问题呀:
IRP_MJ_DEVICE_CONTROL是一个驱动程序,除了CreateFile, ReadFile, WriteFile以外,提供的win32程序与驱动程序的接口, 当用户调用DeviceIoControl函数时,它依照你定义的IOCTL创建一 个IRP发送给驱动程序,在由驱动程序处理 ,IOCTL是由你自己定义的 例如: #define IOCTL_IS_FIFO_FULL \\ CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 0x806, \\ METHOD_BUFFERED, FILE_ANY_ACCESS ) CTL_CODE的第一个参数是你用IoCreateDevice时,用的设备名,可以改,0x806可以是0x800到0xfff之间的任意值, 有什么不懂,在写信给我,zhashaofeng@sohu.com 对了,还有件事,以便我以后也可以闻不懂的问题,但由于我也没多少分了,所以请给分,我知道的一定会帮你,大家交个朋友 |
|
地下室#
发布于:2003-01-13 10:26
应该是win32 的用户态的DeviceIoControl发出的
IOCTL |
|
5楼#
发布于:2003-01-13 11:04
IOCTL是由你自己定义的 谢谢你的详细解答 :) 另外,我应该从设备的哪些信息来确定 我需要定义哪些IOCTL ? 先在这里给分, 搞清楚问题 再开贴给分! :) |
|
|
6楼#
发布于:2003-01-13 11:15
编写驱动程序时,我们需要设计一系列IOCTL操作,使得应用程序可以使用这些IOCTL操作与驱动程序对话。IOCTL操作中的数值被驱动程序解释。
IOCTL定义都放到一个专用的头文件中。IOCTLS.H的头文件中,但是 需要处理哪些 IOCTL_XXX 或者说在头文件里需要设置哪些IOCTL_XXX ?这个问题我也很想知道。楼上的楼上的朋友,好象没有回答到问题的重点。 |
|
7楼#
发布于:2003-01-13 11:55
没有一定要处理的IOCTL,问题是你的驱动程序想要提供给WIN32应用程序一个什么样的接口,
例如: 如果我的WIN32应用程序想要知道当前并口设备一个并口的端口地址 那么我就可以任意定义一个IOCTL: 如; #define IOCTL_GET_PORT_ADDRESS \\ CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 0x806, \\ METHOD_BUFFERED, FILE_ANY_ACCESS ) 在IRP_MJ_DEVICE_CONTROL对应的回调例程中,就可以对应写出 PIO_STACK_LOCATION pIrpStack; pIrpStack = IoGetCurrentIrpStackLocation(Irp); PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; PLPTPORT pReturn; switch(pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_GET_PORT_ADDRESS: { pReturn = (PLPTPORT)Irp->AssociatedIrp.SystemBuffer; pReturn->PortBase = pDevExt->PortBase; pReturn->PortLength = pDevExt->PortLength; Irp->IoStatus.Information = sizeof(LPTPORT); Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } PLPTPORT是一个自己定义的结构 typedef _LPTPORT { ULONG PortBase; ULONG PortLength; }LPTPORT, *PLPTPORT; 记住一定要用IoCompleteRequest将IRP完成; 在WIN32程序中,将上面定义的IOCTL和定义的数据结构加进去 然后用 LPTPORT Port; status = DeviceIoControl(hDevice, IOCTL_GET_PORT_ADDRESS, NULL, 0, &Port, sizeof(LPTPORT), &bR, NULL); 然后就可以得到当前并口的地址了 也就是说看你的驱动程序要做什么,才定义什么接口,没有一定要定义的接口 对了说一点,我今天下午请假了,所以,你还有什么问题,就发给我 我晚上给你回答,ok???,对了还有你有没有中文的pci规格说明的资料,本人英文差,看英文速度慢,有的话发给我 zhashaofeng@sohu.com |
|
8楼#
发布于:2003-01-13 15:35
再次谢谢 zhazha818617 的详细解答! :)
给你发了 PM ,收到没有? 关于这个还有最后一点: 对于一些通用设备,是不是只能用系统定义的IOCTL_XXX ,或者 不处理IOCTL ?? 不然别人不知道你的驱动定义了什么IOCTL啊 ?是吧? :) |
|
|
9楼#
发布于:2003-01-14 08:30
不对,IOCTL可以是自己定义的,在驱动程序给别人后,同时,还可以给一个DLL,那里面写出了这个驱动程序提供的接口函数,这样别人就可以根据你的DLL使用你的驱动接口,不需要用你知道你写了什么IOCTL
|
|
10楼#
发布于:2003-01-14 11:10
50分就这么跑了,心痛阿,才两天没有来。555 :P :D
|
|
11楼#
发布于:2003-01-14 11:28
50分就这么跑了,心痛阿,才两天没有来。555 :P :D :D 还有一些问题, 帮我解答了 还会继续放分 :) |
|
|
12楼#
发布于:2003-01-14 11:30
zhazha818617 ,谢谢你的解答!!
我已 另外开贴 给分, 进去留名! :D :D 以后还会有问题, 还请继续指教! 一同谢过!! :) |
|
|