
Windows核心编程 笔记
文章平均质量分 88
wangpengk7788
这个作者很懒,什么都没留下…
展开
-
Windows核心编程笔记(一) 错误处理
在Windows编程中我们调用各种Windows API函数来使用系统提供的各种基础支持,这些API函数并不是总是都能够预期完成所规定的工作的,有些时候会因为各种原因导致函数调用失败,比如传给函数的参数不正确,调用函数的权限不够,请求的资源系统暂时分配不了等等。 大多时候根据函数的返回值,可以判断函数是否失败 Windows除了使用返回值标识函数执行情况,外还引入原创 2017-01-05 02:01:46 · 1558 阅读 · 0 评论 -
Windows核心编程笔记(八)用户模式下的线程同步
Long a; DWORD WINAPI ThreadFunc2(PVOID pvParam) { InterlockedExchangeAdd(&a,1); Return 0; } 第一部分 原子访问 引述自http://blog.youkuaiyun.com/ithzhang/article/details/8291027 系统中的线程必须访问系统资源,原创 2017-01-10 07:06:19 · 709 阅读 · 0 评论 -
Windows核心编程笔记(八)用户模式下的线程同步 SRWLock剖析
在VISTA及之后的系统中,引入了 SRWLock 用户用户模式的线程同步,MSDN中是这样描述的。SRWLock 轻量级的读写锁,它与临界区对象的不同在于,它分为两个模式来访问共享资源。并假设有两种类型的线程同时工作,一种用在读取共享资源,通常又称为消费线程,另一种用来对共享的资源进程写入操作,通常又称为生产线程。共享模式下每个读取线程可以读取共享的原创 2017-01-12 09:28:02 · 5632 阅读 · 3 评论 -
Windows核心编程笔记(九)使用内核对象进行线程同步
上一章作者介绍了用户模式下的线程同步,虽然它们有很好的性能,但是他们功能有限并不是能够胜任实际工作中出现的复杂情况,以及特殊的要求,于是Windwos提供了一些用于线程同步的内核对象,它们根据不同的应用场景而设计,满足不同的环境下的线程同步的要求,因为是基于内核对象来完成同步,因此线程同步时可以跨进程的。这些内核对象包括,事件,可等待计时器,信号量,互斥量。在具体介绍每个线程同原创 2017-01-13 04:52:10 · 626 阅读 · 0 评论 -
Windows核心编程笔记(十)同步IO 与 异步IO
同步IO和异步IO 有两种类型的文件IO同步:同步文件IO和异步文件IO。在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异步文件IO方式中,线程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知线程IO操作完成了。如果IO请求需要大量时间执行的话,异步文件IO方式可以显著提高效率,因为在原创 2017-01-14 10:54:36 · 1787 阅读 · 0 评论 -
Windows核心编程笔记(十一)Windwos线程池
Mircosoft从Windows2000引入线程池API,并在Vista后对线程池重新构架,引入新的线程池API。以下所有线程池函数均适用于Vista以后的版本。 用Windows提供的线程池函数有以下几个好处:1,不必要用CreateThread创建线程;2,不必要管理自己线程;3,Windows封装好的线程池,效率高,性能优越。1 异步方式调用函数 这种方式和我原创 2017-01-16 20:05:58 · 1733 阅读 · 0 评论 -
Windows核心编程笔记(十二) 纤程
纤程(Fiber),是微软加入到Windows中,使得UNIX服务器应用程序更好地移植到Windows中。所以本篇真正没有多少应用价值,只是为了使得笔记更加完整。 看完本章,感觉纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程,然后通过人工转换纤程,从而让各个纤程工作。 要知道的是人工的转换,不是系统自动切换。因为线程的实现通过Windows原创 2017-01-16 20:19:54 · 469 阅读 · 0 评论 -
Windows核心编程笔记(十三)Windwos内存体系结构
Windows内存管理机制,底层最核心的东西是分页机制。分页机制使每个进程有自己的4G虚拟空间,使我们可以用虚拟线性地址来跑程序。每个进程有自己的工作集,工作集中的数据可以指明虚拟线性地址对应到怎样的物理地址。进程切换的过程也就是工作集切换的过程,如Matt Pietrek所说如果只给出虚拟地址而不给出工作集,那这个地址是无意义的。(见图一) 在分页机制所形成的线性地址空原创 2017-01-19 22:02:39 · 2941 阅读 · 0 评论 -
Windows核心编程笔记(十四)探索虚拟内存
在编程中对由于每个系统中页面大小,分配粒度等系统参数是不同的,因此在代码中不能将这些值写死,应该通过系统API动态获取这些值。GetSystemInfo可以获取一些基本的系统信息void WINAPI GetSystemInfo( __out LPSYSTEM_INFO lpSystemInfo);需要传入一个被写的SYSTEM_INFO结构体typedef st原创 2017-01-20 00:39:38 · 1255 阅读 · 0 评论 -
Windows核心编程笔记(十九) SEH结构化异常处理_未处理异常及向量化异常
UnhandledExceptionFilter函数详解 BaseProcessStart伪代码(Kernel32内部)void BaseProcessStart(PVOID lpfnEntryPoint) //参数为线程函数的入口地址{ DWORD retValue; DWORD currentESP; DWORD exceptionCode;转载 2017-02-13 19:49:11 · 3704 阅读 · 0 评论 -
Windows核心编程笔记(二十) 窗口与消息
线程的消息队列(1)Windows用户对象(User Object) ①类型:图标、光标、窗口类、菜单、加速键表等 ②当一个线程创建某个对象时,则该对象归这个线程的进程所有,当进程结束时,如果用户没有明确删除这个对象,则操作系统会自动删除这个对象。 ③窗口和钩子(hook)这两种用户对象,它们分别由建立窗口和安装钩子的线程所拥有(注意,不是进程)。如果一个线程转载 2017-02-13 19:50:43 · 1717 阅读 · 0 评论 -
Windows核心编程笔记(二十) 窗口与消息2
唤醒一个线程线程的挂起与唤醒(1)当线程调用GetMessage或WaitMessage,而消息队列中又没有消息出现时,线程会被挂起。(2)当消息被“Post”(也可以是线程间的“Send”)到消息队列时,相应的Wake标志位会被设置,以表明该线程可被调度。 查询队列的状态:DWORD GetQueueStatus(UINT fuFlags)(1)fuFla转载 2017-02-13 20:20:49 · 3250 阅读 · 0 评论 -
Windows核心编程笔记(十八) SEH结构化异常 三
23.3 终止处理程序23.3.1 程序的结构(1)框架__try{ //被保护的代码块 ……}__finally{ //终止处理}(2)__try/__finally的特点 ①finally块总是保证,无论__try块中的代码有无异常,finally块总是被调用执行。 ②try块后面只能跟一个转载 2017-02-08 19:47:06 · 521 阅读 · 0 评论 -
Windows核心编程笔记(十八) SEH结构化异常 二
23.2 编译器层面对系统SEH机制的封装23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION(1)VC_EXCEPTION_REGISTRATION结构 struct VC_EXCEPTION_REGISTRATION{ VC_EXCEPTION_REGISTRATION* prev转载 2017-02-08 19:45:04 · 886 阅读 · 0 评论 -
Windows核心编程笔记(十八) SEH结构化异常 一
23.1 基础知识23.1.1 Windows下的软件异常(1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障、陷阱和终止三类。(2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进)(3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能。而Visual C++中的__转载 2017-02-08 17:59:06 · 1799 阅读 · 0 评论 -
Windows核心编程笔记(二) Widnwos下的字符处理
这一章作者首先介绍了字符编码,以及Windwos为什么使用Uincode 并使用UTF-16编码,关于字符集和字符编码参见http://blog.youkuaiyun.com/wangpengk7788/article/details/54075917微软的编译器内建了一个wchar_t的数据类型,它表示UTF-16编码的字符,编译器需要打开 /Zc:wchar_t开关才可以使用该类型,现在的VS原创 2017-01-05 03:40:04 · 1201 阅读 · 0 评论 -
Windows核心编程笔记(三) 内核对象与句柄
在写Windwos应用程序的时候HANDLE这个类型作为参数和返回值函数我们经常用到,这些函数有个共同的特点就是需要用到一个内核对象,这些内核对象有Job、Directory(对象目录中的目录)、SymbolLink(符号链接),Section(内存映射文件)、Port(LPC端口)、IoCompletion(Io完成端口)、File(并非专指磁盘文件)、同步对象(Mutex、Event、Sema原创 2017-01-07 06:10:11 · 819 阅读 · 0 评论 -
Windows核心编程笔记(四) 进程相关
1、Windwos程序分为GUI程序和Console程序,通过设置VS的链接器开关/SUBSYSTEM:XX来设置,/SUBSYSTEM:CONSOLE控制台程序,基于命令行,/SUBSYSTEM:WINDOWS GUI界面程序,基于窗口。2、使用VS编写Windows程序会在程序的开始是C/C++运行库启动函数,它初始化了一些全局变量,参见http://blog.youkuaiyun.com/wan原创 2017-01-07 06:36:58 · 728 阅读 · 0 评论 -
Windows核心编程笔记(五) Job与进程的关系
Job可以被理解为进程的容器,而它又不是单纯的容器,按照书本上所讲的,Job是一个沙盒,它可以为在它里面运行的进程增加一系列的限制。包括每一个进程或者整个Job能够使用的User mode CPU时间,每一个进程或者整个Job最多能使用的内存,Job内的进程能否访问到Job外的用户对象(例如窗口,画刷),能否退出Windows,能否访问剪切板等等。当限制设定之后,我们就可以创建一个进程,并将它放置原创 2017-01-08 08:22:11 · 6270 阅读 · 0 评论 -
Windows核心编程笔记(六) 线程
现代操作系统都是多任务的,操作系统在不同的时间片内把CPU及硬件资源分配给不同的任务,在Windows系统中每一个任务就是一个线程,它是CPU执行调度的最小单元,而进程是线程的容器,为线程提供虚拟地址空间。多线程环境可以让一个进程即一个应用程序将所要完成的任务进程分配,例如一个浏览器使用一个界面线程来完成与用户的交互,一个线程负责和服务器进行数据的传输,一个线程负责HTML代码的解析,一个线程原创 2017-01-09 10:20:11 · 443 阅读 · 0 评论 -
Windows核心编程笔记(七) 线程调度 优先级 关联性
首先线程与系统时钟间隔参见http://blog.youkuaiyun.com/wangpengk7788/article/details/54287947在抢占式多任务操作系统中,线程的运行是有限制的,系统会调度一个线程在一个时间块内占用CPU,在时间到了之后将线程的上下文(CONTEXT结构,保存线程切换前的CPU个寄存器的值)保存到线程内核对象中,从另一个可调度线程的CONTEXT中获取属于它的CP原创 2017-01-09 14:15:28 · 5060 阅读 · 0 评论 -
Windows核心编程笔记(十五)应用程序中使用虚拟内存
windows 提供了三种机制来对内存进行操作1)虚拟内存,最适合用来管理大型对象数组 或大型结构数组2)内存映射文件,最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多进程之间共享数据。3)堆,适合用来管理大量的小型对象。windows提供了一些用来操控虚拟内存的函数,我们可以通过这些函数直接预定地址空间区域,给区原创 2017-02-05 17:09:08 · 605 阅读 · 0 评论 -
Windows核心编程笔记(十六)内存映射文件
原理首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间中 一块大小相同的区域之间的一一对应,如图1中过程1所示。这种对应关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在 的。在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,原创 2017-02-06 16:05:51 · 500 阅读 · 0 评论 -
Windows核心编程笔记(十七) 堆
1.堆 虚拟内存主要用于分配连续的内存,如给大数组分配内存。 堆主要用于分配小块内存,如链表,树等就适合用堆来分配内存。 优点在于:在堆中分配内存时不像虚拟内存要求那么多,如分配粒度、页边界等。它没有这些要求,可分配任意大小的内存。 缺点在于:相对于其它内转载 2017-02-07 11:36:36 · 462 阅读 · 0 评论 -
Windows核心编程笔记(十七) DLL高级技术
20.1 DLL模块的显式载入和符号链接20.1.1 显式载入DLL模块(1)构建DLL时,如果至少导出一个函数/变量,那么链接器会同时生成一个.lib文件,但这个文件只是在隐式链接DLL时使用(显示链接时并没有用到这文件)(2)显式载入DLL的函数:LoadLibrary(Ex) 参数含义pCTSTR pszDll转载 2017-02-07 23:41:55 · 2632 阅读 · 0 评论 -
Windows核心编程笔记(十七) 线程局部储存
21.1 动态TLS21.1.1 为什么要使用线程局部存储 编写多线程程序的时候都希望存储一些线程私有的数据,我们知道,属于每个线程私有的数据包括线程的栈和当前的寄存器,但是这两种存储都是非常不可靠的,栈会在每个函数退出和进入的时候被改变,而寄存器更是少得可怜。假设我们要在线程中使用一个全局变量,但希望这个全局变量是线程私有的,而不是所有线程共享的,该怎么办呢?这时候就须要用到线转载 2017-02-07 23:43:41 · 3543 阅读 · 0 评论 -
Windows核心编程笔记(二十一) 硬件输入模型和局部输入状态
28.1 原始输入线程(RIT)(1)图解硬件输入模型 ①当操作系统初始化时会创建一个原始输入线程(RIT)和系统硬件消息队列(SHIQ),这两者是系统硬件输入模型的核心。当SHIQ队列有硬件(如鼠标或键盘)消息时,RIT被唤醒,并将事件添加到用户线程的VIQ队列。 ②任何时刻,只能有一个用户线程与RIT连接,该线程被称为前景线程。相对于其他线程创建的窗口,前转载 2017-02-13 20:38:55 · 1964 阅读 · 0 评论