Windows 核心编程
genovia
这个作者很懒,什么都没留下…
展开
-
线程
线程也是由两个部分组成的: • 一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。 • 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量(第1 6章将进一步介绍系统如何管理线程堆栈)。 第4章中讲过,进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个原创 2010-07-29 06:05:00 · 364 阅读 · 0 评论 -
结构化异常处理
结构化异常处理( S E H) S E H实际包含两个主要功能:结束处理( termination handling)和异常处理( e x c e p t i o nh a n d l i n g)。本章讨论结束处理,下一章讨论异常处理。 一个结束处理程序能够确保去调用和执行一个代码块(结束处理程序,termination handler),而不管另外一段代码(保护体, guarded body)是如何退出的。结束处理程序的文法结构(使用微软的Visual C++编译程序)如下: __try{原创 2010-07-30 10:53:00 · 1362 阅读 · 0 评论 -
第18章 堆栈
由于进程的默认堆栈可供许多Wi n d o w s函数使用,你的应用程序有许多线程同时调用各种Wi n d o w s函数,因此对默认堆栈的访问是顺序进行的。换句话说,系统必须保证在规定的时间内,每次只有一个线程能够分配和释放默认堆栈中的内存块。如果两个线程试图同时分配默认堆栈中的内存块,那么只有一个线程能够分配内存块,另一个线程必须等待第一个线程的内存块分配之后,才能分配它的内存块。一旦第一个线程的内存块分配完,堆栈函数将允许第二个线程分配内存块。这种顺序访问方法对速度有一定的影响。如果你的应用程序只有一原创 2010-07-30 08:44:00 · 554 阅读 · 0 评论 -
内存映射文件
线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个已保留的区域。按照默认设置,系统保留1 MB的地址空间并提交两个页面的内存。但是,这些默认值是可以修改的,方法是在你链接应用程序时设定M i c r o s o f t的链接程序的/ S TA C K选项: /STACK:reserve[,commit]当创建一个线程的堆栈时,系统将会保留一个链接程序的/ S TA C K开关指明的地址空间区域。但是,当调用C r e原创 2010-07-30 08:18:00 · 2758 阅读 · 0 评论 -
第14章 虚拟内存
G e t S y s t e m I n f o函数将用于检索与主机相关的值:VOID GetSystemInfo(LPSYSTEM_INFO psinf);必须传递S Y S T E M _ I N F O结构的地址给这个函数。这个函数将初始化所有的结构成员然后返回。下面是S Y S T E M _ I N F O数据结构的样子。typedef struct _SYSTEM_INFO{ union { DWORD dwOemId; //Obsolete, do n原创 2010-07-30 04:55:00 · 475 阅读 · 0 评论 -
第13章 Windows的内存结构
3.1 进程的虚拟地址空间 由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。 前面说过,每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0 x 1 2 3 4 5 6 7 8,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0 x 1 2 3 4 5 6 7 8。当进程A中运行的线程访问地址为0 x 1原创 2010-07-30 03:01:00 · 538 阅读 · 0 评论 -
在应用程序中使用虚拟内存
Wi n d o w s提供了3种进行内存管理的方法,它们是: • 虚拟内存,最适合用来管理大型对象或结构数组。 • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。 • 内存堆栈,最适合用来管理大量的小对象。 本章将要介绍第一种方法,即虚拟内存。内存映射文件和堆栈分别在第1 7章和第1 8章介绍。 用于管理虚拟内存的函数可以用来直接保留一个地址空间区域,将物理存储器(来自页文件)提交给该区域,并且可以设置你自己的保护属性。 15.1 在原创 2010-07-30 07:11:00 · 1211 阅读 · 0 评论 -
3.3 跨越进程边界共享内核对象
许多情况下,在不同进程中运行的线程需要共享内核对象。下面是为何需要共享的原因: • 文件映射对象使你能够在同一台机器上运行的两个进程之间共享数据块。 • 邮箱和指定的管道使得应用程序能够在连网的不同机器上运行的进程之间发送数据块。 • 互斥对象、信标和事件使得不同进程中的线程能够同步它们的连续运行,这与一个应用程序在完成某项任务时需要将情况通知另一个应用程序的情况相同。 由于内核对象句柄与进程相关,因此这些任务的执行情况是不同的。不过,M i c r o s o f t 公司有若干很好的理由将句柄设计成与原创 2010-07-28 11:26:00 · 666 阅读 · 0 评论 -
复制对象句柄--D u p l i c a t e H a n d l e 函数
共享跨越进程边界的内核对象的最后一个方法是使用D u p l i c a t e H a n d l e 函数: BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, PHANDLE phTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle,原创 2010-07-28 11:23:00 · 2632 阅读 · 0 评论 -
第4章 进程
Windows支持两种类型的应用程序。一种是基于图形用户界面(GUI)的应用程序,另一种是基于控制台用户界面(CUI)的应用程序。 基于G U I 的应用程序有一个图形前端程序。它能创建窗口,拥有菜单,可以通过对话框与用户打交道,并可使用所有的标准“Wi n d o w s ”组 件。Wi n d o w s 配备的所有应用程序附件(如Notepad 、Calculator 和WordPad ),几乎都是基于G U I 的应用程序。基 于控制台的应用程序属于文本操作的应用程序。它们通常不能用于创建窗口或处理原创 2010-07-29 01:57:00 · 401 阅读 · 0 评论 -
Unicode 字符串—Windows 核心编程
2.8.1 C 运行期库对Unicode的支持 为了利用U n i c o d e 字符串,定义了一些数据类型。标准的C 头文件S t r i n g . h 已经作了修改,以便定义一个名字为w c h a r _ t 的数据类型,它是一个U n i c o d e 字符的数据类型: typedef unsigned short wchar_t;例如,如果想要创建一个缓存,用于存放最多为9 9 个字符的U n i c o d e 字符串和一个结尾为零的字符,可以使用下面这个语句:wcha原创 2010-07-28 07:18:00 · 735 阅读 · 0 评论 -
第9章 线程与内核对象的同步
9.1 等待函数 下面的内核对象可以处于已通知状态或未通知状态: ■ 进程 ■ 文件修改通知 ■ 线程 ■ 事件 ■ 作业 ■ 可等待定时器 ■ 文件 ■ 信标 ■ 控制台输入 ■ 互斥对象 线程可以使自己进入等待状态,直到一个对象变为已通知状态。 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是Wa i t F o r S i n g l e O b j e c t : DWORD WaitForSingleObje原创 2010-07-29 07:48:00 · 479 阅读 · 0 评论 -
用户方式中线程的同步
8.1 原子访问:互锁的函数家族 我们需要一种手段来保证值的递增能够以原子操作方式来进行,也就是不中断地进行。互锁的函数家族提供了我们需要的解决方案。互锁的函数尽管用处很大,而且很容易理解,却有些让人望而生畏,大多数软件开发人员用得很少。所有的函数都能以原子操作方式对一个值进行操作。让我们看一看下面这个I n t e r l o c k e dE x c h a n g e A d d函数: LONG InterlockedExchangeAdd( PLONG plAddend, LON原创 2010-07-29 07:08:00 · 489 阅读 · 0 评论 -
第一章 错误处理
可以通过配置查看窗口来始终显示该线程的最终错误代码号,以及对应于该错误的英文文本描述。通过在查看窗口中选择一行,然后键入“@err,hr”就能实现该功能。 如果在编写的应用程序中发现一个错误,可能需要把文本描述的错误信息显示给用户。微软提供了一个函数,将错误代码转换为其文本描述。该函数FormatMessage。 DWORD FormatMessage( DWORD dwFlags, // source and processing options LPCVOID原创 2010-09-10 15:27:00 · 387 阅读 · 0 评论