上一页 1 ··· 5 6 7 8 9 10 11 12 13 14 下一页
摘要: 一、调试基础调试快捷键F5: 开始调试Shift+F5: 停止调试F10: 调试到下一句,这里是单步跟踪F11: 调试到下一句,跟进函数内部Shift+F11:从当前函数中跳出Ctrl+F10:调试到光标所在位置F9: 设置(取消)断点Alt+F9:高级断点设置跟踪调试1、尽量使用快捷键时行调试2、观察调试信息3、高级中断设置异常调试重试->取消->调试函数堆栈,用variables或者call stack 窗口Release调试1、经常测试你的Debug和Release版本2、不要移除调试代码,如用ASSERT, TRACE等。3、初始化变量,特别是全局变量,malloc的内存, 阅读全文
posted @ 2013-09-03 09:02 问笑 阅读(423) 评论(0) 推荐(0)
摘要: C++ 的一个 比较晦涩难懂的特点是你可以重载 new 操作符,并且你甚至可以给它附加参数。通常,操作符 new 只接受拟分配对象的大小: void* operator new(size_t nAlloc) { return malloc(nAlloc); } 但你也可以随心所欲附加参数来重载 new 操作符,只要在调用 new 时候提供这些参数即可。在各种应用程序向导(App Wizards)中,这 是 MFC 所做的事情。一个典型的 MFC 程序(.cpp)文件顶部都有下面这样的代码行,通常都由应用程序向导生成: #ifdef _DEBUG #define new DEBUG_NEW .. 阅读全文
posted @ 2013-09-03 00:02 问笑 阅读(439) 评论(0) 推荐(0)
摘要: Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令。然而,有时我们需要定义自己的消息来通知程序什么事情发生了,这就是用户自定义消息。 ClassWizard 并没有提供增加用户自定义消息的功能,所以要使用用户自定义消息,必须手工编写代码。然后 ClassWizard 才可以象处理其它消息一样处理你自定义的消息。具体做法如下详解: 第一步:定义消息。一个消息实际上是开发 Windows95 应用程序时, Microsoft 推荐用户自定义消息至少是 WM_USER+100 ,因为很多新控件也要使用 WM.. 阅读全文
posted @ 2013-09-02 23:27 问笑 阅读(822) 评论(0) 推荐(0)
摘要: 1 先是mdl的数据结构。2 下面根据用法逐步的讲解mdl数据结构的含义:一般用法,先是 IoAllocateMdl :原型为:最常用的是VirtualAddress和Length。把自己的NonPageable buffer的起始地址传给IoAllocateMdl ,长度也传给他。可是这个函数具体做了啥呢(下面只是些基本的影响理解的部分,具体更多的东西,更细节的东西,自己去看WRK的代码)?根据length和VirtualAddress算出这块buffer总共跨越了几个virtual page。分配MDL的内存----包括上面介绍的struct _MDL(属于head部分),ULONG型bo 阅读全文
posted @ 2013-09-02 08:05 问笑 阅读(659) 评论(0) 推荐(0)
摘要: 微软的文档里对MDL的描述感觉语焉不详,这两天在找工作的间隙逆向+黑盒测试了一下MmBuildMdlForNonPagedPool,把得到的一些理解描述下来。一.MDL数据结构 MDL是用来建立一块虚拟地址空间与物理页面之间的映射,结构定义如下:typedefstruct_MDL{struct_MDL*Next;CSHORTSize;CSHORTMdlFlags;struct_EPROCESS*Process;PVOIDMappedSystemVa;PVOIDStartVa;ULONGByteCount;ULONGByteOffset;}MDL,*PMDL; 各field的解释: Next:M 阅读全文
posted @ 2013-09-02 07:18 问笑 阅读(1137) 评论(0) 推荐(0)
摘要: 以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西。以下的“未分页”指没有为页进行编码。以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体)typedef struct _MDL { struct _MDL *Next; //下一个MDL CSHORT Size; //大小 CSHORT MdlFlags; //标志,保护属性等 struct _EPROCESS *Process;// PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL;如何 阅读全文
posted @ 2013-09-02 07:10 问笑 阅读(1807) 评论(0) 推荐(0)
摘要: Windows驱动跑在核心态(Kernel mode),驱动的调用者跑在用户态。如何使用户态进程与核心态驱动共享内存呢 ?我们知道32位Windows中,默认状态下虚拟空间有4G,前2G是每个进程私有的,也就是说在进程切换的时候会变化,后2G是操作系统的,所以是固定的。既然用户态进程和核心态驱动在同一个进程空间里,是不是只要直接传个内存地址过来,就可以访问了?理论上可以但实际上不行,因为用户态的进程在不断地切换,使驱动运行时没法保证前面的用户态进程是哪个,也就不确定前2G虚拟地址空间的映射情况,那么用户态进程传来的地址也许不是合法的。比较常用的做法是通过MDL进行内存的重映射。简单地说就是将同 阅读全文
posted @ 2013-09-02 07:03 问笑 阅读(2295) 评论(0) 推荐(0)
摘要: 一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道 怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用户的代码里处理了,不用留给库去发现)。 Bjarne Stroustrup说:提供异常的基本目的就是为了处理上面的问题。基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异 阅读全文
posted @ 2013-09-01 20:50 问笑 阅读(555) 评论(0) 推荐(0)
摘要: 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:2 1 + 3 * 前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:* + 2 1 3 二.表达式的计算: 将中缀表达式转换为后缀表达式的算法思想: ·数字时,加入后缀表达式; ·运算符: a. 若为最低级的运算符,入栈; b. 若为 '(',入栈; c. 若为 ')',则把栈中的的运算符加入后缀表达式 阅读全文
posted @ 2013-08-31 10:45 问笑 阅读(423) 评论(0) 推荐(0)
摘要: 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。 内存映射文件 内存映射文件与虚拟内存有些类似,通过内存映射文件可以... 阅读全文
posted @ 2013-08-30 22:38 问笑 阅读(4684) 评论(0) 推荐(1)
上一页 1 ··· 5 6 7 8 9 10 11 12 13 14 下一页