wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1408回复:12

再放50分求解! :)关于处理对IRP_MJ_DEVICE_IOCTL主功能代码的处理!

楼主#
更多 发布于:2003-01-12 14:40
   IRP_MJ_DEVICE_IOCTL 在什么情况下处理??
   就是说 应用程序在处理什么情况下, 上层的驱动会对这个主功能代码进行处理?
  
    而处理IRP_MJ_DEVICE_IOCTL 时,需要从哪些方面来确定 需要处理哪些 IOCTL_XXX 或者说在头文件里需要设置哪些IOCTL_XXX ? :(

[编辑 -  1/13/03 by  wavelight]

最新喜欢:

ABUABUABUABU
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-13 09:08
来人帮我啊  :(
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
h13
h13
驱动老牛
驱动老牛
  • 注册日期2002-07-10
  • 最后登录2008-10-24
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-13 09:40
不太明白你的意思 :(
<table> [color=#8040FF]神,常虚以凝而灵明湛定 气,常静以养而充盈流通[/color] </table>
zhazha818617
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于: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

对了,还有件事,以便我以后也可以闻不懂的问题,但由于我也没多少分了,所以请给分,我知道的一定会帮你,大家交个朋友
ambercctv
驱动牛犊
驱动牛犊
  • 注册日期2002-11-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-13 10:26
应该是win32 的用户态的DeviceIoControl发出的
IOCTL
wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-13 11:04
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

对了,还有件事,以便我以后也可以闻不懂的问题,但由于我也没多少分了,所以请给分,我知道的一定会帮你,大家交个朋友

 谢谢你的详细解答  :)
 另外,我应该从设备的哪些信息来确定 我需要定义哪些IOCTL ?

  先在这里给分, 搞清楚问题 再开贴给分!  :)
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
sz5217
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-13 11:15
编写驱动程序时,我们需要设计一系列IOCTL操作,使得应用程序可以使用这些IOCTL操作与驱动程序对话。IOCTL操作中的数值被驱动程序解释。
IOCTL定义都放到一个专用的头文件中。IOCTLS.H的头文件中,但是
需要处理哪些 IOCTL_XXX 或者说在头文件里需要设置哪些IOCTL_XXX ?这个问题我也很想知道。楼上的楼上的朋友,好象没有回答到问题的重点。
zhazha818617
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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
wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-13 15:35
再次谢谢 zhazha818617 的详细解答!  :)

给你发了 PM ,收到没有?

关于这个还有最后一点:  对于一些通用设备,是不是只能用系统定义的IOCTL_XXX  ,或者 不处理IOCTL ??

   不然别人不知道你的驱动定义了什么IOCTL啊 ?是吧?
     :)
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
zhazha818617
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-14 08:30
不对,IOCTL可以是自己定义的,在驱动程序给别人后,同时,还可以给一个DLL,那里面写出了这个驱动程序提供的接口函数,这样别人就可以根据你的DLL使用你的驱动接口,不需要用你知道你写了什么IOCTL
violet_jj
驱动小牛
驱动小牛
  • 注册日期2002-11-07
  • 最后登录2003-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-14 11:10
50分就这么跑了,心痛阿,才两天没有来。555 :P :D
wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-14 11:28
50分就这么跑了,心痛阿,才两天没有来。555 :P :D


 :D

还有一些问题, 帮我解答了 还会继续放分  :)
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
wavelight
驱动老牛
驱动老牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-14 11:30
zhazha818617 ,谢谢你的解答!!

我已 另外开贴 给分, 进去留名!  :D :D

以后还会有问题, 还请继续指教!  一同谢过!! :)
<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我cool 故我在!<br></b></font></table> [img]http://www.driverdevelop.com/forum/upload/wavelight/2002-12-13_1.gif[/img]<table style="filter: glow(color=red, strength=6)"><br><font color=white><b>我在 故我cool!<br></b></font></table>
游客

返回顶部