当前位置:
首页 >
Windows内核读写自旋锁EX_SPIN_LOCK
发布时间:2025/3/19
46
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Windows内核读写自旋锁EX_SPIN_LOCK
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
这玩意本来是在Vista SP1版本就存在了,但是某些傻x客户还在坚持使用老旧的windows操作系统。可以使用下面的移植方案代替。
在微软的实现上好像有一些调试用途或者什么优化,移植不了,去掉了。
#ifndef _MY_EX_SPIN_LOCK #define _MY_EX_SPIN_LOCKtypedef LONG EX_SPIN_LOCK;KIRQL NTAPI ExAcquireSpinLockExclusive(volatile EX_SPIN_LOCK *ExSpinLock); KIRQL NTAPI ExAcquireSpinLockShared(volatile EX_SPIN_LOCK *ExSpinLock); void NTAPI ExReleaseSpinLockExclusive(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql); void NTAPI ExReleaseSpinLockShared(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql);#endif // _MY_EX_SPIN_LOCK #include <wdm.h> #include "exspinlock.h"VOID NTAPI ExpWaitForSpinLockExclusiveAndAcquire(volatile EX_SPIN_LOCK *ExSpinLock) {while(*ExSpinLock < 0 || _interlockedbittestandset(ExSpinLock, 0x1Fu)); }VOID NTAPI ExpWaitForSpinLockSharedAndAcquire(volatile EX_SPIN_LOCK *ExSpinLock) {while(1){if(*ExSpinLock >= 0){EX_SPIN_LOCK Tmp = *ExSpinLock;if (_InterlockedCompareExchange(ExSpinLock, Tmp + 1, Tmp) == Tmp)break;}} }KIRQL NTAPI ExAcquireSpinLockExclusive(volatile EX_SPIN_LOCK *ExSpinLock) {KIRQL OldIrql;OldIrql = KfRaiseIrql(DISPATCH_LEVEL);if(_interlockedbittestandset(ExSpinLock, 0x1Fu))ExpWaitForSpinLockExclusiveAndAcquire(ExSpinLock);while(*ExSpinLock != 0x80000000);return OldIrql; }KIRQL NTAPI ExAcquireSpinLockShared(volatile EX_SPIN_LOCK *ExSpinLock) {KIRQL OldIrql;EX_SPIN_LOCK Tmp;OldIrql = KfRaiseIrql(DISPATCH_LEVEL);Tmp = *ExSpinLock & 0x7FFFFFFF;if(_InterlockedCompareExchange(ExSpinLock, Tmp + 1, Tmp) != Tmp ){ExpWaitForSpinLockSharedAndAcquire(ExSpinLock);}return OldIrql; }void NTAPI ExReleaseSpinLockExclusive(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql) {_InterlockedAnd(ExSpinLock, 0);KeLowerIrql(NewIrql); }void NTAPI ExReleaseSpinLockShared(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql) {_InterlockedExchangeAdd(ExSpinLock, 0xFFFFFFFF);KeLowerIrql(NewIrql); }
总结
以上是生活随笔为你收集整理的Windows内核读写自旋锁EX_SPIN_LOCK的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 调试符号下载
- 下一篇: Windows 全部调试符号包下载