![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
windows驱动设计
文章平均质量分 64
Iqian1314
全国手机充值平台:http://iqian99.taobao.com/
展开
-
[Windows驱动]INF文件
INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。 安装监视器、调制解调器和打印机等设备所需的驱动程序,都是通过INF文件,正是INF的功劳才使得Windows可以找到这些硬件设备的驱动并正确安装。当我们通过“开始→控制面板→添加删除程序→Windo转载 2010-06-30 10:49:00 · 2285 阅读 · 0 评论 -
驱动程序层次结构、PIRP结构、IO_STACK_LOCATION结构
<br />一、驱动程序层次结构<br /> <br />在《Windows驱动开发详解》的第四章简单介绍了一下驱动程序的层次结构,但介绍得不清不楚,反复看了几遍,仍然是一分清楚,九分糊涂。为此,花了几个小时来查阅相关资料,最后分别参考《Windows驱动开发详解》和《Windows操作系统原理第2版》,才算有了个初步的认识。<br /> <br />要想详细解释驱动程序的层次结构,以我现在的水平可能还没那个能力,但或许能通过文字的形式让自己多一分认识。<br /> <br />1.再看DriverEntr原创 2010-06-03 15:02:00 · 4691 阅读 · 0 评论 -
Windows DDK中经典的宏——CONTAINING_RECORD
<br />在windows ddk中提供了一个经典的宏,其定义如下:<br />#define CONTAININT_RECORD(address, type, field) /<br /> ((type*)((PCHAR)(address) - (PCHAR)(&((type*)0)->field)))<br />这个宏用于取得内存中任何结构体的首地址,要提供的参数是:结构体中某个成员(field)的地址address、结构体的类型type、提供地址那个成员的名字field。原创 2010-06-01 10:31:00 · 807 阅读 · 0 评论 -
DRIVER_OBJECT & DEVICE_OBJECT
驱动对象结构 DRIVER_OBJECT ,定义如下:(左侧为相对于结构体起始地址的偏移量) struct _DRIVER_OBJECT (sizeof=168) +00 int16 Type +02 int16 Size +04 struct _DEVICE_OBJECT *DeviceObject +08 uint32 Flags +0c void *DriverStart +10 uint32 DriverSize +14 void *DriverSection(即为PsLoadedM转载 2010-06-03 15:41:00 · 2439 阅读 · 0 评论 -
DriverEntry程序
DriverEntry程序<br />在以前的部分中,我讲了即插即用管理器装载硬件所需要的驱动并调用其AddDevice函数。一个特定的驱动程序可能会被一个以上的相似硬件所使用,并且存在一些只需要在其第一次加载时被执行一次的全局初始化操作。DriverEntry程序负责这些全局初始化操。<br />extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,<br /> IN PUNICODE_STRING RegistryPath)<b转载 2010-06-03 17:25:00 · 4950 阅读 · 0 评论 -
IoSkipCurrentIrpStackLocation宏
IoSkipCurrentIrpStackLocation宏当驱动被分层以后,他们被注册到一个chain中,IRP会在这个chain中传递,从最上面,到最下面,再回到最上面 <br />为适应这种体制,IRP的结构的大小是不固定的,大体结构如下: <br />-------------------- <br />| IRP header | <br />-------------------- <br />|IO_STACK_LOCATION |<-----lowest driver stack locat原创 2010-06-12 12:01:00 · 721 阅读 · 0 评论 -
Windbg内核调试之一: Vista Boot Config设置
<br />Windbg进行内核调试,需要一些基本的技巧和设置,在这个系列文章中,我将使用Windbg过程中所遇到的一些问题和经验记录下来,算是对Kernel调试的一个总结,同时也是学习Windows系统内核的另一种过程。<br /><br />很多人说Windbg不如SoftIce好用, 但是我使用过程中还是觉得Windbg能更好的反映系统状态, 而且相比SoftIce, Windbg更稳定(虽然它的部分操作略显复杂), 下面介绍Windbg的Kernel模式调试第一部分: 双机连接设置.<br /><b转载 2010-06-23 17:28:00 · 736 阅读 · 0 评论 -
Windbg内核调试之四: Dump文件分析
<br />Dump 文件分析很大程度上就是分析蓝屏产生的原因。这种系统级的错误算是Windows提示错误中比较严重的一种(更严重的还有启动黑屏等硬件或软件兼容性错误等等)。说它是比较严重,是因为毕竟Windows还提供了dump文件给用户分析,至少能比较容易的找到错误的原因。一般蓝屏要么是内核程序中的异常或违规,要么是数据结构的损坏,也有boot或shutdown的时候内核出错。有时候蓝屏是一闪而过,紧接着是系统重启;有时候是蓝屏等待。总之蓝屏的时候都提示了一些停止代码和错误信息,不过这些提示是不全面的,转载 2010-06-23 17:32:00 · 2304 阅读 · 0 评论 -
Windbg内核调试之一: Vista Boot Config设置
<br />Windbg进行内核调试,需要一些基本的技巧和设置,在这个系列文章中,我将使用Windbg过程中所遇到的一些问题和经验记录下来,算是对Kernel调试的一个总结,同时也是学习Windows系统内核的另一种过程。<br /><br />很多人说Windbg不如SoftIce好用, 但是我使用过程中还是觉得Windbg能更好的反映系统状态, 而且相比SoftIce, Windbg更稳定(虽然它的部分操作略显复杂), 下面介绍Windbg的Kernel模式调试第一部分: 双机连接设置.<br /><b转载 2010-06-23 17:26:00 · 829 阅读 · 0 评论 -
Windbg内核调试之二: 常用命令
<br />运用Windbg进行内核调试, 熟练的运用命令行是必不可少的技能. 但是面对众多繁琐的命令, 实在是不可能全部的了解和掌握. 而了解Kernel正是需要这些命令的指引, 不断深入理解其基本的内容. 下面, 将介绍最常用的一些指令, 使初学Kernel调试的朋友们能有一个大致的了解. 至于如何熟练的运用它们, 还需要实际的操作过程中进行反复的琢磨.<br /><br />Windbg能够方便的进行远程调试和本地进程调试(只限于User模式), 远程调试又分User mode和Kernel mode原创 2010-06-23 17:29:00 · 781 阅读 · 0 评论 -
驱动开发网上关于重启的网摘(3)
<br />q:为什么在驱动中一运行READ_REGISTER_ULONG操作机器就重启<br />想对一块虚拟内存进行读取,写了一个小驱动,但是一调用WRITE_REGISTER_ULONG读取指定的内核内存空间,机器就重启,急死了,在这个地方耽搁了一个星期了,有人能帮帮我吗?<br />代码如下:<br />NTSTATUS PortTalkCreateDispatch(<br /> IN PDEVICE_OBJECT DeviceObject,<br /> IN PIRP Irp<br /> )转载 2010-05-31 16:31:00 · 973 阅读 · 0 评论 -
完成I/O请求
完成I/O请求每个IRP都渴望被完成。在标准模型中,你至少有两种完成IRP的环境。DpcForIsr通常用于完成导致最近中断的IRP。派遣函数也可以在下面这两种情况下完成IRP: 如果请求是错误的(可以以容易的检测方式查明,例如要求打印机倒纸请求或卸载键盘请求),则派遣例程应以失败方式完成该请求并返回适当的出错代码。 如果请求要求得到的仅是派遣函数可以容易确定的信息(例如原创 2010-05-26 11:01:00 · 3198 阅读 · 1 评论 -
自旋锁
自旋锁IRQL概念仅能解决单CPU上的同步问题,在多处理器平台上,它不能保证你的代码不被运行在其它处理器上的代码所干扰。一个称为自旋锁(spin lock)的原始对象可以解决这个问题。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(test-and-set)某个内存变量,由于它是原子操作,所以在该操作完成之前其它CPU不可能访问这个内存变量。如果测试结果表原创 2010-05-28 11:18:00 · 1348 阅读 · 0 评论 -
使用WinDbg和虚拟机调试Windows驱动程序
使用WinDbg和虚拟机调试Windows驱动程序2008年10月08日 星期三 09:40本文来自:http://blog.163.com/zhg_tao<br />http://www.cnblogs.com/suiyingjie/<br />http://blog.163.com/zhg_tao/blog/static/84116744200862424215/<br />http://www.cnblogs.com/suiyingjie/archive/2008/01/25/1053391.html转载 2010-06-30 14:52:00 · 1208 阅读 · 0 评论 -
公司6600板卡驱动环境搭建和调试
公司6600板卡驱动环境搭建和调试:由于重新装了系统,导致板卡驱动的编译调试环境没了,只有重新搭建环境。先装了XP系统,让人郁闷得是居然这个盘的XP系统无法识别鼠标,这还是第一次碰到,郁闷之极,没办法,重新找了一张光盘再装一次吧,这次还好,再装PC驱动。然后VC6.0+DDK,再在VC6.0中编译驱动程序,结果提示链接错误:LINK : fatal error LNK1146: no argument specified with option /"/libpath:/上网查原因,按照网上的方法,基本上都行原创 2010-07-05 11:45:00 · 1561 阅读 · 1 评论 -
VMWare+Windbg双机调试终于成功!
<br />经历了几天的苦战,终于将VMWare+Windbg双机调试环境搭建起来并且开始运作,期间遇到了很多的问题,记录一些作为备案,以便以后遇到类似的问题可以参考,避免浪费不必要的时间。<br /> <br />主要的在前一篇中已说明<br /> <br />1、关于KdPrint的用法问题:如果在DbgView中没有KdPrint的输出信息,解决方法:在DbgView的DBGVIEW,勾上Capture Kernel,然后再安装驱动,应该能看到DriverEntry和AddDivice里的调试信息。<原创 2010-07-08 15:00:00 · 3369 阅读 · 1 评论 -
用VC6.0编译驱动程序的工程设置方法
用VC6.0编译驱动程序的工程设置方法 VC6.0编译驱动程序的工程设置一、编译NT式驱动1> 建立一个win32应用程序工程。2> 修改工程属性。Project --Setting-C/C++中的Project Options内容替换成/nologo /Gz /MLd /W3 /WX /Z7 /Od /D WIN32=100 /D _X86_=1 /D WI原创 2010-05-14 11:29:00 · 1457 阅读 · 1 评论 -
基于Windriver的驱动开发——驱动基础
基于Windriver的驱动开发——驱动基础 在一般的操作系统(linux,Windows),不能够从用户空间直接访问硬件,只能从系统内核访问硬件。系统内核中访问硬件的部分叫设备驱动。 设备驱动提供操作系统和硬件设备的接口,负责设备命令和程序命令的转换,设备数据的IO,以及设备错误处理。 设备驱动分类 设备驱动按功能性主要分为: Monolithic驱动转载 2010-05-14 14:00:00 · 1697 阅读 · 0 评论 -
VC++中使用Disassembly查看代码
VC++中使用Disassembly查看代码<br /> 最近在恶补C/C++的基础知识。一直以来,遇到一些与编译器相关的小程序时,我往往都迷惑不解,每每思索都不得要领。最近一个同学告诉我用反汇编来查看编译的代码,什么都会变得清楚明朗。<br /> <br />从一个例子引起的问题:<br /> <br /><br /> <br />int k = 1;<br />printf("%d/n",(++k)+(++k));<br /> 这个例子是我一个朋友发给我的,他告诉我他一直都想不通为什么在V转载 2010-07-15 11:11:00 · 5132 阅读 · 1 评论 -
驱动无法安装成功的解决办法
<br />经过几天的努力,终于解决了驱动安装不成功的问题,原因是出在操作系统上面,只有有些GHOST操作系统不能安装此驱动程序,问题就出在GHOST系统之间以及GHOST系统和正常安装系统之间存在什么区别,分析了几百个回合,最后终于发现问题的根本所在:GHOST为了实现快速安装操作系统,中间省掉了很多系统文件,经过分析,解决办法出炉:在注册表中加入以下项即可:<br /> <br /> <br />[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Current原创 2010-07-14 16:43:00 · 5261 阅读 · 0 评论 -
驱动程序内存分配
何谓可分页和非分页内存 默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中。而且,加载器是一次加载整个驱动的可执行文件,包括相关的DLL。加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件。但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存(Page out)。可以使用下面的指令来实现:#define AL转载 2010-05-25 09:46:00 · 699 阅读 · 0 评论 -
Windbg内核调试之三: 调试驱动
<br />这次我们通过一个实际调试驱动的例子,来逐步体会Windbg在内核调试中的作用.<br />由于条件所限,大多数情况下,很多人都是用VMware+Windbg调试内核(VMware的确是个好东西).但这样的调试需要占用大量的系统资源,对于和我一样急性子的朋友来说这是不可接受的:).利用双机调试就可以让你一边喝咖啡一边轻松的看结果,而不至于郁闷的等待每次长达数分钟的系统响应.有关双机调试的基本设置,请参考:http://www.cnblogs.com/Sonic2007/archive/2008/0转载 2010-06-23 17:31:00 · 1337 阅读 · 0 评论