3.2.系统-windows
文章平均质量分 56
windows核心编程
raindayinrain
金融it研究院
专注于低延时&高并发网络库,高可用&负载均衡分布式软件架构
展开
-
windows核心编程---内核对象
-内核对象 1.每个内核对象都只是一个内存块,由操作系统内核分配,只能由操作系统内核访问。 2.这个内存块是一个数据结构,其成员维护着与对象相关的信息。 3.不能直接更改这些结构,可以利用windows提供的一组函数,以最恰当的方式来操纵这些结构。 4.创建一个内核对象后,会返回一个句柄,它标识了所创建的对象,可以将这个句柄想象为一个不透明的值。可由进程中任何线程使用。32位windows中原创 2017-09-22 07:24:47 · 561 阅读 · 0 评论 -
windows核心编程---DLL高级技术Ex
-显示地载入DLL模块HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);HMODULE WINAPI LoadLibraryEx( _In_ LPCTSTR lpFileName, // 为将来扩展预备,NULL。 _Reserved_ HANDLE hFile, // 0 // DONT_RESOLVE原创 2017-12-07 07:50:44 · 581 阅读 · 0 评论 -
windows核心编程---线程局部存储区
-概述 1.窗口附加字节,通过使用SetWindowWord和SetWindowLong将数据与一个指定的窗口关联。 2.可使用线程局部存储区将数据与一个正在执行的线程关联。 3.C/C++运行库使用了TLS。 C/C++运行库的大多数函数最初设计时,没有考虑多线程。-动态TSL 管理TLS的内部数据结构: 系统中的每个进程都有一组正在使用标志。 每个标志可被设为FREE或INUSE。原创 2017-12-10 11:59:18 · 473 阅读 · 0 评论 -
windows核心编程---结构化异常处理
-终止处理程序 结构化异常处理的好处是,写代码时,先集中精力完成正常流程。将功能处理,异常处理分开。进入,离开异常处理代码块时,编译器须生成一些特殊代码,产生一些关于支持SEH的数据结构表,提供回调函数,其它。 不同编译器对SEH的实现不尽相同,本章采用Microsoft Visual C++编译器规定的用法。C++异常处理:catch,throw。 和结构化异常处理形式不同。SEH: 终止原创 2017-12-20 07:01:49 · 347 阅读 · 0 评论 -
windows核心编程---堆
-堆 系统内部,堆就是一块预订的地址空间区域。刚开始,区域内的大部分页面没有调拨物理存储器。随着不断中堆中分配内存,堆管理器会给堆调拨越来越多的物理存储器。物理存储器从页交换文件中分配的。释放堆中内存块时,堆管理器会撤销已调拨的物理存储器。-进程的默认堆 1.进程初始化时,系统会在进程的地址空间中创建一个堆。称为进程的默认堆。默认的地址空间区域大小1MB。 创建应用时,可用/HEAP改变默认大原创 2017-12-02 11:52:28 · 313 阅读 · 0 评论 -
windows核心编程--在应用程序中使用虚拟内存
-windows三种内存操控机制 1.虚拟内存 2.内存映射文件. 3,堆.-预订地址空间区域 1.// 返回预订成功的区域的基地址PVOID VirtualAlloc(// 内存地址。// NULL:系统自动选择一块闲置区域。// 传给pvAddress的地址须始终位于用户的用户模式分区中。// 起始地址须是分配粒度整数倍。不是时,向下取整到整数倍后使用。// 如指定(300原创 2017-11-24 07:13:43 · 632 阅读 · 0 评论 -
windows核心编程---DLL基础
-DLL 1.windows API函数都在DLL中. 2.三个最重要的DLL Kernel32.dll:管理内存,进程,线程 User32.dll:执行用户界面相关,入窗口,窗口消息 GDI32.dll:绘制图像,显示文字。 AdvAPI32.dll:安全性,注册表,事件日志。 ComDlg32.dll:通用对话框控件。 ComCtl32.dll:通用控件 3.本章介绍,如何创建原创 2017-12-03 11:43:49 · 720 阅读 · 0 评论 -
windows核心编程---线程栈
-线程栈 1.系统创建线程时,会为线程栈预订一块地址空间区域,并给区域调拨些物理存储器. 默认:预订1MB,调拨2页面。 应用指定:/Freserve/STACK:reserve[,commit]API指定: CreateThread/_beginthreadex。2.举例: 页面大小设为4KB。 内存地址 页面状态 0x080FF000 栈顶:已调拨页面 0x080F原创 2017-11-26 16:45:54 · 349 阅读 · 0 评论 -
windows核心编程---异常处理程序与软件异常
CPU抛出的异常是硬件异常,操作系统和应用程序抛出的异常是软件异常。硬件或软件异常被抛出时,可用:__try{}__except(exception filter// 异常过滤程序){// 异常处理程序}一个__try后,只需跟一个__except或__finally(终止处理程序)。-异常过滤程序,异常处理程序 异常过滤程序,异常处理程序 主要有系统实现。只在__try块中发生异常原创 2017-12-20 07:47:40 · 779 阅读 · 0 评论 -
windows核心编程---未处理异常,向量化异常处理与C++异常
-未处理异常 异常过滤返回EXCEPTION_CONTINUE_SEARCH,向上搜索,但无法搜索到处理部分,产生未处理异常。// 负责处理未处理异常// 进程初始化时,设置处理未处理异常过滤函数PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(PTOP_LEVEL_EXCEPTION_FILTER pTopLevelExcept原创 2017-12-23 10:40:51 · 883 阅读 · 0 评论 -
windows核心编程---错误报告与应用程序恢复
-windows错误报告控制台 一个进程因为未处理异常而终止时,WER会创建关于未处理异常及其执行上下文的错误报告。如得到用户许可,报告会通过安全信道发给microsoft服务器,在那里它和数据库已知问题比较,如有解决方案,服务器将它发给用户。用户不发送报告给microsoft服务器,生成的报告会保存在用户机器上,通过WER控制台,用户可在本地机器上浏览查看报告。Program Reports a原创 2017-12-24 10:44:26 · 1155 阅读 · 0 评论 -
windows核心编程---DLL注入和API拦截
-派生子类窗口,要派生窗口属于另一个进程 SetWindowLongPtr会检查一个进程试图修改的WndProc是否是另一个进程的窗口的,如果是,忽略调用。可以在进程A获得进程B窗口的句柄。 FindWindow(xx); // 派生子类窗口,现在应用: SetWindowSubclass GetWindowSubclass RemoveWindowSubclass DefSubcla原创 2017-12-11 07:50:02 · 2070 阅读 · 0 评论 -
windows核心编程---内存映射文件
-处理文件 1.打开–读取–关闭。 2.打开–缓存算法来读取/写入不同部分。 3.内存映射文件。-内存映射文件 允许开发人员预订一块地址空间区域并给区域调拨物理存储器。 内存映射文件的物理存储器来自磁盘上已有的文件,而非页交换文件。文件映射主要用于: 1.系统用内存映射文件载入并运行.exe和dll文件。 2.用内存映射文件来访问磁盘上的数据文件。 3.用内存映射文件在同一台机器的不原创 2017-11-26 16:50:38 · 928 阅读 · 0 评论 -
windows核心编程--探索虚拟内存
-系统信息VOID GetSystemInfo(LPSYSTEM_INFO psi);dwPageSize:页面大小 dwAllocationGranularity:分配粒度-虚拟内存状态VOID GlobalMemoryStatusEx(LPMEMORYSTATUS lpBuffer);把一个进程地址空间中被保存在内存中的那些页面,称为它的工作集。BOOL GetProcessMemoryInf原创 2017-11-16 07:21:03 · 238 阅读 · 0 评论 -
windows核心编程--作业
作业-作业 windows提供了一个作业内核对象,允许我们将进程组合在一起并创建一个沙箱来限制进程能做什么.// 验证进程是否在一个作业控制下运行BOOL IsProcessInJob(HANDLE hProcess, HANDLE hJob, PBOOL pbInJob);默认下,用资源管理器启动一个应用,进程自动与一个专用作业关联。如为应用程序定义了一个清单,Windows资源管理器不会将我原创 2017-10-08 08:04:34 · 451 阅读 · 0 评论 -
Windows核心编程--错误处理/字符/字符串
一.错误处理-Microsoft编辑了一个列表,其中列出了所有可能的错误代码,并为每个错误代码都分配了一个32位的编号。 -在内部,Windows函数检测到错误时,使用“线程本地存储区”,将相应的错误代码和“主调线程”关联到一起。 -查看错误代码: // 返回由上一个函数调用设置的线程的32位错误代码DWORD GetLastError();-错误代码信息: WinError.h头文件包含了原创 2017-09-18 07:02:55 · 880 阅读 · 0 评论 -
windows核心编程---进程
进程-进程组成 1.一个内核对象,保存进程统计信息,操作系统用它来管理进程。 2.一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。还报错动态分配内存。-两类应用程序 GUI,CUI用Microsoft Visual Studio创建一个应用程序项目时,集成开发环境会设置各种链接器开关,使链接器将子系统的正确类型嵌入最终生成的可执行文件中。对CUI,链接器开关是 /SUBSYSTE原创 2017-09-26 06:54:19 · 1515 阅读 · 0 评论 -
Windows核心编程--线程
-线程组成 1.线程内核对象。 2.线程栈,用于维护线程执行时所需的所有函数参数和局部变量。同一进程内线程共享属于进程的资源。-线程函数 每个线程都须有一个入口点函数,这是线程执行的起点。 主线程的入口点函数:_tmain或_tWinMain。 辅助线程的入口点函数形式:“` DWORD WINAPI ThreadFunc(PVOID pvParam) {DWORD dwResult原创 2017-10-09 07:14:44 · 258 阅读 · 0 评论 -
windows核心编程---用内核对象进行线程同步
-概述 1.内核对象线程同步 优点: 可跨进程使用 可指定超时时间 缺点: 相比用户模式线程同步更耗时2.进程,线程,作业…几乎所有这些内核对象都可以用来同步。 对线程同步来说,这些内核对象中的每一种要么处于触发状态,要么处于未触发状态。进程内核对象,在进程终止时,操作系统自动使进程内核对象变为触发状态。 线程内核对象在创建的时候处于未触发状态,当线程终止时,操作系统自动将线程对象的原创 2017-10-16 07:06:46 · 851 阅读 · 0 评论 -
Windows核心编程--线程调度/优先级/关联性
-上下文切换 大约每个20ms,Windows会查看所有当前存在的线程内核对象。在这些对象中,只有一些被认为是可调度的。Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值(保存在线程内核对象的CONTEXT结构成员里)载入CPU寄存器。Windows之所以被称为抢占式多线程操作系统,是因为系统可在任何时刻停止一个线程而另行调度另一个线程。 被挂起的线程,等待某事件发生原创 2017-10-11 06:57:51 · 490 阅读 · 0 评论 -
windows核心编程---用户模式下的线程同步
-原子访问:Interlocked系列函数 原子访问:一个线程在访问某个资源的同时能保证没有其它线程会在同一时刻访问同一资源。LONG InterlockedExchangeAdd(PLONG volatile plAddend,LONG lIncrement);LONGLONG InterlockedExchangeAdd64(PLONGLONG volatile pllAddend,原创 2017-10-14 10:24:30 · 357 阅读 · 0 评论 -
windows核心编程--同步设备I/O与异步设备I/O
-目标 设计高性能,伸缩性好,响应性好,而且健壮的应用。当线程发出一个同步设备I/O请求的时候,它会被临时挂起,直到设备完成I/O请求为止。但,出于性能原因,我们希望线程不被阻塞,可以始终进行有用的工作。为了不让线程闲下来,我们需让各个线程就它们正在执行的操作相互通信。这种机制被称为I/O完成端口,它可以帮助我们创建高性能且伸缩性好的应用程序。通过使用I/O完成端口,可以让线程在读取设备和写入设备原创 2017-10-21 11:06:58 · 625 阅读 · 0 评论 -
windows核心编程实践---快照
本章深入探讨windows所使用的内存体系结构-进程的虚拟地址空间 1. 对32位进程,这个地址空间大小为4GB。 对16位进程,这个地址空间大小为16EB。因为每个进程都有自己专有的地址空间,当进程中各线程运行时,它们只能访问属于该进程的内存。 正运行的进程,看不到属于操作系统本身和其它进程的内存。进程的地址空间只不过是一个内存地址区间,为了能正常读/写数据,还需要把物理存储器分配或映射到原创 2017-11-07 07:49:56 · 801 阅读 · 0 评论 -
windows核心编程---windows线程池
-概述 1. I/O完成端口只对等待它的线程进行分派,创建和销毁线程的工作仍然必须由我们自己完成。 对如何创建和销毁线程,每个人有自己的意见。 为了简化开发人员的工作,windows提供了一个(与I/O完成端口相配套的)线程池机制来简化线程的创建,销毁以及日常管理。这个新的通用线程池可能并不适用于所有的情况,但很多情况下它能够满足我们的需要并节省大量的开发时间。2.这些新的线程池函数允许我们原创 2017-11-02 07:43:44 · 492 阅读 · 0 评论 -
windows核心编程--纤程
-概述 为了更容易将已有的UNIX服务器应用迁移到Windows,增加了纤程。 UNIX应用程序的开发人员创建了线程包,来实现类似线程功能。为了帮助各公司更快,更正确地将代码移植到windows,windows在系统中增加 了纤程。-使用纤程 线程在windows内核中实现的。 纤程是在用户模式下实现的。一个线程可包含多个纤程。1. 将一个已有的线程转换为一个纤程。PVOID Conver原创 2017-11-05 08:49:52 · 581 阅读 · 0 评论 -
windows核心编程---windows内存体系结构
-虚拟地址空间的分区 1.空指针赋值区 2.用户模式分区 进程无法访问驻留在这一分区的其它进程的数据。 3.内核模式分区 驻留在这一分区内的任何东西为所有进程共有。-地址空间中的区域 1.创建进程并赋予它地址空间时,可用地址空间的大部分是闲置或未分配的。 须先预订–VirtualAlloc。 预订: 区域起始地址:分配粒度整数倍。系统预订区域不受限。 区域大小:页面大小整数倍。释原创 2017-11-16 06:42:54 · 294 阅读 · 0 评论 -
comment
// 放置一个一个comment record 到对象文件或可执行文件// comment-type:// compiler:// exestr:// lib :// 在对象文件中放置一个library-search record// commentstring:库名或路径#pragma comment( comment-type [,"commentstring"] )// lin原创 2017-12-17 18:56:21 · 333 阅读 · 0 评论