摘要:线程之间在以下两种情况下需要相互通信: 1. 多个线程在访问一个共享资源时保证资源不被破坏; 2. 一个线程在完成一个特定任务时需要通知其它线程。 原子访问:互锁函数 一个线程在修改一个共享资源时保证其它线程不能同时修改这个资源。以上这些函数在操作一个共享变量时不会被中断,也保证不会有两个线程同时修改这个共享变量。这些函数的实现依赖于 CPU 平台,对于 x86 CPU,互锁操作会向总线发出一个信...
阅读全文
随笔分类 - Windows Programming
记录有关 Windows 编程的学习笔记
摘要:每一个线程在它的线程内核对象中有一个上下文结构,反映了线程最后一次执行的 CPU 寄存器状态,每隔大约 20ms(可以使用 GetSystemTimeAdjustment 获得,我测得这个间隔大约为 15.6ms),Windows 在所有当前内核对象中查找可调度线程,并选择一个可调度线程,从这个线程的上下文结构中读取 CPU 寄存器状态,这个动作叫做“上下文切换”。这时,这个线程开始执行它的代码,...
阅读全文
摘要:Windows 提供的作业对象的作用是将多个进程组织在一起并且创建一个“沙盒”来限制这些进程的某些行为。你可以将作业看作是进程的容器,当然,一个作业可以只有一个进程与之相关。 如果一个进程与一个作业相关,没有办法将个进程和进程的所有子进程脱离这个作业,可以使用 IsProcessInJob 来获取它是否与某个进程关联。 默认情况下,当你从 Windows Explorer 中启动一个应用程序时,这...
阅读全文
摘要:象进程一样,线程也有两部分组成:内核对象,操作系统用于管理线程,保持线程统计信息;一个线程栈,用于维护所有函数参数及局部变量。 进程只是线程的一个容器,它本身不执行任何代码。线程执行代码并维护进程地址空间内的数据,所有线程共享单个进程的上下文,线程可以执行相同的代码,维护相同的数据,线程也共享所有内核对象句柄。 进程比线程使用更多的系统资源,这主要是因为地址空间的缘故,创建一个进程的地址空间需要大...
阅读全文
摘要:摘抄了 Windows via C/C++ 上的一段代码,一个函数——GetProcessElevation,返回安全令牌的提升类型和一个表示当前是否运行在管理员身份下。
阅读全文
摘要:Vista 之前的系统,当用户使用管理员账户登录时,一个安全令牌会被创建,之后操作系统访问一些安全资源时会用到它,由 Windows Explorer 开始,这个安全令牌会同新创建的进程关联,进而也影响到它们的子进程。恶意软件也会使用这个安全令牌运行,它就能访问到任意的资源。 从 Windows Vista 开始,如果一个用户作为系统管理员登录,除了相应的安全令牌创建之外,还创建了一个受限令牌(F...
阅读全文
摘要:当你设计一个应用程序时,你可能想使用一些需要长时间运行的代码,而又不中继当前正在进行的工作。一个方法是使用线程,将这个工作交由一个线程去执行,如果这些代码在运行过程中发生了错误,它可能会影响所在进程空间的所有线程。第二个方法是建立一个子进程,由这个子进程完成所需工作,这样子进程代码的错误不会影响到父进程的执行。 子进程与父进程之间可以通过动态数据交换(DDE)、OLE、管道、邮件槽等进行通信,使用...
阅读全文
摘要:一个进程可以有四种方式终止: 一、主线程的入口点函数返回 这个方式是最正常也是最值得推荐的方式,主线程的入口点函数返回确保了:任何由这个线程创建的 C++ 对象会通过该对象的析构函数清理;操作系统会释放由线程栈使用的内存;系统会将线程的入口点函数的返回值设置为进程的退出码(这个退出码由进程内核对象维护);系统将减少内核对象的使用计数。 二、进程的一个线程调用 ExitProcess 函数 进程内的...
阅读全文
摘要:CreateProcess 函数原型:当一个线程调用 CreateProcess 函数时,系统会创建一个进程内核对象,并将这个内核对象的使用计数初始化为 1,系统然后为这个新进程创建一个虚拟地址空间并将可执行文件的代码和数据还有所有需要的 DLL 加载到这个地址空间中,接着,系统为新进程的主线程创建了一个线程内核对象,这个线程开始执行由链接器设置的 C/C++ 运行时启动代码,最后才是你提供的 m...
阅读全文
摘要:进程通常定义为一个运行程序的实例,它有两个部分组成:一个是内核对象,操作系统用它管理进程;一个是地址空间,它包含了所有可执行的模块的代码和数据,也包含动态内存分配(如线程栈)和堆内存分配。 进程本身不会执行,为了完成某件事,必须有一个运行在它的上下文中的线程,这个线程负责执行进程空间中的代码。系统创建一个进程时会自动创建一个线程,叫做主线程,主线程还可以创建另外的线程,另外的线程还可以继续创建其它...
阅读全文
摘要:系统创建和维护了多种类型的内核对象,如:令牌对象、事件对象、文件对象、文件映射对象、I/O完成端口对象、作业对象、邮件槽对象、互斥对象、管道对象、进程对象、信号量对象、线程对象、等待对象和线程池工作工厂对象。 内核对象只不过是一块由内核分配的内存,这个内存块的数据结构成员维护着这个内核对象,一些成员对所有内核对象来说是相同的,如安全标识符、使用计数等,但多数成员是特定于对象类型的,如进程对象有一个...
阅读全文
摘要:Windows 给出的带有字符串参数的函数都有两个相同版本的函数与之对应,一个是 Unicode 版本,一个是 ANSI 版本,分别以 FunctionNameW 和 FunctionNameA 表示,FunctionName 实际上是一个宏定义。 用户在使用 FunctionNameA 版本的 ANSI 函数时,WIndows 内部会分配一块内存来将 ANSI 字符串转换为 Unicode 字符...
阅读全文
摘要:UTF – Unicode Transformation Format Windows 中的 Unicode字符 使用 UTF-16 编码,UTF-16 编码的每一个字符由2个字节(16位)组成。 UTF-8 编码:使用1到4字节表示一个字符。值小于 0x0080 的字符使用一字节,美国字符集一般属于这类;值位于 0x0080和0x07FF之间的字符使用两个字节,欧洲和中东国家的字符属于这一类;大...
阅读全文
摘要:参考MSDN(http://msdn.microsoft.com/en-us/library/aa383701.aspx) Header annotation 表示一个函数怎样使用它的参数和返回值。 在编译器的命令行中增加 /analyze 开关可以进行代码分析,当你在函数中使用违反注解定义的语法规则时编译器可以进行提示。 有两种注解:缓冲区注解和高级注解 缓冲区注解 缓冲区注解表示函数怎样使用它...
阅读全文
摘要:Microsoft C/C++ 编译器定义了一个内置的 wchar_t 数据类型,表示一个 UTF-16 字符,这个类型只有在编译器指定了 /Zc:wchar_t 开关后才有效。(之前的编译器将 wchar_t 类型定义为 unsigned short) 定义一个 wchar_t 类型的变量:字符串之前的“L”告诉编译器这是一个Unicode字符串。实际编写源代码时,一般用 TCHAR 来声明一个...
阅读全文
摘要:当调用一个Windows例程发生错误时,调用 GetLastError 函数获取一个错误编号来表明发生了什么错误,必须在例程返回后立即调用 GetLastError,否则返回的错误号可能已被更改。所有的Microsoft预定义的错误编号都在 WinError.h 头文件中定义。可以使用 VS 的“错误查找”工具来获得错误的文本信息。 某些例程成功返回,需要调用 GetLastError 来知道一些...
阅读全文

浙公网安备 33010602011771号