airy1727
驱动牛犊
驱动牛犊
  • 注册日期2003-01-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分141分
  • 威望25点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1369回复:9

关于DeviceIoControl的问题,请大家帮忙看看!!

楼主#
更多 发布于:2003-05-16 11:58
我的驱动在利用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仍旧和在应用层初始化的值一样.跟踪时发现数据已经传到驱动里面了.但是里面改变了值,应用层却接收不到.郁闷谢谢各位帮忙了.
robin_wxg
驱动小牛
驱动小牛
  • 注册日期2003-02-10
  • 最后登录2009-09-21
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-16 12:15
兄弟,你不给DeviceIoControl()填lpOutBuffer参数,怎么能传回值呢?参数当然不便。
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-16 12:29
要用Buffer I/O 方式,这种方式下,I/O 管理器对Input Output Buffer 公用一块缓冲
Irp->AssociatedIrp.SystemBuffer 作为交换缓冲。
你的认可是对我最大的鼓励!
hm790415
驱动牛犊
驱动牛犊
  • 注册日期2002-06-26
  • 最后登录2003-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-16 13:16
你的iocode定义有问题,把iocode 定义为0x10试试
airy1727
驱动牛犊
驱动牛犊
  • 注册日期2003-01-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分141分
  • 威望25点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-16 13:54
hm790415谢谢你的答复,改掉后果然就好了。呵呵~!可是这是什么原因啊,与传输的方式有关吗?
robin_wxg
驱动小牛
驱动小牛
  • 注册日期2003-02-10
  • 最后登录2009-09-21
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-16 14:37
只知其然,不知其所以然,悲哀!
airy1727
驱动牛犊
驱动牛犊
  • 注册日期2003-01-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分141分
  • 威望25点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-16 16:37
robin_wxg你能告诉我怎么回事情么
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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.
hm790415
驱动牛犊
驱动牛犊
  • 注册日期2002-06-26
  • 最后登录2003-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
airy1727
驱动牛犊
驱动牛犊
  • 注册日期2003-01-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分141分
  • 威望25点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-22 14:42
谢谢各位的回复啊!但是我怎么找不到给分的地方啊??

[编辑 -  5/22/03 by  airy1727]
游客

返回顶部