首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

真是一百年遇不到的怪有关问题,会驱动的都看看

2012-04-04 
真是一百年遇不到的怪问题,会驱动的都看看用DeviceIoControl和驱动通信, 如果这样 DeviceIoControl( handl

真是一百年遇不到的怪问题,会驱动的都看看
用DeviceIoControl和驱动通信, 如果这样 DeviceIoControl( handle,MY_IOCTL_READ,NULL,0, outData,
20,&l,NULL));
 驱动程序中的 Irp->MdlAddress 一直等于NULL , 
 如果这样 DeviceIoControl( handle,MY_IOCTL_READ,inputData,6, outData,
20,&l,NULL));返回的结果竟然是 ,outData等于inputData中的前6个字节,真是怪了,
 比如 ,inputData="123456789"; outData="123456"; 如果我把DeviceIoControl 输入的长度 从6变到 5;
返回outData="12345",问了个老师,他说也怪了,不知道有没有人遇到这种情况 ;


驱动如下 :
char* dataBuffer="这到底怎么搞的,我学驱动就被你搞家败了";

 case MY_IOCTL_READ : 
if ( Irp->MdlAddress ) {
outDataAddress=MmGetSystemAddressForMdlSafe(Irp->MdlAddress, 
  NormalPagePriority); 
RtlCopyMemory (outDataAddress,dataBuffer,OutputLength); }
Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information =OutputLength;
break;


属性是这样的,不知道是不是属性的问题
device_object->Flags |=DO_DIRECT_IO|DO_POWER_PAGABLE;
 device_object->Flags &= ~DO_DEVICE_INITIALIZING

[解决办法]
建议LZ查询一下相关API函数的具体使用方法,应该可以解决问题!
[解决办法]
lz是安徽人?友情帮顶。
[解决办法]
应该说这属于Windows驱动的基本知识。对于Device Control请求,有三种操作缓冲区的方式,想必大家都知道。其设置方式在定义IOCTL Code的宏定义CTL_CODE()第三个参数中。 我仔细看了你的代码,你给出的属性设置代码是device_object->Flags |=DO_DIRECT_IO|DO_POWER_PAGABLE, 这里定义的是Read 和 Write请求的缓冲区操作方式,而不是Device Control请求的缓冲区操作方式。你查查代码,把MY_IOCTL_READ的定义贴上来,看看是哪种缓冲区操作。我估计是Buffered方式。

热点排行