用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方式。