![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Windows核心编程
文章平均质量分 80
大数学家拉格朗日
苦逼从windows转到搞linux又苦逼的从C转到搞JAVA
展开
-
多线程环境下调用SendMessage交叉发送消息可能导致的死锁问题
很多时候多线程环境下你会在不同的线程之间拥有许多窗口,或者多个线程之间通过消息机制通讯,此外,你还用诸如临界区等等互斥体来保护临界数据。在这样的复杂情况,如果不慎在线程之间交叉使用SendMessage发送消息,就可能导致死锁隐患。比如下面的一个例子:线程A对临界区上锁,原创 2011-09-26 15:07:32 · 2399 阅读 · 0 评论 -
使用临界区对象(CriticalSection)需要注意的一些事情
1. 临界区对象不是内核对象,因此不能继承,不能跨进程,也不能用waitfor什么的函数来限定时间等待。这个很好理解,你想想WaitFor要求传一个句柄,而临界区对象的类型都不是句柄,也不能用CloseHandle来关闭,怎么可能会能让WaitForXXX搞了。2. 临界原创 2011-09-24 15:02:51 · 1792 阅读 · 2 评论 -
小实验:waitabletimer 如果设定了一个已经过期的时间作为初始值会怎么样呢?
实验:设定一个已经过期的时间作为初始值,查看:1。Timer是否能够立刻激活2。如果Timer还有周期激活的特性,那么周期应该怎么算呢,是从已经过期的时间开始算起?还是从设定timer的当前时刻算起?/* 本代码的意图在于查看如果你给Timer设定一个已原创 2011-10-13 13:32:40 · 1165 阅读 · 0 评论 -
内核态同步对象之“事件”
事件是一种很常使用到的,用于同步的内核对象。它分为两种:手动挡的>,自动挡的>手动挡:顾名思义,如果一个事件激活之后,你不显式调用ResetEvent的话,那么事件就一直处于激活状态。自动挡:在任何一个线程waitfor函数成功之后,该事件就会被重新调整为未激原创 2011-10-12 19:45:19 · 2805 阅读 · 0 评论 -
Windows Interlocked函数族
当进行多线程编程的时候,一个随时都需要面对的问题就是对一些共享变量进行操作,例如增加/降低某个数值,更改某一个数据,对某一个数据进行各种逻辑操作,如XOR AND, OR等。在这时候,比较让人头疼的地方就是,C++的操作符不保证线程安全。例如:++X,不能保证X在自增的过程中不被原创 2011-09-02 19:51:05 · 499 阅读 · 0 评论 -
初探 Windows Access Token
Access Token是一个与进程或者线程相关的对象。它包括有用户(持有该进程的用户)的安全标识符(security identifier)和特权(privileges)等等信息。当进程或者线程需要访问某个具有安全属性的对象时(通常是内核对象),OS会根据这个Token在该原创 2011-08-20 17:00:02 · 717 阅读 · 0 评论 -
你还在用CreateThread创建线程么?改成_beginthreadex吧!
CreateThread是Window的API函数,所有线程的创建都必须调用这个函数,但是如果当你想在多线程环境下用上CRT的话会怎么样呢?作为一个C/C++程序员,有谁可以拍着胸脯说,我永远也用不上CRT(C Run Time)吗?就算你不显式地使用CRT,你又怎么知道你调原创 2011-08-23 13:35:14 · 1042 阅读 · 0 评论 -
spinlock进阶考虑
自旋锁在前面的博文中已经介绍过(Interlocked函数族),用自旋锁的缺点就是不停的询问CPU某个事件是不是发生了,某个变量是不是更改了值什么的,浪费CPU时间。因此推荐短期能够访问到的资源使用自旋锁,不然就用内核对象进行互斥或等待。除此之外,读书过程中那两个作者基佬还提原创 2011-09-04 15:59:42 · 295 阅读 · 0 评论 -
Windows Job 初解
一直以来对这个东西总是搞不清楚,看了几遍Windows核心编程后,总算是有一点点感觉了,欢迎高手对我不正确的理解拍砖指正。Job可以被理解为进程的容器,而它又不是单纯的容器,按照书本上所讲的,Job是一个沙盒,它可以为在它里面运行的进程增加一系列的限制。包括每一个进程或者整个原创 2011-08-21 21:42:37 · 1976 阅读 · 0 评论 -
通过修改IAT来拦截API
跟进程打过一定交道之后你肯定会知道,进程在开始执行的时候会被加载到一个基地址,也就是GetModuleHandle(NULL)对应的值。在基地址后面的一定地址范围里存储有进程的映像文件(image),其中包含了很多信息,比如数据啊,代码啊什么的。在这些数据里,有一个比较重要的部分原创 2011-09-23 21:52:22 · 686 阅读 · 0 评论 -
Windows UIPI
从Vista开始,微软引入了一个新的安全概念称作UIPI。UIPI是指低权限的进程不能对高权限的进程做以下的一些事情:Perform a window handle validation of higher process privilege.Send原创 2011-08-21 20:47:05 · 698 阅读 · 0 评论 -
Windows中一些与Thread有关的内部细节
1.当线程被创建之后,该线程的内核对象的引用计数是2,当线程以任何方式退出时,该引用计数减去1,当CreateThread所返回的句柄被关闭后,引用计数再减去1。因此是初始值是2才能保证在正常情况下线程结束并且对象句柄被关闭后引用计数是0。2.线程还有另一个计数值,叫做挂起计原创 2011-08-22 22:10:54 · 1320 阅读 · 1 评论 -
Windows挂起线程/进程?小心吃不了兜着走。
Windows提供一个SuspendThread来挂起线程,被挂起的线程会增加它内核对象中的一个挂起计数,只有挂起计数为0的线程被标记为可调度,从而可以执行。这些都是老生常谈,这篇文章介绍的中心思想是:如果你不清楚被挂起的线程/进程正在做什么,最好不要没事挂起它们。在多线程的原创 2011-08-25 15:33:26 · 1505 阅读 · 0 评论 -
Windows线程调度、优先级的那点事
美国《独立宣言》中说:人生而平等。操作系统中说:平等你妹!进程和线程必须得有优先级!我说:这段是看书后随笔写的日志,恳请牛逼的明白人指正拍砖!首先需要注意的第一点是:在Windows中,只有线程是可调度的,进程只是线程的容器,进程为线程提供内存,提供可以共享的数据,进原创 2011-09-02 01:34:38 · 2815 阅读 · 2 评论 -
轻型读写锁(Slim read write lock)
Windows提供了很多机制进行互斥来保证共享资源不被污染,比如临界区,比如信号量,比如互斥体等等。前一篇对临界区的博文里说过,临界区会先自旋,等自旋不行了再创建内核对象。这样做的原因是从用户模式转到内核模式非常耗费时间,而且常常转换还没完成呢,持有资源的线程已经释放了资源。因此原创 2011-09-25 00:03:26 · 1928 阅读 · 1 评论 -
[心得]使用WCT API来侦测程序死锁问题
WCT( Wait Chain Traversal) 是微软在Windows Vista开始提出的一套检测线程死锁的API机制。在介绍这套API之前,我先介绍一下什么是死锁。A线程等待B线程的某个资源,同时B线程等待A线程的某个资源,这时A,B线程都永远无法执行,这种情况原创 2011-10-18 19:57:37 · 1775 阅读 · 1 评论