自旋鎖,只有全局的自旋鎖才有意義.
KeAcquireSpinLock 和 KeReleaseSpinLock 之間的代碼只有單線程執(zhí)行,其他的線程會(huì)停留在 KeAcquireSpinLock 等待,知道 KeAcquireSpinLock 被調(diào)用.
KSPIN_LOCK my_spin_lock;//定義自旋鎖
KIRQL irql; //保存中斷級(jí)別,因?yàn)樽孕i會(huì)提升中斷級(jí)別.
KeInitializeSpinLock(&my_spin_lock);//初始化自旋鎖.
void mysafefunction(){
KeAcquireSpinLock(&my_spin_lock,&irql);//開啟自旋鎖
//這里的代碼是單線程的
KeReleaseSpinLock(&my_spin_lock,irql);//結(jié)束自旋鎖
}
示例:
#include
KSPIN_LOCK my_spin_lock;//定義自旋鎖
KIRQL irql; //保存中斷級(jí)別,因?yàn)樽孕i會(huì)提升中斷級(jí)別.
void mysafefunction(UCHAR a){
//這里的代碼是單線程的
DbgPrint("misaka:number=%d\r\n", a);
}
VOID DriverUnload(PDRIVER_OBJECT driver){
KeInitializeSpinLock(&my_spin_lock);//初始化自旋鎖.
KeAcquireSpinLock(&my_spin_lock, &irql);//開啟自旋鎖
int a = 0;
while (a < 10){
mysafefunction((UCHAR)a);
a++;
}
KeReleaseSpinLock(&my_spin_lock, irql);//結(jié)束自旋鎖
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
//驅(qū)動(dòng)入口
UNICODE_STRING str = RTL_CONSTANT_STRING(L"KeAttachProcess");
DbgPrint("misaka: hello world , this is kernel driver ! %x\r\n", (ULONG)MmGetSystemRoutineAddress(&str));
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
雖然這個(gè)例子沒有顯示出自旋鎖的作用,因?yàn)?DriverUnload 是單線程的
Dbgview輸出:
misaka: hello world , this is kernel driver ! 3f92530
misaka:number=0
misaka:number=1
misaka:number=2
misaka:number=3
misaka:number=4
misaka:number=5
misaka:number=6
misaka:number=7
misaka:number=8
misaka:number=9