xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2347回复:14

熟悉diskperf的高手看过来,有个问题我始终解不开

楼主#
更多 发布于:2005-03-15 14:01
在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这个函数呢
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-15 15:06
调试一下看看吧!
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-15 15:20
我调试了,所以才问的
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-15 15:42
我调试了,所以才问的

把这个 if(isMoveDisk == TRUE)
改为 if(isMoveDisk)
看看,因为TRUE一般等于1
但一般>0,就表明真
你调试的时候看isMoveDisk值是多少?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-15 19:10
还是一样的,其实这要结和程序看的,我还搞不清这个驱动程序中的读写流程是怎样按排的,有人知道吗,提点我一下吧
linweiwww
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-15 19:53
你把整个你改过后的DiskPerfReadWrite函数贴上来看看!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2005-03-15 21:09
把汇编代码贴出来看看.....
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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) &currentIrpStack->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这个函数呢,应该不会调用这个函数的呀
changys
驱动小牛
驱动小牛
  • 注册日期2004-11-15
  • 最后登录2008-08-21
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望15点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-16 12:13
我就碰到过比你还邪的事情,  有的iocode能被called有的就不能,不提了
linweiwww
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-16 12:41
if((currentIrpStack->MinorFunction == IRP_MJ_READ))
中的MinorFunction是否应该改为MajorFunction啊?!

xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-03-16 13:33
和这个应该没关系的呀
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-03-16 20:19
if((currentIrpStack->MinorFunction == IRP_MJ_READ))
中的MinorFunction是否应该改为MajorFunction啊?!

 

1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-03-17 08:54
我改过来了但还是一样有问题,再问一下,在这个读写例程中我怎样得到当前访问的磁盘号呢,我用IoBuildDeviceIoControlRequest函数+IOCTL_DISK_GET_PARTITION_INFO,但得到的是?号,怎么解决
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-03-17 10:00
你调试的时候看isMoveDisk值是多少?
如果if条件真满足,只好看看下面的汇编语句是什么了
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
hnsyz
驱动牛犊
驱动牛犊
  • 注册日期2001-12-31
  • 最后登录2010-04-20
  • 粉丝1
  • 关注0
  • 积分108分
  • 威望259点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2010-03-19 10:47
好象是majorfunction 吧?
跟踪ismovedisk 值.
学习,交流
游客

返回顶部