Windows内核(一)
.sys放在Drivers目录下。运行在R0层。
在WDK的相应环境中,进行相应代码目录,build.
一个内核程序被看作一个PE格式的DLL,它是被Windows整个内核调用的一个DLL,一旦加裁,就成为内核的组成部分。所有的内核内存空间是共享的。内核程序崩溃,Windows系统也就崩溃了。
DriverEntry是一个内核程序的入口,以system进程名出现。
编写内核的规则:
不能调用Windows应用层API函数,而应用内核API。
关于字符串,内存处理,打印等,参见前面Rtl函数
浮点数要特殊处理
在Windows中,不同类型设备的驱动有不同的安装方式,ini文件。非“任何类型”的驱动程序,当作服务安装。(搜“服务安装驱动下载”,net start 服务名)
调试
Windbg (
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
)
我们用虚拟机进行调试VMWare.
环境搭建:
1、
虚拟机中boot.ini
.......
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect /debug /debugport=com1 /baudrate=9600
2、
设置虚拟机
Hardward > Serial Port > Output to named pipe,添入:
\\.\pipe\com_1,this end is the server,the other end is an application.
3、
Windbg设置
Windbg(本机中)的启动参数:
Windbg.exe -b -k com:port=\\.\pipe\com_1,baud=9600,pipe
(整成快捷方式)
说明1:在虚拟中在调试模式下启动windows后,马上以以上参数启动Windbg
说明2:我以指定波特率启动WINDBG时老是提示我参数出错,把指定波特项取消后可以成功。
4、
设置代码路径和符号表位置,就可以调试了。Symbol File Path中,sys的位置。多个路径以分号隔开。
用以下设置来下载符号表。
srv*c:\symbols*
http://msdl.microsoft.com/download/symbols
(关于说明,可见:
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
)
其它更进一步的关于汇编代码的分析,见[6]
其它调试如同VS中。
C++写内核
需要自己写new操作符
用ecx传递this指针对象的开头部分就是虚函数表地址
父类和子类各有一份虚函数表,没有共公部分。在子类的虚函数表中,没有重载的基类虚函数的地址和基类虚函数一样,而重载后有自己独特的地址。
参考
[1]
http://www.cnblogs.com/phinecos/archive/2009/02/19/1393803.html
[2]
http://www.cnblogs.com/qsilence/archive/2009/06/11/1501511.html
[3
http://msdn.microsoft.com/en-us/library/ff557565%28VS.85%29.aspx
[4]
http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489041.html
[5] Windows驱动编程基础教程.doc
[6] 天书夜读-从汇编语言到windows内核编程(
http://download.****.net/source/2754275
)
[7] Windows DDK
推荐其它书籍
Programming the micfosoft windows Driver Model:驱动开发
windows环境下的32位汇编语言程序设计:汇编学习
软件调试,张银奎:软件调试
相关文章
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础
- 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建
- 嵌入式学习37-TCP并发模型-有限 2.IO模型: 1.阻塞IO: 没有数据到来时,可以让任务挂起 节省CPU资源开销,提高系统效率 2.非阻塞IO: 程序未接收到数据时一直执行 效率很低 3.异步IO 只能绑定一个文件描述符用来 读取数据 4.多路复用IO select 1.select监听的集合中的文件描述符有 上限限制 2.select有 内核层 向 用户层数据空间 拷贝 的过程,占用系统资源开销 3.select必须 轮询检测 产生 事件 的文件描述符 4.select 只能工作 在 水平触发 模式(低速模式) 无法工作 在 边沿触发 模式(高速模式) poll (监听的集合中的文件描述符有 没有上限限制) 1.poll有 内核层 向 用户层 数据空间 拷贝 的过程,占用系统资源开销 2.poll必须 轮询检测 产生 事件 的文件描述符 3.poll 只能工作在水平触发模式(低速模式) 与select相同 无法工作在边沿触发(高速模式) 3.函数接口: 1.select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能: select 监听 文件描述符集合 中 是否 有文件描述编程 ready状态 select 监听 文件描述符集合 中 ,若有状态 , 将没有ready状态的T除 若无状态,将阻塞继续等待 参数: nfds: 最大文件描述符的值 +1 readfds: 读 文件描述符集合 writefds: 写 文件描述符集合 exceptfds: 其余 文件描述符集合 timeout: 等待的时长 NULL 一直等待(超时处理) 返回值: 成功 返回 文件描述符集合中 的 文件描述符个数 失败 返回 -1 void FD_CLR (int fd, fd_set *set); 功能: 将文件描述符 fd 从集合中清除
- 天书夜读:从汇编语言到Windows内核编程
- 《HTML5+CSS3+JavaScript从入门到精通》读书笔记 - 阿泰555
- 《天书夜读:从汇编语言到windows内核编程》三 练习反汇编C语言程序
- 混合编程:VS2017 C++调用Python3.X类/对象/函数笔记【Windows】
- 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建
- 《天书夜读:从汇编语言到windows内核编程》十二 继续探索windows内核(逆向windows内核)
- 《从汇编语言到Windows内核编程》学习笔记 (第一章 汇编指令与C语言)