happylife365
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2013-08-17
  • 粉丝1
  • 关注0
  • 积分80分
  • 威望394点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1601回复:1

请教一个关于scsi接口的虚拟磁盘在win xp系统下地问题

楼主#
更多 发布于:2012-03-18 18:38
我开发了一个虚拟磁盘驱动,在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;
}

快快乐乐过日子,潇潇洒洒闯人生。
happylife365
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2013-08-17
  • 粉丝1
  • 关注0
  • 积分80分
  • 威望394点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2012-03-18 21:38
自己找到原因了
原来是
MaximumTransferLength
MaximumPhysicalPages    
设置的太小的缘故
快快乐乐过日子,潇潇洒洒闯人生。
游客

返回顶部