阅读:1369回复: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] |
|