Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
阅读:1098回复:1

diskperf例子中IRP_MJ_READ/IRP_MJ_WRITE请求处理出错,HELP ME!

楼主#
更多 发布于:2003-01-16 13:49
typedef struct {
LARGE_INTEGER   dwSecBeg;
DWORD dwSecCnt;
}SPLIT_TAB,*PSPLIT_TAB;

NTSTATUS DispatchReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

DWORD  TotalLen = Irp->MdlAddress ?  MmGetMdlByteCount(Irp->MdlAddress) : 0;
if(TotalLen == 0)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return  STATUS_SUCCESS;
}

   PIO_STACK_LOCATION stack     = IoGetCurrentIrpStackLocation(Irp);
PIO_STACK_LOCATION nextstack = IoGetNextIrpStackLocation(Irp);

KIRQL oldirql;
KeAcquireSpinLock(&pdx->RWSpinLock, &oldirql);    // RWSpinLock已经初始化

int MapNum = Split(pdx->pmtst,stack->Parameters.Read.ByteOffset,TotalLen);

KeReleaseSpinLock(&pdx->RWSpinLock, oldirql);

if(MapNum != 1)
{
KeBugCheckEx(0xffff0001,0,0,0,0);
}

KeAcquireSpinLock(&pdx->RWSpinLock, &oldirql);

LARGE_INTEGER  dwBeg = pdx->pmtst[0].dwSecBeg;

KeReleaseSpinLock(&pdx->RWSpinLock, oldirql);

stack->Parameters.Read.ByteOffset = dwBeg;

*nextstack = *stack;

IoSetCompletionRoutine(Irp,DispatchIoCompletion,
NULL,TRUE,TRUE,TRUE);

return IoCallDriver(pdx->TargetDeviceObject,Irp);
}

NTSTATUS
DispatchIoCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP           Irp,
IN PVOID          Context
)
{
    if (Irp->PendingReturned) {
        IoMarkIrpPending(Irp);
    }
    return STATUS_SUCCESS;
}

DWORD  Split(PSPLIT_TAB pst,LARGE_INTEGER  dwSecBeg ,DWORD dwSecCnt)
{
pst[0].dwSecBeg = dwSecBeg;
pst[0].dwSecCnt = dwSecCnt;
return 1;
}

粗体字部分不加上,一切正常!
粗体字部分加上后,发现数据读写错误,究竟是哪里错了?
Help me!
Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
沙发#
发布于:2003-01-16 13:50
help me!
游客

返回顶部