阅读:2347回复:14
熟悉diskperf的高手看过来,有个问题我始终解不开
在DiskPerfReadWrite例程中,我想过滤掉IRP_MJ_READ写请求,代码如下
switch(Irp->MinorFunction) { case IRP_MJ_READ: if(isMoveDisk == TRUE) {Irp->IoStatus.Status= STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp,IO_NO_INCREMENT); return STATUS_INVALID_DEVICE_REQUEST; break; } case IRP_MJ_WRITE: {return DiskPerfSendToNextDriver(DeviceObject, Irp); break; } } 没次执行读请求时,并且if条件满足,但为什么不往if函数体中执行而却执行DiskPerfSendToNextDriver这个函数呢 |
|
沙发#
发布于:2005-03-15 15:06
调试一下看看吧!
|
|
|
板凳#
发布于:2005-03-15 15:20
我调试了,所以才问的
|
|
地板#
发布于:2005-03-15 15:42
我调试了,所以才问的 把这个 if(isMoveDisk == TRUE) 改为 if(isMoveDisk) 看看,因为TRUE一般等于1 但一般>0,就表明真 你调试的时候看isMoveDisk值是多少? |
|
|
地下室#
发布于:2005-03-15 19:10
还是一样的,其实这要结和程序看的,我还搞不清这个驱动程序中的读写流程是怎样按排的,有人知道吗,提点我一下吧
|
|
5楼#
发布于:2005-03-15 19:53
你把整个你改过后的DiskPerfReadWrite函数贴上来看看!
|
|
6楼#
发布于:2005-03-15 21:09
把汇编代码贴出来看看.....
|
|
|
7楼#
发布于:2005-03-16 10:32
NTSTATUS
DiskPerfReadWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension; PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); ULONG processor = (ULONG) KeGetCurrentProcessorNumber(); PDISK_PERFORMANCE partitionCounters = NULL; LONG queueLen; NTSTATUS status; PLARGE_INTEGER timeStamp; if (deviceExtension->DiskCounters != NULL) { partitionCounters = (PDISK_PERFORMANCE) ((PCHAR) deviceExtension->DiskCounters + (processor*PROCESSOR_COUNTERS_SIZE)); } if((currentIrpStack->MinorFunction == IRP_MJ_READ)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp,IO_NO_INCREMENT); return STATUS_INVALID_DEVICE_REQUEST; } if (deviceExtension->CountersEnabled <= 0 || deviceExtension->PhysicalDeviceNameBuffer[0] == 0 || partitionCounters == NULL) { return DiskPerfSendToNextDriver(DeviceObject, Irp); } queueLen = InterlockedIncrement(&deviceExtension->QueueDepth); *nextIrpStack = *currentIrpStack; timeStamp = (PLARGE_INTEGER) ¤tIrpStack->Parameters.Read; DiskPerfGetClock(*timeStamp, NULL); DebugPrint((10, \"DiskPerfReadWrite: TS=%I64u\\n\", *timeStamp)); if (queueLen == 1) { partitionCounters->IdleTime.QuadPart+= timeStamp->QuadPart -deviceExtension->LastIdleClock.QuadPart; deviceExtension->LastIdleClock.QuadPart = timeStamp->QuadPart; } IoSetCompletionRoutine(Irp, DiskPerfIoCompletion, DeviceObject, TRUE, TRUE, TRUE); return IoCallDriver(deviceExtension->TargetDeviceObject, Irp); } // end DiskPerfReadWrite() 就是这段代码,当执行到if(xxxxxxx == IRP_MJ_READ)语句时,这个函数体中已设置返回值了,但为什么又执行了DiskPerfSendToNextDriver这个函数呢,应该不会调用这个函数的呀 |
|
8楼#
发布于:2005-03-16 12:13
我就碰到过比你还邪的事情, 有的iocode能被called有的就不能,不提了
|
|
9楼#
发布于:2005-03-16 12:41
if((currentIrpStack->MinorFunction == IRP_MJ_READ))
中的MinorFunction是否应该改为MajorFunction啊?! |
|
10楼#
发布于:2005-03-16 13:33
和这个应该没关系的呀
|
|
11楼#
发布于:2005-03-16 20:19
if((currentIrpStack->MinorFunction == IRP_MJ_READ)) 恩 |
|
|
12楼#
发布于:2005-03-17 08:54
我改过来了但还是一样有问题,再问一下,在这个读写例程中我怎样得到当前访问的磁盘号呢,我用IoBuildDeviceIoControlRequest函数+IOCTL_DISK_GET_PARTITION_INFO,但得到的是?号,怎么解决
|
|
13楼#
发布于:2005-03-17 10:00
你调试的时候看isMoveDisk值是多少?
如果if条件真满足,只好看看下面的汇编语句是什么了 |
|
|
14楼#
发布于:2010-03-19 10:47
好象是majorfunction 吧?
跟踪ismovedisk 值. |
|
|