摘要: Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令。然而,有时我们需要定义自己的消息来通知程序什么事情发生了,这就是用户自定义消息。 ClassWizard 并没有提供增加用户自定义消息的功能,所以要使用用户自定义消息,必须手工编写代码。然后 ClassWizard 才可以象处理其它消息一样处理你自定义的消息。具体做法如下详解: 第一步:定义消息。一个消息实际上是开发 Windows95 应用程序时, Microsoft 推荐用户自定义消息至少是 WM_USER+100 ,因为很多新控件也要使用 WM.. 阅读全文
posted @ 2013-09-02 23:27 问笑 阅读(824) 评论(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 问笑 阅读(676) 评论(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 问笑 阅读(1146) 评论(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 问笑 阅读(1825) 评论(0) 推荐(0)
摘要: Windows驱动跑在核心态(Kernel mode),驱动的调用者跑在用户态。如何使用户态进程与核心态驱动共享内存呢 ?我们知道32位Windows中,默认状态下虚拟空间有4G,前2G是每个进程私有的,也就是说在进程切换的时候会变化,后2G是操作系统的,所以是固定的。既然用户态进程和核心态驱动在同一个进程空间里,是不是只要直接传个内存地址过来,就可以访问了?理论上可以但实际上不行,因为用户态的进程在不断地切换,使驱动运行时没法保证前面的用户态进程是哪个,也就不确定前2G虚拟地址空间的映射情况,那么用户态进程传来的地址也许不是合法的。比较常用的做法是通过MDL进行内存的重映射。简单地说就是将同 阅读全文
posted @ 2013-09-02 07:03 问笑 阅读(2303) 评论(0) 推荐(0)