zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
阅读:1536回复:3

麻烦大大解释一句代码,不懂

楼主#
更多 发布于:2008-05-09 11:04
一个USB驱动  
这是在PNP例程中的case IRP_MN_STOP_DEVICE里面的一段代码,好像是停设备之前,要把电源的IRP包给Cancel掉

在POWER例程的 case PowerSystemWorking:中也调用了同一段代码

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NTSTATUS result;
DEVICE_EXTENSION extension;//////就是那个用户自定义的大结构体
PIRP irp; //

 irp =(PIRP) InterlockedExchange(&extension->var1400, 0);//////////???这句不明白,
////////////////是在这里面存Pending irp么?可以这样么?
  
  if ( irp )
  {
    IoCancelIrp(irp);///cancel pending irp
    result = InterlockedExchange(&extension->var1408, 1);
    if ( result )
    {
      PoStartNextPowerIrp(irp);
      irp->IoStatus.Information = 0;
      irp->IoStatus.Status = STATUS_CANCELLED;
      IoCompleteRequest(irp, 0);
    }
  }
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-05-09 11:34
某个例程把 一个IRP保存在了 extension->var1400变量里面,InterlockedExchange函数把它取出来,并把extension->var1400设置为0. 保证了该 IRP只处理1次.
zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-09 11:43
非常感谢
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-05-19 22:19
学习
游客

返回顶部