阅读:1099回复:1
diskperf例子中IRP_MJ_READ/IRP_MJ_WRITE请求处理出错,HELP ME!
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! |
|
沙发#
发布于:2003-01-16 13:50
help me!
|
|