| 
			 
					阅读:1513回复:12
				 
				再放50分求解! :)关于处理对IRP_MJ_DEVICE_IOCTL主功能代码的处理!
					   IRP_MJ_DEVICE_IOCTL 在什么情况下处理??
 
							就是说 应用程序在处理什么情况下, 上层的驱动会对这个主功能代码进行处理? 而处理IRP_MJ_DEVICE_IOCTL 时,需要从哪些方面来确定 需要处理哪些 IOCTL_XXX 或者说在头文件里需要设置哪些IOCTL_XXX ? :( [编辑 - 1/13/03 by wavelight]  | 
	|
					
						最新喜欢:
  | 
	
| 
			 沙发# 
								发布于: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 以后还会有问题, 还请继续指教! 一同谢过!! :)  | 
	|
					
						
  |