自旋锁--windows内核安全与驱动开发

//自旋锁*******************************************************************************************************
/*多线程问题用到的,比如,在内核环境下操作一个全局链表,一个线程在操作的时候发生了切换到另一个线程
也来操作这个链表,那前一个线程还没操作完,换到另一个线程来操作会怎样?通常要么这个链表丢失了,要么损坏了。
所以需要一个锁来控制,当前一个线程在操作的时候他得到一个锁,这个锁唯一的,如果他没操作完就不释放出来,其他线程如果
没有得到这把锁就无法操作,直到这个线程操作完了把锁释放出来,其他线程就能得到这个锁,得到了锁就能操作,这样就能完成
同步问题。

1.如何获得并初始化一个自旋锁***********************************************************************************
KSPIN_LOCK my_spin_lock; //声明一个自旋锁
KeInitializeSpinLock(&my_spin_lock);//将自旋锁初始化。

2.如何使用自旋锁***********************************************************************************************
KIRQL irql;用于保存中断级别
KeAcquireSpinLock(&my_spin_lock,&irql);这个函数会提高中断级别。就得中断级别被保存在上一行声明的变量里。
//这里做点事情。
KeReleaseSpinLock(&my_spin_lock,irql);释放锁,回复中断级别。

需要注意的是:
KSPIN_LOCK my_spin_lock;
KeInitializeSpinLock(&my_spin_lock);
尽量声明在静态变量,全局变量里。如果声明在某个函数里,随着函数执行的结束,声明的变量的声明周期也就结束了。
这样多线程锁就起不到"锁"的作用。声明在全局变量中,多个线程共用同一把锁,才能起到"锁"的作用。

3.自旋锁在链表中的使用****************************************************************************************
可以这么写
LIST_ENTRY list_entry_head; //声明一个链表头
KSPIN_LOCK list_entry_lock; //声明一个自旋锁

void ListInitialized()
{
InitializeListHead(&list_entry_head);//初始化链表头
InitializeListSpinLock(&list_entry_lock);//初始化自旋锁
}

然后在操作链表的函数中,多传入一个锁的指针参数,在操作链表之前先KeAcquireSpinLock,然后操作完之后
再KeReleaseSpinLock
*/

本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与Windows客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从32位到64位,从Windows XP到Windows 8都有涉及,大部分程序不经过修改即可在Windows 10上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。 本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows过滤平台、NDIS协议驱动、NDIS小端口驱动、NDIS中间层驱动、IA-32汇编基础、IA-32体系中的内存地址、处理器权限级别切换、IA-32体系结构中的中断和Windows内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。 本书适合计算机安全软件从业人员、计算机相关专业院校学生以及有一定C语言和操作系统基础知识的编程爱好者阅读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值