(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用windows运用层API函数 很多C标准函数失去意义,如printf,fopen,fwrite等,它们有专门的内核函数 很多单纯的C标准,如string.h(不涉及I/O及网络等)等还是适用 可以使用标准C语言,但是用浮点数之前要特殊处理 WDK提供大量System Routine以供调用,相当于运用层…
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttributes来初始化一个OBJECT_ATTRIBUTES结构体: VOID InitializeObjectAttributes( [out] POBJECT_ATTRIBUTES InitializedAttributes, //OBJECT_ATTRIBUTES的指针 [in] PUNICODE_ST…
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函数)指针的个数为:IRP_MJ_MAXINUM_FUNCTION,保存在一个数组中,编写驱动程序,实质上就是自己编写处理I/O请求IRP包的派遣函数,可以使用for循环将所有的派遣函数注册到同一个派遣函数.分发函数类似MFC消息机制中的回调函数,它的名字也是程序员自定义的,但是参数确定.卸载函数通过…
---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用,如果要使用,必须进行重载. b)标准C接口的声明,在包含头文件以及入口例程的前面要声明extern "C" c)类的静态成员函数的使用:在类内部声明一个静态函数作为分发函数Dispatch,这个静态函数当做普通的C函数调用,而C++声明的非静态函数调用该函数进行分配. 这一部分读下来,其…
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建还是不够理想,这里稍微做下笔记. 2)概念:普通运用程序开发在R3,而内核开发在R0,R0是最高特权等级.内核空间不同于普通的程序代码空间,独享4GB寻址过程,内核空间被所有的运用程序共享,一旦内存程序崩溃,系统将崩溃,导致蓝屏或者重启. 3) 开发与调试方案:基于上述的概念,调试内核程序是一个很要…
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThread:关闭线程句柄API函数:ZwClose.以下代码忽略同步问题 线程函数: void MyThreadProc(PVOID context) { PUNICODE_STRING str = (PUNICODE_STRING)context; //打印字符串 KdPrint(("PrintInMyT…
1)使用如下自定义函数获取自系统启动后经历的毫秒数:KeQueryTimeIncrement.KeQueryTickCount void MyGetTickCount(PULONG msec) { LARGE_INTEGER tick_count; ULONG myinc = KeQueryTimeIncrement(); //返回每次时钟中断,系统时间增加的纳秒数 KeQueryTickCount(&tick_count); //返回自系统启动以来经历的定时器中断次数 tick_count.Q…
1)驱动中的字符串使用如下结构: typedef struct _UNICODE_STRING{ USHORT Length; //字符串的长度(字节数) USHORT MaximumLength; //字符串缓冲区长度(字节数) PWSTR Buffer; //字符串缓冲区 }UNICODE_STRING,*PUNICODE_STRING; 这个为UNICODE字符串,一个字符占用双字节.对应的有Ansi字符串: typedef struct _STRING{ USHORT Length; /…
1) Debug版本算法反汇编,现有如下3×3矩阵相乘的程序: #define SIZE 3 int MyFunction(int a[SIZE][SIZE],int b[SIZE][SIZE],int c[SIZE][SIZE]) { int i,j; ; i < ; i++ ) { ; j < ; j++ ) { c[i][j] = a[i][]*b[][j] + a[i][]*b[][j] + a[i][]*b[][j]; } } ; } Debug版本汇编后为: #define SIZ…
1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下for循环语句: int MyFunction(int a,int b) { int c = a + b; int i; ; i < ; i ++ ) { c = c + i; } return c; } Debug版汇编后代码为: int MyFunction(int a, int b) { //省略…