...<br />case IRP_MN_STOP_DEVICE:<br /> status = PnpStopDeviceHandler(fdo,Irp);<br />...<br />NTSTATUS PnpStopDeviceHandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp)<br />{<br /> ...<br /> StopDevice(dx);<br /> ...<br />}<br /><br />VOID StopDevice( IN PWDM2_DEVICE_EXTENSION dx)<br />{<br /> if( !dx->GotResources) // 若需要获取资源,则退出<br /> return;<br /> dx->GotResources = false; // 需要重新获取资源<br /> KeSynchronizeExecution( dx->InterruptObject, <br /> (PKSYNCHRONIZE_ROUTINE)DisableDeviceInterrupts, (PVOID)<br /> dx);<br /> if( dx->GotInterrupt)<br /> IoDisconnectInterrupt( dx->InterruptObject);<br /> ...<br /> dx->InterruptObject=NULL;<br />}<br />这所有的调用都发生在PASSIVE_LEVEL级的派遣例程中.<br />1. 由于PASSIVE_LEVEL级允许线程序切换.<br />2. 或在多核CPU上运行<br />假设:<br />1. 一个线程A调用StopDevice并测试dx->GotResources为True,并在执行<br /> dx->GetResources之前;<br />2. 或被切换,或在另外一CPU上的执行线程B也调用StopDevice并测试<br /> dx->GetResources也为True;<br />3. 则在随后的执行中,可能由于一个先执行的线程A/B设置<br /> dx->InterruptObject=NULL,导致后调用的一个线程B/A使用<br /> dx->InterruptObject为空的对象调用KeSynchronizeExecution<br /> 函数.<br />这应该是有问题的,请各位大佬指教<br />是否只有在调用WaitFor...阻塞线程后,线程切换才可以开始. |
|