当前位置: 代码迷 >> 驱动开发 >> 真是一百年遇不到的怪有关问题,会驱动的都看看
  详细解决方案

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

热度:16   发布时间:2016-04-28 10:58:34.0
真是一百年遇不到的怪问题,会驱动的都看看
用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方式。
  相关解决方案