Windows核心编程
文章平均质量分 86
介绍及总结Windows核心编程开发!
笨蛋糕
当你的才华还不足以撑起你的野心时,你应该静下心去学习!
展开
-
Windows核心编程(二十四)终止处理程序及异常处理程序
结构化异常处理(Structuredexception handling)简称SEH。是windows系统提供的异常处理机制。促使windows将SEH加入到windows系统的一个关键原因就是:它可以简化操作系统本身的开发工作,同时还让系统更加健壮。我们当然也可以在我们的程序中添加SEH机制,这样我们的应用程序也可以变得更加健壮。使用SEH,我们在编写代码时可以先集中精力完成软件的正常工原创 2014-04-07 12:21:49 · 1144 阅读 · 0 评论 -
Windows核心编程(二十三)Windows挂钩
windows应用程序是基于消息驱动的。各种应用程序对各种消息作出响应从而实现各种功能。windows钩子是windows消息处理机制的一个监视点,通过安装钩子可以达到监视指定窗口某种类型的消息的功能。所谓的指定窗口并不局限于当前进程的窗口,也可以是其他进程的窗口。当监视的某一消息到达指定的窗口时,在指定的窗口处理消息之前,钩子函数将截获此消息,钩子函数既可以加工处理该消息,也可以不作任何原创 2014-04-07 11:08:17 · 1083 阅读 · 0 评论 -
Windows核心编程(二十二)API拦截
一个模块的导入段包含一组DLL。为了让模块能够运行,这些DLL是必须的。导入段还包含一个符号表。它列出了该模块从各DLL中导入的符号。当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函数在导入表的地址,然后再跳到相应的位置。如果我们能将导入段中相应导入函数的地址替换成自定义的函数的地址,即可实现对该函数的拦截。在自定义的函数中,我们既可以调用拦截的函数,也可以执行其他工作。原创 2014-04-07 10:44:15 · 1070 阅读 · 0 评论 -
Windows核心编程(二十一)远程线程注入DLL
windows内的各个进程有各自的地址空间。它们相互独立互不干扰保证了系统的安全性。但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作。虽然他们是为调试器设计的,但是任何应用程序都可以调用它们 。接下来我们来谈谈使用远程线程来注入DLL。 从根本上说,DLL注入就是将某一DLL注入到某一进程的地址空间。该进程中的一个线程调用L原创 2014-04-07 10:27:19 · 1394 阅读 · 0 评论 -
Windows核心编程(二十)模块的基地址重定位及绑定
每个DLL和可执行文件都有一个首选基地址。它表示该模块被映射到进程地址空间时最佳的内存地址。在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000。对于DLL来说,链接器会将它的首选基地址设为0x10000000,然后将该地址以及代码、数据的相关地址都写入它们的PE文件中。当它们被加载时,加载程序读取首选基地址的值,并试图把它们加载到相应位置。 对于可执行文件和DL原创 2014-04-06 17:33:27 · 3250 阅读 · 0 评论 -
Windows核心编程(十九)DLL高级技术
本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术。 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入,此种方式被称为隐式链接。 第二种方式是在程序运行时,通过调用API显式的载入所需要的DLL,并显式的链接所想要链接的符号。换句话说,程序在运行时,其中的一个线程能够原创 2014-04-06 17:02:48 · 1169 阅读 · 0 评论 -
Windows核心编程(十八)DLL基础
DLL全称dynamic linking library。即动态链接库。广泛应用与windows及其他系统中。 windows中所有API都包含在DLL中。三个最重要的DLL是Kernel32.dll,User32.dll,GDI32.dll。 使用dll的好处: 1:扩展了应用程序的特性。 2:简化了项目管理原创 2014-04-06 12:18:18 · 1203 阅读 · 0 评论 -
Windows核心编程(十七)默认堆及自定义堆
前面我们说过堆非常适合分配大量的小型数据。使用堆可以让程序员专心解决手头的问题,而不必理会分配粒度和页面边界之类的事情。因此堆是管理链表和数的最佳方式。但是堆进行内存分配和释放时的速度比其他方式都慢,而且无法对物理存储器的调拨和撤销调拨进行控制。 什么是堆? 在系统内部堆就是一块预定的地址空间区域。刚开始堆的大部分页面都没有调拨物理存储器原创 2014-04-06 11:11:21 · 991 阅读 · 0 评论 -
Windows核心编程(十六)内存映射文件
内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件。将文件映射到内存中后,我们就可以在内存中操作他们了,就像他们被载入内存中一样。内存映射文件主要有三方面的用途:1:系统使用内存映射文件来将exe或是dll文件本身作为后备存储器,而非系统页交换文件,这大大节省了系统页交换空间,由于不需原创 2014-04-05 16:26:17 · 1049 阅读 · 0 评论 -
Windows核心编程(十五)线程栈
当系统创建线程时会为线程预订一块地址空间区域(每个线程都有自己的栈),并给区域调拨一些物理存储器。注意仅仅是预订。默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器。默认情况下,仅仅为两个页面挑拨。在构建应用程序时开发人员可以通过两种方法来改变默认值:一是使用C++编译器的/F选项,二是使用C++链接器的/STACK选项:/Freserve/原创 2014-04-05 15:23:39 · 946 阅读 · 0 评论 -
Windows核心编程(十四)在应用程序中使用虚拟内存
1、Windows提供了以下三种机制对内存进行操控:1)虚拟内存:最适合来管理大型对象数据或大型结构数组。2)内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据。3)堆:最适合用来管理大量的小型对象。 2、VirtualAlloc要进入内核模式,算法特复杂,比较慢,而且分配粒度是4k,用来分配小块内存很浪费。malloc先用原创 2014-04-02 16:11:10 · 883 阅读 · 0 评论 -
Windows核心编程(十三)Windows内存体系结构
一、进程虚拟地址空间1、每个进程都有自己的虚拟地址空间。对于32位操作系统来说,它的地址空间是4GB。这是因为32位指针可以表示从0x00000000到0xFFFFFFFF之间的任一值。对于64位的操作系统来说有0到2的64次方之间的任一值。2、由于每个就进程都有自己的地址空间,因此每个进程都只能访问属于自己的地址空间而不能访问其他进程的空间。这保护了进程,也是之所以我原创 2014-04-01 17:51:00 · 781 阅读 · 0 评论 -
Windows核心编程(十二)线程池
1、I/O完成端口可以非常智能的分派线程,但是IO完成端口仅对等待它的线程进行分派,创建和销毁线程的工作仍然需要我们自己来做。我们自己也可以创建线程,但是涉及到线程的编码操作比较复杂,容易出现差错。为了简化程序员的工作,Windows提供了一个线程池机制来简化线程的创建、销毁以及日常管理。这个新线程池可能不适用于所有的情况,但大多数情况下它都能够满足我们的需要。2、这个线程池能够帮助我们做原创 2014-04-01 16:33:26 · 1158 阅读 · 0 评论 -
Windows核心编程(十一)I/O完成端口
1、串行模型:一个线程等待一个客户(通常是通过网络)发出请求,当请求到达时,线程会被唤醒并对客户请求进行处理。并发模型:一个线程等待一个客户请求,并创建一个新的线程来处理请求。2、完成端口背后的理论是并发运行的线程数量必须有一个上限。由于太多的线程将会导致系统花费很大的代价在各个线程cpu上下文进行切换。使用并发模型与创建进程相比开销要低很多,但是也需要为每个客户请求创建一个新的线程。这开原创 2014-04-01 15:21:46 · 1617 阅读 · 0 评论 -
Windows核心编程(十)异步设备I/O
1、设备IO与CPU速度甚至是内存访问相比较都是比较慢的,而且更不可预测。虽然如此,通过使用异步设备IO我们仍然能够创造出更高效的程序。同步IO时,发出IO请求的线程会被挂起。而异步IO时发出请求的线程不会被挂起,而是可以继续执行。异步IO请求传给了设备驱动程序,被加入到驱动程序的请求队列中,驱动程序负责实际的IO操作。当设备驱动程序完成了对队列中IO请求的处理,无论成功与否都必须通知应用程序原创 2014-03-31 21:39:03 · 864 阅读 · 0 评论 -
Windows核心编程(九)同步设备I/O
1、同步IO指线程在发起IO请求后会被挂起,IO完成后继续执行。异步IO指线程发起IO请求后并不会挂起而是继续执行。IO完毕后会得到设备的通知。而IO完成端口就是实现这种通知的很好的一种方式。线程是我们开发高性能、响应性好的一个必不可少的工具。这样在多处理器上就可以同时执行多个操作,从而提高吞吐量。当线程发出一个同步设备IO请求的时候,它会被临时挂起,直到设备完成IO请求为止。但线程阻塞会原创 2014-03-31 17:12:02 · 743 阅读 · 0 评论 -
Windows核心编程(八)用内核对象进行线程同步
1、在用户模式下进行线程同步的最大好处就是速度非常快。因此当需要使用线程同步时用户模式下的线程同步是首选。但是用户模式下的线程同步也存在缺点。如InterLocked系列函数只能对一个值进行操作。关键段虽然可以对一段代码进行操作,但是只能对同一个进程内的线程进行同步。为了解决上述问题,我们将会讨论使用内核对象进行线程同步。与用户模式下的速度快相比较,使用内核对象进行线程同步性能很低。原因就是:原创 2014-03-31 15:24:36 · 888 阅读 · 0 评论 -
Windows核心编程(七)用户模式下的线程同步
1、系统中的线程必须访问系统资源,如堆、串口、文件、窗口以及其他资源。如果一个线程独占了对某个资源的访问,其他线程就无法完成工作。我们也必须限制线程在任何时刻都能访问任何资源。比如在一个线程读内存时要限制其他线程对此块内存进行写入。线程之间的通信很重要,尤其是在以下两种情况下:1)需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。2)一个线程需要通知其他线程某项任务已经原创 2014-03-30 15:57:29 · 1000 阅读 · 0 评论 -
Windows核心编程(六)线程调度、优先级和关联性
1、每个线程都有一个上下文CONTEXT结构,保存在线程内核对象中。这个上下文反映了线程上一次执行时CPU寄存器的状态。大约每隔20ms windows就会查看所有当前存在的线程内核对象。并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入cpu寄存器。这被称为上下文切换。(Windows实际上会记录每个线程运行的次数)。大约又过20ms windows将当前cpu寄原创 2014-03-30 13:48:30 · 1065 阅读 · 0 评论 -
Windows核心编程(五)线程基础
1、线程由两部分组成:线程内核对象:它是一个数据结构,操作系统用它来管理线程以及用它来存储线程的一些统计信息。线程栈:用于维护线程执行时所需的所有函数参数和局部变量。进程是有惰性的,进程从来不执行任何东西,它只是一个线程的容器。线程要在其进程的地址空间内执行代码和处理数据。位于同一个进程的线程共享进程的地址空间且它们共享进程句柄表。因为句柄表是针对进程的。进程需要很多的系统资源,而原创 2014-03-23 20:44:21 · 1045 阅读 · 0 评论 -
Windows核心编程(四)进程的创建与终止
1、进程是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构。操作系统内核通过它管理进程,即进程控制块(PCB)。进程一般被定义为一个正在运行的程序的一个实例,它由两部分组成:1)内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,还包括动态内存分配,比如线程堆栈和堆的分配。原创 2014-03-23 14:31:13 · 2756 阅读 · 0 评论 -
Windows核心编程(三)内核对象
1、内核对象:通过API来创建,每个内核对象是一个数据结构,对应一块内存,由操作系统内核分配,并且只能由操作系统内核访问。在此数据结构中少数成员(如安全描述符和使用计数)是所有对象都有的,但其他大多数成员都是不同类型的对象特有的。例如,进程对象有一个进程ID、一个基本的优先级和一个退出代码;文件对象有一个字节偏移量、一个共享模式和一个打开模式。2、内核对象的数据结构只能由操作系统提供的原创 2014-03-22 20:40:15 · 1471 阅读 · 0 评论 -
Windows核心编程(二)字符和字符串处理
1、缓冲区溢出错误是处理字符串时的典型错误。2、一般情况下Unicode都是指UTF-16,即每个字符编码为两个字节。大部分的WindowsAPI都是直接对Unicode字符串进行操作,所传入的多字节字符串会先转换为Unicode后再拿来使用。3、C语言用char数据类型来表示一个8位ANSI字符。在VC中定义了一个内置的数据类型wchar_t,它表示一个16位的Unicode字符。定原创 2014-03-22 17:13:31 · 706 阅读 · 0 评论 -
Windows核心编程(一)错误处理
1、常见的Windows函数返回值数据类型:---VOID:这个函数不可能失败。极少数的Windows函数返回值为VOID。---BOOL:函数失败返回值为0,否则返回一个非0值。应避免测试返回值是否为TRUE。应该检查它是否不为FALSE。---HANDLE:函数失败返回值为NULL,否则,HANDLE将标识一个可以操纵的对象。某些函数会返回INVALID_HANDLE_VALUE的原创 2014-03-22 15:51:27 · 850 阅读 · 0 评论