Windows内核读写自旋锁EX_SPIN_LOCK
生活随笔
收集整理的這篇文章主要介紹了
Windows内核读写自旋锁EX_SPIN_LOCK
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這玩意本來是在Vista SP1版本就存在了,但是某些傻x客戶還在堅持使用老舊的windows操作系統(tǒng)。可以使用下面的移植方案代替。
在微軟的實現(xiàn)上好像有一些調(diào)試用途或者什么優(yōu)化,移植不了,去掉了。
#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); }?
總結(jié)
以上是生活随笔為你收集整理的Windows内核读写自旋锁EX_SPIN_LOCK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调试符号下载
- 下一篇: 一些恶意软件的分析收集整理