Windows 内核技术与驱动开发笔记
1.简述Driver Entry例程
动程序的某些全局初始化操作只能在第一次被装入时执行一次,而Driver Entry例程就是这个目的。
* Driver Entry是内核模式驱动程序主入口点常用的名字。
* Driver Entry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。
WDM驱动程序的Driver Entry例程应完成对这个对象的初始化并返回。
非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。
* Driver Entry的第二个参数是设备服务键的键名。
这个串不是长期存在的(函数返回后可能消失)。
如果以后想使用该串就必须先把它复制到安全的地方。
* 对于WDM驱动程序的Driver Entry例程,其主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种例程的位置。
2.简述使用VC进行内核程序编译的步骤
编译方式是使用VC++进行编译
1.用VC新建工程。
2.将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。
3.增加新的编译版本。
4.修改工程属性,选择“project | setting”将IterMediate file和Output file 都改为MyDriver_Check。
5.选择C/C++选项卡,将原有的Project Options内容全部删除替换成相关参数。
6.选择Link选项卡,将原有的Project Options内容删除替换成相关Link。
7.修改VC的lib目录和include的目录。
8.在VC中选择tools | options,在弹出的对话框中选择“Directories”选项卡,在“Show directories for”下拉菜单中选择“Include file”菜单。
添加DDK的相关路径。
3.简述单机内核调试技术
答:1.下载和安装WinDbg能够调试windows内核模块的调试工具不多,其中一个选择是微软提供的WinDbg
下载WinDbg后直接双击安装包执行安装。
2.安装好虚拟机以后必须把这个虚拟机上的windows设置为调试执行。
在被调试系统2000、2003或是xp的情况下打开虚拟机中的windows系统盘。
3.将boot.ini文件最后一行复制一下,并加上新的参数使之以调试的方法启动。
重启系统,在启动时就可以看到菜单,可以进入正常windows xp,也可以进入Debug模式的windows xp。
4.设置VMware管道虚拟串口。
调试机与被调试机用串口相连,但是有被调试机是虚拟机的情况下,就不可能用真正的串口连接了,但是可以在虚拟机上生成一个用管道虚拟机的串口,从而可以继续内核调试。
4.请画出Windows架构简图
Windows 结构简图
5.对象管理程序的作用
Windows操作系统中提供的所有服务几乎是以对象的形式存在。
对象管理器程序就是创建、管理、回收、这些对象的组建涉及很多对象,如驱动程序对象、设备对象等。
6.写出打开注册表的内核函数原型
NTSTATUS
ZwOpenksy(
OUT PHANDLE key Handle
IN ACCESS_MASK
Desired Access
IN POBJECT_ATT
IN ACCESS_MASK
Desired Access
IN POBJECT_ATTRIBUTES
ObjectAttributes
);
7.画出I/O请求包数据结构图
8.简述I/0堆栈
任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序。
另外还有一个堆栈单元供IRP的创建者使用。
堆栈单元中包含该IRP的类型代码和参考信息以及完成函数的地址。
9.写出常见的四种创建IRP的内核函数
* 可以使用下面任何一种函数创建IRP:
* Io Bulid Asgnechronous Fsd Request创建异步IPR(不需要等待其完成)。
该函数和下一个函数仅适用于创建某些类型的IRP
* Io Build Synchronous Fsd Request创建同步IRP(需要等待其完成)
* Io Build Devicelo Control Request 创建一个同步IRP_MJ_DEVICE_CONTROL或IRP_MJ_INTERNAL_DEVICE CONTROL 请求
* Io Allocatelrp创建上面桑函数不支持的其他种类的IRP
10.简述分层驱动技术
分层驱动是指两个或两个以上的驱动程序,他们分别建立设备对步。
并且形成一个由高到低的设备对象栈。
IRP异步会被传送到设备栈的最顶层的设备对象,顶层的设备可以选择直接结束IRP请求。
也可以选择将IRP请求向下层的设备对象转发。
如果是向下层的对象设备转发IRP请求。
当IRP请求结束时,IRP顺着设备栈的反方向原路返回。
当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续将IRP向上返回或者重新将IRP再次传递到底层设备驱动。