无论怎样创建内核对象,都要向系统指明将通过调用 CloseHandle 来结束对该对象的操作: BOOL CloseHandle(HANDLE hobj); 该函数首先检查调用进程的句柄表,以确保传递给它的索引(句柄)用于标识一个进程实际上无权访问的对象.如果该索引是有效的,那么系统就可以获得内核对象的数据结构的地址,并可确定该结构中的使用计数的数据成员.如果使用计数是0,该内核便从内存中撤消该内核对象.如果将一个无效句柄传递给CloseHandle,将会出现两种情况之一.如果进程运行正常,Cl…
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <tchar.h> #include <windowsx.h> #include <StrSafe.h> #include <process.h> #include "resource.h" /*****************************…
9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i t a b l e Ti m e r函数: HANDLE CreateWaitableTimer( PSECURITY_ATTRIBUTES psa, BOOL fManualReset, PCTSTR pszName ); p s a和p s z N a m e这两个参数在第3章中做过介绍.当然,…
Github https://github.com/gongluck/Windows-Core-Program.git //第3章 内核对象.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "第3章 内核对象.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLin…
内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存,由操作系统内核分配,并且只能由操作系统内核访问.在此数据结构中少数成员如安全描述符和使用计数是所有对象都有的,但其他大多数成员都是不同类型的对象特有的.内核对象的数据结构只能由操作系统提供的API访问,应用程序在内存中不能访问.调用创建内核对象的函数后,该函数会返回一个句柄,它标识了所创建的…
第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步机制是否适合需要. 虽然用户方式的线程同步机制具有速度快的优点,但是它也有其局限性.对于许多应用程序来说,这种机制是不适用的.例如,互锁函数家族只能在单值上运行,根本无法使线程进入等待状态.可以使用关键代码段使线程进入等待状态,但是只能用这些代码段对单个进程中的线程实施同步.还有,使用关键代码段时,…
先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define MAX_SIZE 0x500 HANDLE g_hSubmit; HANDLE g_hReturn; HANDLE g_hStop; }; unsigned int _stdcall ThreadServer(void* pParam) { while (TRUE)…
内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了,就像他们被载入内存中一样. 内存映射文件主要有三方面的用途: 1:系统使用内存映射文件来将exe或是dll文件本身作为后备存储器,而非系统页交换文件,这大大节省了系统页交换空间,由于不需要将exe或是dll文件加载到页系统交换文件,也提高了启动速度. 2:使用内存映射文件来将磁盘上的文件映射到进程…
进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create  mapping of Data]用来创建命名内存映射文件,后备存储器为页交换文件,而非磁盘上的文件,大小为4K,将全部大小映射到进程地址空间,将Data中的数据写入该内存映射文件,然后撤销对文件视图的映射.注意在进程1里不能CloseHandle(m_hFileMapping) 进程2 按钮[Open mapi…
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步也存在缺点.如InterLocked系列函数只能对一个值进行操作.关键段虽然可以对一段代码进行操作,但是只能对同一个进程内的线程进行同步.为了解决上述问题,我们将会讨论使用内核对象进行线程同步. 与用户模式下的速度快相比较,使用内核对象进行线程同步性能很低.原因就是:在创建或清除内核对象时调用线程必…