Windows核心编程
yuanweihuayan
准备研究发布windows内核相关文章
展开
-
InterLockedIncrement and InterLockedDecrement函数原理
实现数的原子性加减。什么是原子性的加减呢?举个例子:如果一个变量 Long value =0;首先说一下正常情况下的加减操作:value+=1;1:系统从Value的空间取出值,并动态生成一个空间来存储取出来的值;2:将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束。如果此时有两个Thread ,分别记作threadA,threadB。1:threa转载 2011-06-15 21:51:00 · 979 阅读 · 0 评论 -
第十五章:在应用程序中使用虚拟内存
1. Window提供了一下三种机制来对内存进行操控:◆ 虚拟内存:最适合用来管理大型对象数组或大型结构数组◆ 内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据◆ 堆:最适合用来管理大量的小型对象预定地址空间区域:PVOID VirtualAlloc(PVOID pvAddress,//内存地址(即我们需要使用那块内存,只需传原创 2011-12-14 21:44:51 · 975 阅读 · 0 评论 -
第十九章:DLL基础
1. 我们必须理解一个地址空间是由一个可执行模块和多个DLL模块构成的.当一个模块提供一个内存分配函数的时候,它必须同时提供另一个用来释放内存的函数.2. 实际开发中,应该避免从DLL中导出变量,因为这等于去掉了代码中的一个抽象层,从而使得DLL的代码更加难以维护.此外,只有当导出C++类的模块使用的编译器与导入C++类的模块原创 2012-02-19 22:17:37 · 1082 阅读 · 2 评论 -
第十六章-十七章:线程栈 - 内存映射文件
第十六章:线程栈1. 系统对线程占的使用规则是:首先预定1M的空间和调拨两个页面的存储器.然后线程开始执行前,将预定的末尾空间指向线程栈的指针.当有线程需要更多的页面时,就会试图访问防护页面.这样系统就调拨防护页面的下一页面作为新的防护页面.把之前的防护页面作为空间分配使用. 再者,假若线程需要申请栈底前一个页面时,因为此时没有更多的内存可供使用,所以,只是将防护页面当做分配的页面使原创 2012-02-19 22:03:11 · 1288 阅读 · 0 评论 -
第十八章:堆
1. 堆非常适合分配大量的小型数据.与内存映射文件和虚拟内存相比,堆是用来管理链表和树的最佳方式.◆ 优点:让我们专心解决手头上问题,而不必理会分配粒度和页面边界这类事情.◆ 缺点:分配和释放内存块的速度比其他方式慢.而且也无法在对物理存储器的调拨和撤销进行直接控制 堆使用的区域时页交换文件中分配的.此外,系统保证不管发生什么事情都以互斥访问堆(分配和释放).用GetPro原创 2012-02-19 22:03:51 · 1039 阅读 · 0 评论 -
第四章:进程
1. 进程的组成:◆ 一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。◆ 一个地址空间。其中包含可执行文件或DLL模块的代码和数据。此外它还包含动态内存分配,比如线程堆栈和堆的分配。2. CUI程序的链接开关是:/SUBSYSTEM:CONSOLE入口点函数:_tWinMain或者_tmain(具体的符号取决于我们了是否要使用Unicode字符串.操作原创 2011-07-24 21:21:18 · 1446 阅读 · 0 评论 -
RegNotifyChangeKeyValue监视注册表
The RegNotifyChangeKeyValue function notifies the caller about changes to the attributes or contents of a specified registry key. Note that the function does not notify the caller if the specified key原创 2012-10-02 21:33:18 · 2604 阅读 · 0 评论 -
线程状态切换 退出-暂停-继续
对于SuspendThread函数的没有真正理解清楚.直到最近使用多线程执行任务的时候,发现有时候使用它比额外使用内核对象来更加方便.DWORD WINAPI ThreadProc( PVOID pvParament ){int iCnt = 0;while ( 1 ){cout<<iCnt<<endl;if ( iCnt > 10000 )原创 2012-10-05 22:10:50 · 1969 阅读 · 0 评论 -
内存分配方式
在编程过程中,我们经常需要和内存打交道,其中最重要的当属野指针问题.这个在很多书里面都有介绍,这里重点是讨论各种方式的优缺点.1. char p[1024][100];//这里分配1024 * 100字节.这种分配方式主要的缺点是:内存无法做到实时释放.而且在分配的时候有大小限制.2. BYTE* lpBuffer = new BYTE[ 10 * 1024*1024];char* p原创 2012-10-15 21:15:51 · 2458 阅读 · 0 评论 -
CreateWaitableTimer与SetWaitableTimer详解
可等待定时器问题:1. 需要的函数:CreateWaitableTimer,SetWaitableTimer.前者创建一个可等待定时器句柄,后者设置等待定时器触发的条件.我们可以多次调用SetWaitableTimer来重置可等待定时器.重置后之前的定时器将关闭.2. 主要看两段代码:代码一:(这段代码在网上出现的概率是较大的)HANDLE hTimer = CreateWaita原创 2012-09-25 23:12:08 · 6976 阅读 · 2 评论 -
Explorer.exe创建与结束"特性"
在程序中经常需要删除某一个指定文件,但有些文件一直会被资源管理器占用,所以总是删除失败.如果要强行用程序删除除了360那种暴力删除还有一种比较容易想到的就是结束资源管理器并删除文件,然后在把资源管理器起来.哈,总算引到这上面来了.结束进程,经常使用TerminateProcess函数,创建进程使用CreateProcess.但就是这两个常见的函数也有一些鲜为人知的”秘密”(姑且这样叫)原创 2012-10-18 23:16:57 · 1802 阅读 · 0 评论 -
内存映射文件原理探索
http://blog.csdn.net/yuanweihuayan/article/details/8074764这篇文章简单的讨论了虚拟内存的使用方式.其实和虚拟方式差不多的另一种内存分配方式是内存映射文件.这两种方式给我的感觉主要的区别是一个在pagefile使用pagefile来缓存,一个使用磁盘(包括pagefile). 内存映射文件实际上是如何分配和使用的,核心编程讲的确实转载 2012-10-20 21:34:54 · 1292 阅读 · 0 评论 -
第九章:用内核对象进行线程同步(一)
由于第九章笔记比较多,现在分为两篇文章发表1. 第八章所有的同步函数都是工作在用户模式下,而如果要使用内核模式下的线程同步函数需要耗费一定的时间作为代价.线内核对象的两种状态:● 触发:对象调度结束● 未触发:对象正在调度.其实,进行内核对象的内部有一个布尔变原创 2011-10-09 21:42:47 · 1737 阅读 · 2 评论 -
第十章:同步设备I/O与异步设备I/O
由于第十章的笔记也比较多,现在先将前一部分的笔记贴出来.1. 用来打开各种设备的函数设备用来打开设备的函数文件CreateFile(pszName为路径名或UNC路径名)目录CreateFile(pszName为路径名或UNC路径名).如果在调用CreateFile 的时候指定FILE_FLAG_B原创 2011-10-27 22:27:05 · 1488 阅读 · 0 评论 -
第十四章:探索虚拟内存
1. 获取系统相关信息:VOID GetSystemInfo( LPSTYSTEM_INFO psi);其中SYSTEM_INFO结构体定义如下:typedef struct _SYSTEM_INFO { union { DWORD dwOemId; //struct { WORD wProcessorArchitecture; //表示处理器的体系结构WORD原创 2011-12-04 22:09:03 · 1102 阅读 · 0 评论 -
第一章:错误处理
1. Windows函数错误处理步骤:调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务.如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败了.Windows函数的常见返回值:数据类型指出函数调用失败的值VOID这个函数不可能失败.只有极少数Windows函数的返回原创 2011-06-19 21:12:00 · 907 阅读 · 0 评论 -
第二章:字符串和字符串处理
1. char(表示8位ANSI),wchar_t(表示16位的Unicode字符,而且由于早期版本的编译器没有提供这个内建的数据类型,所以编译器只有在指定了/zc:wchar_t编译开关时才会定义这个数据类型,默认是指定的.)说明:在编译器内建对wchar_t的支持之前,有一个C头文件定义了一个wchar_t数据类型,如下所示: typedef unsigned原创 2011-06-26 19:37:00 · 1284 阅读 · 0 评论 -
第三章:内核对象
1. 每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息.少数成员(安全描述符和使用计数等)是所有对象都有的,但其他大多数成员都是不同类型的对象特有的. 内核对象的所有者是操作系统内核,而非进程.原创 2011-07-27 22:42:26 · 1053 阅读 · 0 评论 -
第五章:作业
第五章的笔记我做了很长时间,主要是最近很忙,前不久去了南京出差.今天把东西补上. 1.Windows提供了一个作业内核对象,他允许我们将进程组合在一起并创建一个"沙箱"来限制进程能够做什么,最好将作业对象想象成一个进程容器,但是创建一个只包含单个进程的作业同样非常有用(这样一原创 2011-09-08 21:22:28 · 1716 阅读 · 1 评论 -
第六章:线程基础
第六章1.线程的组成:● 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方.● 一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量2. 线程的入口函数:DWORD WINAPI ThreadFunc( PVOID pvP原创 2011-09-15 22:06:24 · 2239 阅读 · 2 评论 -
第七章:线程调度、优先级、和关联性
1. 上下文切换:大约每隔20ms(具体时间可以使用GetSystemTimeAdjustment函数的第二个参数来查看),windows都会查看所有当前存在的线程内核对象.在这些对象中,只有一些被认为是可调度的.windows在可调度的线程内核对象中选择一个,并将上次保存在线程原创 2011-09-19 22:20:10 · 2032 阅读 · 0 评论 -
第九章:用内核对象进行线程同步(二) .
7 互斥量内核对象用来确保一个线程独占对一个资源的访问.■ 组成:①使用计数②线程ID:标示当前占用这个互斥量的是系统中那个线程③递归计数: 表示这个线程占用该互斥量的次数.■ 与关键代码段的区别:● 互斥量是内核模式下的,而关键代码段是用户模式下的.也意原创 2011-10-11 22:19:21 · 1197 阅读 · 0 评论 -
第八章:用户模式下的线程同步
1. 在以下两种情况下,线程之间要相互通信.■ 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性.■ 一个线程需要通知其他线程某项任务已经完成.2. 原子访问:一个线程在访问某个资源的同时能保证没有其他线程会在同一时刻访问同一资源.Windows提供了原创 2011-10-08 22:38:52 · 1264 阅读 · 0 评论 -
OnPaint和OnEraseBkgnd的区别与联系
在MFC中 任何一个window组件的绘图 都是放在这两个member function中在设定上 OnEraseBkgnd()是用来画底图的 而OnPaint()是用来画主要对象的举例说明 一个按钮是灰色的 上面还有文字则OnEraseBkgnd()所做的事就是把按钮画成灰色而OnPaint()所做的事就是画上文字既然这两个member function都是用来画出组件的转载 2011-10-09 11:08:36 · 1277 阅读 · 0 评论 -
第十二章:纤程
1. 线程时在内核中实现的,纤程是在用户模式下实现(即windows不负责对前程进行处理).将线程->纤程:PVOID ConvertThreadToFiber(PVOID pvParam);函数功能:这个函数会为纤程的执行上下文分配大约200字节的内存.上下文的组成如下:● 一个用户自定义值(他被初始化为传给ConvertThreadToFiber的pvParam参数的 值● 结原创 2011-11-14 20:59:22 · 1112 阅读 · 0 评论 -
第十三章:windows内存体系结构
1. 虚拟地址空间的分区◆ 空指针赋值分区(从0x00000000~0x0000FFFF的闭区间).保留该分区的目的是为了帮助程序员捕获对空指针的赋值.如果进程中的线程试图读取获取写入位于这个分区内的内存地址,就会引发访问违规.(注明:我们在运行代码的时候常常会碰到一种情况就是,我们指针还没有分配指向的空间就开始进行指向操作.这样我们的程序如果是在Debug模式下,程序会down在一个地方,我原创 2011-11-22 22:24:12 · 897 阅读 · 0 评论 -
第十章:同步设备I/O与异步设备I/O(二)
5. 用来接收I/O完成通知的方法:技术摘要触发设备内核对象当向一个设备同时发出多个I/O请求的时候,这种办法没什么用.它允许一个线程发出I/O请求,另一个线程对结果进行处理触发事件内核对象这种方法允许我们向一个设备同时发出多个I/O请求,它允许一个线程发出I/O请求,另一个线程对结果进行处理原创 2011-11-03 21:09:01 · 1432 阅读 · 0 评论 -
第十一章:线程池
1. Windows提供了一个(与I/O完成端口相配套的)线程池机制来简化线程的创建,销毁以及日常管理.这个线程池函数,允许我们做以下事情:● 以异步的方式来调用一个函数● 每隔一段时间调用一个函数● 当内核对象触发的时候调用一个函数● 当异步I/O请求完成的时候调用一个函数2. 以异步方式来调用函数VOID NTAPI SimpleCallback(PTP_CALLB原创 2011-11-11 23:02:49 · 1615 阅读 · 0 评论 -
即插即用型设备驱动的加载过程
现假设驱动程序已被正确安装:1.某种PnP总线驱动发现了即插即用设备的存在:①对于热插拔设备,则发现过程发生于插入设备的瞬间;②如果是非热插拔设备,则发现过程发生于系统启动时2.PnP总线驱动利用即插即用协议询问设备的ID信息设备的ID信息是一个能够唯一标识该设备的字符串,一般格式为:总线类型&厂商ID&产品ID&设备ID&版本号3.PnP总...原创 2019-08-19 22:07:59 · 915 阅读 · 0 评论