欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。