jiayuan
驱动牛犊
驱动牛犊
  • 注册日期2004-03-10
  • 最后登录2004-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:929回复:0

请教武安河WINDOWS 2000/XP WDM 设备驱动程序开发中一个问题

楼主#
更多 发布于:2004-04-23 11:34
在本书中82页关于DEVICECONTROL例程编程中为了实现每次只能有一个IRP在等待,书中采用一下程序:
NTSTATUS MyDevice:DeviceControl(KIrp I)
{
switch(I.IoctlCode())
  {
     case XXX:
     {
        PVOID CI=InterLockedCompareExchangePoint((PVOID*)   &CurrentIrp(),PVOID(PIRP(I)),NULL);
        if(CI!=NULL)
           return .Complete(STATUS_DEVICE_BUSY);
       //以后为正常挂起处理
     }
  }
}

我不明白的是:
InterLockedCompareExchangePoint(D,Ex,Comp)函数说明是:
if (D==Comp)
    D=Ex
else
    D=D
函数返回为D

那么假如CurrentIrp()=NULL,那么CurrentIrp()=I,此时应该函数应该返回为I,该值必定不为NULL,程序此时应该正常按挂起例程处理,
如果按照上述程序处理,那I的状态返回为STATUS_DEVICE_BUSY,而不是我认为的STATUS_PENDING.
哪位老兄有好的解释

 
游客

返回顶部