摘要: Fly的博客地址: 网易Fly的博客 阅读全文
posted @ 2011-07-25 16:50 飞翔荷兰人 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 在驱动编程学习中,往往需要通过DbgPrint或者KdPrint来输出调试信息,对于Check版本,KdPrint只是DbgPrint的一个宏定义,而对于Free版本,KdPrint将被优化掉。这些输出信息可以通过DebugView对内核的监控来看到。KdPrint is identical to the DbgPrint routine in code that is compiled in a checked build environment. This routine has no effect if compiled in a free build environment. Only 阅读全文
posted @ 2011-07-25 16:02 飞翔荷兰人 阅读(1245) 评论(0) 推荐(0) 编辑
摘要: 什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(对于字符来说ANSI以单字节存放英文字符,以双字节存放中文等字符,而Unicode下,英文和中文的字符都以双字节存放)Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。目前,在网络、Windows系统和很多大型软件中得到应用。8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。 在软件开发中,特别是. 阅读全文
posted @ 2011-07-25 15:28 飞翔荷兰人 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 1. 为什么要用异常代替错误码?错误码的缺点:1) 默认是可以忽略的,因为调用函数时可以不处理其返回值,从而错误处理要依赖于程序员的主动性,而不是程序机制的要求;2) 不能跨作用域传送,必须逐层向上转发,即使中间没有对错误码进行重新定义;使用异常可以解决解决这两个问题:1) 异常默认是不可忽略的,抛出的异常必须捕获,否则就会报错;2) 异常可以跨作用域传送,从而错误的发现和处理被很好地分离开来;2. 异常和断言的区别:异常被捕获后可以不作处理,程序从捕获位置继续执行。而断言是完全无法忽略的,程序在断言失败处立即终止。因此断言通常用于调试版本,用来发现程序中的逻辑错误。虽然异常也能起到这样的作用 阅读全文
posted @ 2011-07-25 14:52 飞翔荷兰人 阅读(669) 评论(1) 推荐(0) 编辑
摘要: 1.检查内存可用性在驱动程序开发中,对内存的操作要格外小心。如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃。DDK提供了两个函数,帮助程序员在不知道某段内存是否可读写的情况下,试探这段内存的可读写性。VOIDProbeForRead(INCONSTVOID*Address,INSIZE_TLength,INULONGAlignment);VOIDProbeForWrite(INCONSTVOID*Address,INSIZE_TLength,INULONGAlignment);这两个函数不是返回该段内存是否可读写,而是当不可读写的时候,引发一个异常。2.结构化异常处理(1) t 阅读全文
posted @ 2011-07-25 14:51 飞翔荷兰人 阅读(645) 评论(0) 推荐(0) 编辑
摘要: 1.Lookaside结构频繁的申请和回收内存,会导致在内存上产生大量的内存“空洞”,从而导致最终无法申请内存。DDK为程序员提供了Lookaside结构来解决这个问题。我们可以将Lookaside对象看成是一个内存容器。在初始化的时候,它先向Windows申请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向Windows申请内存,而是想Lookaside对象申请内存。Looaside会智能的避免产生内存“空洞”。如果Lookaside对象内部内存不够用时,它会向操作系统申请更多的内存。Lookaside一般会在以下情况下使用:1. 程序员每次申请固定大小的内存。2. 申请和回收的 阅读全文
posted @ 2011-07-25 14:50 飞翔荷兰人 阅读(4231) 评论(0) 推荐(0) 编辑
摘要: 1. 分配内核内存Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约。和应用程序一样,局部变量是存放在栈空间中的。但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或者局部变量是大型数据结构。如果需要大型数据结构,我们可以在堆中申请。堆中申请的函数有以下几个:(1)PVOID ExAllocatePool( INPOOL_TYPEPoolType, INSIZE_TNumberOfBytes ); (2)PVOID ExAllocatePoolWithTag( INPOOL_TYPEPoolType, INSIZE_TNumberOfBytes, INULONGTag ) 阅读全文
posted @ 2011-07-25 14:48 飞翔荷兰人 阅读(857) 评论(0) 推荐(0) 编辑

I Love Lina~