阅读:929回复:0
请教武安河WINDOWS 2000/XP WDM 设备驱动程序开发中一个问题
在本书中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. 哪位老兄有好的解释 |
|