阅读:1724回复:1
请教一个关于scsi接口的虚拟磁盘在win xp系统下地问题
我开发了一个虚拟磁盘驱动,在windows上加载一个虚拟磁盘,虚拟磁盘接口是scsi的
虚拟磁盘能正常加载,并且能读取写入内容,但是在win xp上有个问题无法解决, 当上层应用每次调用ReadFile()读取超过1m内容的时候,调用会失败 在驱动是MmGetSystemAddressForMdlSafe ()在超过1m的时候, 返回的是NULL 我这驱动在win2003没问题,就在win xp上有问题,请大侠帮帮我 我也看过filedisk的驱动代码,filedisk程序在win xp上无此问题 下面是出错代码 VOID VDiskEvtSrbReadEx( __in WDFWORKITEM WorkItem, __in int CmdType ) { PAGED_CODE(); WDFDEVICE hVDiskDevice = (WDFDEVICE)WdfWorkItemGetParentObject(WorkItem); P_VDISK_WORK_ITEM_CONTEXT pWorkItemContext = VDiskGetWorkItemContext(WorkItem); WDFREQUEST hRequest = pWorkItemContext->hRequest; PSCSI_REQUEST_BLOCK pSrb = pWorkItemContext->pSrb; WdfObjectDelete(WorkItem); P_VDISK_DEVICE_DATA pVDiskDevExt = EnumGetVDiskDevExtData(hVDiskDevice); PCDB pCdb = (PCDB)&pSrb->Cdb[0]; PIRP pIrp = (PIRP)pSrb->OriginalRequest; PCHAR pDataBuffer = (PCHAR)MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);// 如果读取超过 1M的数据,这里pDataBuffer 就会使NULL if((!pDataBuffer) || (!MmIsAddressValid(pDataBuffer))) { pSrb->DataTransferLength = 0; pSrb->SrbStatus = SRB_STATUS_ERROR; WdfRequestComplete(hRequest, STATUS_INVALID_DEVICE_REQUEST); return; } |
|
|
沙发#
发布于:2012-03-18 21:38
自己找到原因了
原来是 MaximumTransferLength MaximumPhysicalPages 设置的太小的缘故 |
|
|