自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 资源 (26)
  • 收藏
  • 关注

原创 WINDOWS核心编程——DLL基础和实操

与将所有的指令通过链接器在生成exe的时候都链接在一起并安排好各个指令的位置不同,windows还提供了动态链接(DLL)技术。一般情况下我们会处于以下原因采用DLL技术:1.扩展了应用程序的特性。DLL可以被动态地载入到进程的地址空间中。2.简化了项目管理,可以让不同的开发团队管理不同的模块。3.有助于节省内存。一个dll可被多个程序共享。多个程序调用同一个dll内的同一个函数时,系统却只需将该...

2018-03-14 15:22:26 9035

原创 WINDOWS核心编程——异常处理

我觉得这篇文章讲的比书上更清楚:http://blog.csdn.net/pokeyode/article/details/53426340

2018-03-14 15:22:01 694

原创 WINDOWS核心编程——Windows内存管理

想要了解Windows内存体系结构首先要对系统的内存的分段分页和进程隔离机制要有所了解。系统为了对进程进行隔离,使得每个进程只能访问自己申请的内存而不能访问其他进程的内存资源,对每个进程的内存使用线性地址编制,在通过内存的分页机制在进程需要访问物理内存时通过进程的页表找到世界的物理内存的地址通过系统读写内存中的数据。在早期总线(20位寻址1M)大于寄存器(16位寻址64k)的情况下为了表示更多的物

2017-07-18 20:53:07 8726 1

原创 WINDOWS核心编程——线程池和纤程

微软这是对开发者友好的的软件厂商,在直接提供线程池使得开发者在需要使用线程池时无需自己编写(特别是调度的部分),用户无需自己创建和管理线程。微软默认用户使用线程池与不同的对象关联来满足四种需求:1.以异步的方式调用一个函数。用户需要异步调用一个函数,主要将这个函数地址传给线程池,系统就会在合适的时间调用它。函数地址当然必须是接口定义好的函数指针。//回调函数指针类型VOID NTAPI

2017-07-13 21:35:26 679

原创 WINDOWS核心编程——设备IO

IO是程序与外部通信的主要方式,程序通过API可以与以下设备通信,windows将这些抽象为设备通过CreateFile函数打开设备,通过CloseHandle关闭设备。HANDLE CreateFile( PCTSTR pszName, //普通文件名或者设备文件名 DWORD dwDesiredAccess, //访问模式(写/读) DWORD dwShare

2017-07-12 19:26:54 548

原创 WINDOWS核心编程——线程同步

线程同步主要涉及两个问题:1.不同的线程使用同一个资源但要保证资源完整有效。2.不同的线程之间的互相协作完成一个工作。所有的线程同步无外乎就是高效的(不浪费CPU)的实现这两个目的。同样我们需要了解在多线程环境下为什么会出现这两个问题和这两个问题如何表现:1.刨除软件设计本身的原因,在多线程环境下CPU的高速缓存行在多线程环境下引入了之前未考虑到的复杂性,对于在不同CPU中执行的线程使用同

2017-07-11 17:16:01 561

原创 WINDOWS核心编程——线程基础

线程是进程中可以被系统(作业系统)调度的最小单位。线程可以使用进程中的任何资源,他自身只包含有必要的独立的线程栈和寄存器。线程的设计是为了提高CPU的使用率:当系统同时拥有多个CPU时让每个CPU都执行一个指令流在同一时间进行两个工作。当进程只拥有一个CPU的执行时间时,若执行流中发生阻塞(等待)而阻塞时不需要CPU执行任何指令,这时候可以让CPU去执行其他指令称之为线程切换,在阻塞解除又具备

2017-07-07 14:10:42 380

原创 WINDOWS核心编程——进程和作业

要理解进程首先要厘清下概念。进程是程序可执行文件在系统中运行的实例。进程是被系统所管理的资源的集合,cpu计算资源也是一种资源被用于执行代码所生成的指令,cpu执行指令流的最小单位就是线程,一个进程中必然含有一个线程。main函数被称为入口函数,指定了进程进入我们所设计的流程位置,即当指令流执行到main函数代码所生成的指令时就进入到我们(用代码)设计的流程中。故main函数被称为入口函数而非

2017-07-06 14:45:47 924

原创 WINDOWS核心编程——必备知识

第一部分内容不多:1.调用API失败之后如何查看发生了什么错误。2.安全的使用字符串函数,避免发生读写越界的情况。3.内核对象和内核句柄的基本概念,内核对象在进程中表现为句柄只能通过API操作句柄对象,无法直接访问。1.对于系统API而言通常不会抛出异常,而采用放回值来报告函数调用失败,通常有如下几种返回值类型:API函数发生时调用SetLastError把错误类型放到线程局部存储

2017-07-04 18:31:20 1076

原创 windows程序设计——多重文件介面

简单地说,就像Windows 在一个萤幕上维护多个应用程式视窗一样,MDI 应用程式在一个显示区域内维护多个文件视窗。框架窗口与客户窗口显示如下:每个窗口激活时会对应各自的菜单:frame,clientwind,childwind关系如下:以上窗口的实现如下:/*------------------------------------------

2017-06-29 17:37:12 333

原创 windows程序设计——对话方块

之前所有介绍的资源中,最复杂的也不过菜单,这些资源只能承载简单的信息和交互(wm_command)。如果需要更加复杂和信息展示和交互,可以使用另外一种资源——对话框。与其他所有的资源一样对话框同样可以通过资源编辑器以所见即所得的方式进行编辑并在生成时链接到exe文件中或者直接用代码进行动态创建。建议使用编辑资源的方式来使用对话框。对话框在rc文件中的结构描述如下:///////////////

2017-06-27 17:07:51 467

原创 windows程序设计——功能表及其他资源

打开workspace的ResourceView可以看到系统的常用资源:图示、游标、字串、自订资源、功能表、键盘加速键、对话方块、点阵图。windows提供了一种直观的方式使得我们在开发过程中可以在资源编辑器中以所见既所得的方式来编辑这些资源,在生成可执行文件的时候资源编译器编译这些资源编译为二进制内容,并在程序连接的时候作为程序的一部分连接到可执行文件中。但资源被添加到工程中时,系统会为资源

2017-06-26 21:28:14 734

原创 windows程序设计——子视窗控制项

我们以一个窗口作为消息处理的主体,除了鼠标、键盘、定时器外,窗口中的子窗口发送的消息也可作为一种输入。当子窗口的自身处理消息,在必要时给父窗口发送消息,相当于父窗口的的高阶输入设备,这个称为"子视窗控制项"。常见的有:按钮、核取方块、编辑方块、清单方块、下拉式清单方块、字串标签和卷动列等,windows为这些基本项目都编写了默认的处理代码,我们只需要在主窗口中获取并处理(WM_COMMAND)消息

2017-06-23 16:53:08 338

原创 windows程序设计——计时器

可能不是很直观,但计时器确实算的上一个输入设备。当设置了一个定时器是,系统设置一个计时数,由windows系统接收到硬件的tick信号将计时数减去一定值,当减少到0时,系统在程序的消息队列中加入一条WM_TIMER消息。因此timer消息是个同步消息,与鼠标与键盘的输入一样通过getmesssage获取到消息之后在dispatch到对应的窗口中。定时器还是一种系统资源,若不再需要需要释放。故一下两

2017-06-14 17:32:03 2048

原创 windows程序设计——鼠标

现代计算机中除了键盘作为输入设备,更常用的还有鼠标。可以通过API来确定系统中是否存在鼠标并可以自定义界面上显示鼠标指针形状。鼠标的按键比键盘少,而且能进行的操作就是按下、抬起、移动,与键盘一样用户不需要直接处理指标的硬件信号,系统将这些动作都转化为虚拟按键消息发给程序。fMouse = GetSystemMetrics (SM_MOUSEPRESENT) ; //判断鼠标是否存在wndcl

2017-06-06 13:41:53 761

原创 windows程序设计——键盘

键盘是windows的基础输入设备,用户通过键盘可以通过键盘上的按键来控制系统与输入内容。为满足键盘的这两个功能要求系统将键盘产生的消息区分为按键消息和字符消息(当然具体处理的时候并没有严格限定按键消息只能用于控制系统,字符消息只能用于输入文字,用户自定义处理可以识别按键信息用于输入,使用字符信息用于控制)。按键消息有系统按键消息和普通按键消息,系统按键消息经常由与Alt 相组合的按键产生,按

2017-06-01 17:32:32 1946

原创 windows程序设计——图形基础

如前所诉,windows输出图形到显示器上采用绘制的形式,除了文字之外,windows还有能绘制其余几个基本图形,通过绘制这些基本图形最后组合出复杂界面。基本图形包括:直线和曲线、填入区域、点阵图、文字。与文字输出一样,windows程序并不直接操作输出对象,而是通过操作句柄来操作绘图设备。除了更安全的原因之外,操作HDC还有抽象的意味,如以绘图设备指代显示器或者打印机使得不需要对两个输出设备

2017-05-31 17:45:59 1816

原创 windows程序设计——输出文字

通常windows程序以响应WM_PAINT消息的方式而不是主动绘制,在客户区中输出文字和图形来向用户展示信息。在发生下面几种事件之一时,视窗讯息处理程式会接收到一个WM_PAINT 消息:1.在使用者移动视窗或显示视窗时,视窗中先前被隐藏的区域重新可见。2.使用者改变视窗的大小(如果视窗类别样式有著CS_HREDRAW 和CS_VREDRAW位元旗标的设定)。3.程式使用Scroll

2017-05-26 15:37:39 2567

原创 windows程序设计——视窗和讯息

windows最大的进步就是可视化的窗口显示信息,我们可以自定义一个窗口,并处理窗口的消息。windows程序的驱动机制称为消息驱动,既程序通过被动的响应消息来与用户交互。用户通过输入设备向系统输入事件,系统检测到事件或者系统本身定义的事件条件被触发,通过发送消息的方式通知程序,而程序对不同的消息采用不同的处理之后再反馈给用户,这个流程被称为消息处理框架。/*-----------------

2017-05-25 15:21:04 331

原创 windows程序设计——开始、Unicode 简介

大师的书真是太啰嗦了,我认为直接给代码和注释,是更高效率的方法(依然用的vc6)。#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MessageBox (NULL, TEXT

2017-05-24 11:55:21 363

原创 算法导论 第二十六章 最大流

26.1 流网络对于存在平行边的问题,通过加入一个虚拟节点来保持性质,如对C(v1, v2) = a,C(v2, v1) = a,引入节点v'C(v1, v2) = a,C(v2, v') = a,C(v',v1) = a,如下图:而对于多个源点和多个汇点的网络,通过引入一个超级原点和超级超级汇点来处理。26.2 Ford-Fulkersion方法

2017-05-17 19:01:34 3133

原创 资源泄漏的调试

资源泄漏就是进程向系统申请了资源但是用完了没有还给系统,造成了系统资源一直被占用,无法重复利用。系统资源有限,资源泄漏的后果就是资源耗尽。简单的句柄泄漏以如下代码生成exe:#ifndef __SRV_H#define __SRV_H#include class CServer{public: static BOOL GetTextFileContents(HAN

2017-04-27 19:27:47 943

原创 算法导论 第二十五章 所有节点对的最短路径问题

基于单源最短路径问题的讨论,解决所有最短路径问题,对每个节点求其最短路径:25.1 最短路径和矩阵乘法

2017-04-25 17:32:05 1016

原创 算法导论 第二十四章 单源最短路径

def:单源最短路径既从节点s出发到其他的所有能到达的节点的的最短路径。对于存在权重为负数的边,只要这边不形成环,或者整个环路的权重大于零则可以认为最短路径依然有解。我们使用前驱子图来表现最短路径

2017-03-20 19:21:22 548

原创 堆的调试

在有堆的基础认识之后,可以开始动手模拟与堆相关的调试技术。1.堆简介

2017-03-07 15:29:39 474

转载 在软件开发生命周期中使用应用程序验证器

转自https://msdn.microsoft.com/zh-cn/library/aa480483.aspx#EHAA发布日期 : 2006-6-5 | 更新日期 : 2006-6-5摘要Microsoft® Application Verifier (AppVerifier) 是针对非托管代码的运行时验证工具,它有助于找到细小的编程错误、安全问题和受限的用户帐

2017-02-23 13:31:08 510

原创 栈的调试

在有了栈和函数调用的认识之后,可以动手模拟和栈相关的调试技术。

2017-01-23 17:40:46 507

原创 算法导论 第二十三章 最小生成树

def:对于图G(V,E)集合E中的边带有权重,存在一个包含所有节点的树并树边为E的子集,使得所有边的权重最小,则该树称为最小生成树。32.1 最小生成树的形成我们使用贪心算法来找到一个最小生成树23.2 Kruskal算法和Prim算法

2017-01-20 20:50:53 791

原创 算法导论 第二十二章 基本的图算法

22.1图的表示图结构G(V,E)由顶点V和边E的集合组成,主要有邻接链表表示和邻接矩阵表示,两者的差别如下所示:若为节点添加属性则可以通过改变节点自身的值,或者为节点添加属性或在节点中增加新的指针的方式来实现。权重也是属性的一种。22.2广度优先搜索

2016-12-29 21:04:55 549

原创 WinDbg使用基础

启动WinDbg后发现以一般的软件并没有什么差别,菜单工具栏,客户区,状态栏都有,估计作用也差不多为了学习WinDbg,让整个过程尽量可控,我们自己编写被调试程序:生成release版本的exe文件,为模拟一般情况下的调试我们将exe文件拷贝到一个单独的路径上。通过WinDbg的File->Open Executable菜单打开生成的exe文件,出现command窗口,co

2016-12-23 13:14:12 377

转载 深入解析结构化异常处理(SEH) - by Matt Pietrek(*****)

转自http://blog.csdn.net/chenlycly/article/details/52575260结构化的异常处理还有比这篇文章更详细的吗?感觉写的比老雷清楚。尽管以前写过一篇SEH相关的文章《关于SEH的简单总结》, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗. 1997年文章,Windows技

2016-12-01 20:28:35 3204

原创 堆和堆检查

程序中在栈中保存的数据会随着函数的退出而被清理,只能用于保存局部变量。对于生存期大于局部变量的数据存储通常保存在堆中,堆拥有远比栈更多的可用空间。对于堆的分配和管理,内核使用堆管理器完成。

2016-11-29 16:02:22 1122

原创 算法导论 第二十一章 用于不相交集合的数据结构

21.1不相交集合的操作def:不相交集合数据结构维护了一个不相交动态集的集合S={S1, S2,...,Sk}。我们用一个代表来表示每个集合,他是这个集合的某个成员。设x表示一个动态集Sx的每个元素,我们希望支持以下三个操作:使用不相交集合的数据结构来确定无向图的连通分量过程如下:

2016-11-24 17:27:35 641

原创 栈和函数调用

def:栈是一种后入先出的数据结构,天然适合用来保存需要函数调用等需要保存的信息。在windows的用户进程中都包含用户栈和内核栈两个栈。每个线程都至少包含有一个栈,每个栈都对应内核中的一个_KTHREAD结构:在线程开始运行之前需要创建这个线程的栈,创建过程如下:栈作为一个存储数据的结构,在函数调用的过程中执行CALL和RET指令时分别以如下方式使用:

2016-11-24 10:35:46 839

原创 未处理异常和JIT调试

系统启动进程的主要过程描述如下:通常系统会在进程启动后把客户代码的入口函数(一般是运行时库的入口函数,运行时库再去调用main函数)的地址传给BaseProcessStart,从BaseProcessStart函数中进入到客户代码,而BaseProcessStart会注册一个处理客户代码的为处理异常的异常处理器(通常是ExitThread)。类似的BaseThreatStart处理线程

2016-11-04 16:55:37 8274 1

原创 中断和异常管理

def:中是内存中的一张线性表CPU通过中断描述符表(IDT)来处理中断和异常,IDT是内存中的一张线性表,CPU的IDTR指向IDT表,IDT表项为门描述符,通过门描述符中的段寄存子和偏移量找到处理中断的函数例程,门描述符主要有三种:内存布局如下:而windows统一处理软件中断和硬件中断,定义了描述异常的结构EXCEPETION_RECORD:

2016-11-03 20:29:16 343

原创 用户态调试过程

在了解了用户态调试模型之后,根据模型来理解用户态调试过程。

2016-11-01 13:39:10 928

原创 用户态调试模型

在用户态调试过程中调试器和被调试进程是两个独立的进程,而调试器需要通过控制被调试进程来进行调试,这与独立的两个进程之间的数据不可互相访问相矛盾。考虑进程的逻辑内存共4G大小,而高2G为系统空间,在实际中所有进程共用同一个系统空间。所以为了然调试器进程控制被调试进程需要有系统内核的支持,我们将这部分成为调试子系统。调试子系统主要由3个部分组成:位于NTDLL中的支持函数,位于内核文件中的支持函数

2016-08-04 22:22:37 562

原创 Windows概要

def:我们将处于运行状态的程序称为进程,由操作系统所调度的任务,是可执行文件的一个映射。进程与程序的关系可以类比于类和实例,一个程序可以产生多个进程。def:被cpu所调度的任务,进程中的指令。一个进程可以有多个线程,若将进程视为资源的集合,线程则为计算资源。进程可以视为一个资源的集合,由操作系统调度。操作系统给每个进程分配大小为4G的虚拟内存,高2G为系统内核运行的空间,而低2G为用户

2016-07-26 22:57:24 310

原创 分支记录和性能监视

def:分支记录就是记录指令的跳转,包括从哪里来到哪里去。记录LBR(last brach recording)用于记录最近的一条跳转指令。CPU中有提供LBRFromIp,LBRToIp来记录跳转,LastExceptionFromIp和LastExceptionToIp记录异常的跳转,在通过debguctl寄存器来控制CPU的调试功能,说明如下:LRB记录需要多条才可以

2016-07-13 23:14:43 413

VSCode C++工程开发模板

VSCode C++工程开发模板,包含VSCode使用CMake的配置并使用GMock作为单元测试工具。

2019-07-10

算法导论第二十五章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来。

2017-04-26

算法导论第二十四章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来。

2017-04-05

算法导论第二十三章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2017-01-22

算法导论第二十二章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2017-01-09

算法导论第二十一章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-11-30

算法导论第二十章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-07-07

算法导论第十九章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-05-30

算法导论第十八章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-05-06

算法导论第十七章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-04-19

算法导论第十六章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-04-07

算法导论第十五章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-03-18

算法导论第十四章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2016-01-14

算法导论第十三章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-12-28

算法导论第十二章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-12-01

算法导论第十一章习题解答

本章问题较多的设计到数论与概率工具,由于对数学工具掌握的不够熟悉,有些习题尚未完成

2015-09-25

算法导论第十章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-09-18

算法导论第九章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-09-11

算法导论第八章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-09-04

算法导论第七章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-08-29

算法导论第六章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-08-19

算法导论第五章习题解答

能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-08-13

算法导论第四章习题解答

算法导论第四章习题解答,能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来

2015-08-06

算法导论第三章习题解答

算法导论第三章习题解答,无法在文件中写公式,只写证明思路

2015-07-31

算法导论第二章习题解答

算法导论第二章解答,python代码实现,注释解答。

2015-07-28

AsyncSocketEx简化版代码

AsyncSocketEx封装思路,去掉所有功能。只保留消息驱动和封转代码。

2013-03-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除