| 
			 
					阅读:1583回复:9
				 
				关于DeviceIoControl的问题,请大家帮忙看看!!
					我的驱动在利用DeviceIoControl进行交互的时候,数据可以从应用层传到驱动里面,但是从在驱动里面对传入该缓存进行操作后,数据却不能返回到应用层,也就是交互后读该缓存值却没有变化。
 
							定义一个头文件,驱动和应用层文件共用: #define constIOCTL 0x11 typedef struct Opendsp { int IN1; int OUT1; PUCHAR MMIOAddrKernel; PUCHAR SDRAMAddrKernel; } Opendsp; ........................... ............................. 应用层程序: Opendsp TMIF; TMIF.OUT1 = 5;/*初始化传入的变量*/ TMIF.IN1 = 6; if ( DeviceIoControl ( Driver, constIOCTL, (PVOID)&TMIF, sizeof( Opendsp) , (PVOID)&TMIF, sizeof( Opendsp) , &BytesReturned, NULL ) != TRUE ) { AfxMessageBox(\"与驱动通信错误!\"); } 驱动层: PIO_STACK_LOCATION IOStackLocation; PVOID IOParameters = Irp->AssociatedIrp.SystemBuffer; ULONG ReturnInformation = 0; IOStackLocation = IoGetCurrentIrpStackLocation ( Irp ); ............... switch ( IOStackLocation->Parameters.DeviceIoControl.IoControlCode ) { case constIOCTL : { Opendsp* TMIF = (Opendsp*)IOParameters; TMIF->OUT1 = 2;/*在这里改变传入的变量*/ TMIF->IN1 = 3; ReturnInformation = sizeof(Opendsp); } break; } Irp->IoStatus.Information = ReturnInformation; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest ( Irp, IO_NO_INCREMENT ); .......................... 最后读出的TMIF.OUT1和TMIF.IN1仍旧和在应用层初始化的值一样.跟踪时发现数据已经传到驱动里面了.但是里面改变了值,应用层却接收不到.郁闷谢谢各位帮忙了.  | 
	|
| 
			 沙发# 
								发布于:2003-05-16 12:15				
			
					兄弟,你不给DeviceIoControl()填lpOutBuffer参数,怎么能传回值呢?参数当然不便。				 
							 | 
	|
| 
			 板凳# 
								发布于:2003-05-16 12:29				
			
					要用Buffer I/O 方式,这种方式下,I/O 管理器对Input Output Buffer 公用一块缓冲
 
							Irp->AssociatedIrp.SystemBuffer 作为交换缓冲。  | 
	|
					
						
  | 
	
| 
			 地板# 
								发布于:2003-05-16 13:16				
			
					你的iocode定义有问题,把iocode 定义为0x10试试
 
							 | 
	|
| 
			 地下室# 
								发布于:2003-05-16 13:54				
			
					hm790415谢谢你的答复,改掉后果然就好了。呵呵~!可是这是什么原因啊,与传输的方式有关吗?				 
							 | 
	|
| 
			 5楼# 
								发布于:2003-05-16 14:37				
			
					只知其然,不知其所以然,悲哀!				 
							 | 
	|
| 
			 6楼# 
								发布于:2003-05-16 16:37				
			
					robin_wxg你能告诉我怎么回事情么
 
							 | 
	|
| 
			 7楼# 
								发布于:2003-05-16 23:04				
			
					You should refer to the layout of I/O control code.
 
							Bit 0 and 1 define the transfer type of your I/O // // Define the method codes for how buffers are passed for I/O and FS controls // #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 #define METHOD_NEITHER 3 If you define your I/O control code as 0x11, the system will use direct I/O. I think you\'d better use the CTL_CODE micro to define your private I/O control code.  | 
	|
| 
			 8楼# 
								发布于:2003-05-19 13:30				
			
					iocode的定义为32位,分成四个部分,各自有含义。
 
							你去查看一下ddk中关于iocode定义的描述。 我用的是xpddk,它的路径:Kernel-Mode Driver Architecture->reference->system-defined I/O Function Code->IRP Function Codes and IOCTLs->Defining I/O Control Codes  | 
	|
| 
			 9楼# 
								发布于:2003-05-22 14:42				
			
					谢谢各位的回复啊!但是我怎么找不到给分的地方啊?? 
							[编辑 - 5/22/03 by airy1727]  | 
	|