可重入的问题?

[复制链接]
2732|2
 楼主| longwuyi 发表于 2007-5-30 06:15 | 显示全部楼层 |阅读模式
...<br />case&nbsp;IRP_MN_STOP_DEVICE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;PnpStopDeviceHandler(fdo,Irp);<br />...<br />NTSTATUS&nbsp;PnpStopDeviceHandler(&nbsp;IN&nbsp;PDEVICE_OBJECT&nbsp;fdo,&nbsp;IN&nbsp;PIRP&nbsp;Irp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;StopDevice(dx);<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />}<br /><br />VOID&nbsp;StopDevice(&nbsp;IN&nbsp;PWDM2_DEVICE_EXTENSION&nbsp;dx)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;!dx-&gtGotResources)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;若需要获取资源,则退出<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;dx-&gtGotResources&nbsp;=&nbsp;false;&nbsp;&nbsp;//&nbsp;需要重新获取资源<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeSynchronizeExecution(&nbsp;dx-&gtInterruptObject,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PKSYNCHRONIZE_ROUTINE)DisableDeviceInterrupts,&nbsp;(PVOID)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dx);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;dx-&gtGotInterrupt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoDisconnectInterrupt(&nbsp;dx-&gtInterruptObject);<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;dx-&gtInterruptObject=NULL;<br />}<br />这所有的调用都发生在PASSIVE_LEVEL级的派遣例程中.<br />1.&nbsp;由于PASSIVE_LEVEL级允许线程序切换.<br />2.&nbsp;或在多核CPU上运行<br />假设:<br />1.&nbsp;一个线程A调用StopDevice并测试dx-&gtGotResources为True,并在执行<br />&nbsp;&nbsp;&nbsp;dx-&gtGetResources之前;<br />2.&nbsp;或被切换,或在另外一CPU上的执行线程B也调用StopDevice并测试<br />&nbsp;&nbsp;&nbsp;dx-&gtGetResources也为True;<br />3.&nbsp;则在随后的执行中,可能由于一个先执行的线程A/B设置<br />&nbsp;&nbsp;&nbsp;dx-&gtInterruptObject=NULL,导致后调用的一个线程B/A使用<br />&nbsp;&nbsp;&nbsp;dx-&gtInterruptObject为空的对象调用KeSynchronizeExecution<br />&nbsp;&nbsp;&nbsp;函数.<br />这应该是有问题的,请各位大佬指教<br />是否只有在调用WaitFor...阻塞线程后,线程切换才可以开始.
computer00 发表于 2007-5-30 10:19 | 显示全部楼层

一个线程获取资源后,另一个就不能再获取成功了吧?

  
 楼主| longwuyi 发表于 2007-5-30 22:12 | 显示全部楼层

可重入的问题

其实我想问的问题不是关注在获取资源方面.<br />我想问的是<br />&nbsp;&nbsp;1.&nbsp;假设环境是多CPU或多线程切换(PASSIVE_LEVEL级别);<br />&nbsp;&nbsp;2.&nbsp;假设同时有多个删除等操作的IRP同时在不同线程或不同CPU中执行;<br />&nbsp;&nbsp;3.&nbsp;在一定的情况下可能发生删除空对象的操作发生.<br />假设是在非常
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

61

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部