Windows驱动开发(5)——设备通信
今顺便再来搞搞这个 IRP_MJ_READ 和 IRP_MJ_WRITE 等事件。
应用层读写设备文件写文件同样在函数的 SWITCH 分发中添加 case,然后在 DriverEntry 中注册回调,我们先了解三个指针,这里后面有大用,这三个指针是传参的三种方式。
1234567case IRP_MJ_WRITE: { char *ptr1 = pirp->UserBuffer; char *ptr2 = pirp->MdlAddress; char *ptr3 = pirp->AssociatedIrp.SystemBuffer; kprintf(("Line %d:xia0ji233: ring3 calls ReadFile ptr1=%p ptr2=%p ptr3=%p\n"), __LINE__, ptr1, ptr2, ptr3); break;}
WriteFile 是 ring3 向 ring0 写入数据的一个过程,因此我们在 ring0 层要拷贝 UserBuffer 里面 ...
Windows驱动开发(4)——设备通信
今天来了解一下 R3 与 R0 通信。
应用程序与内核交互打开设备事件也是解决了昨天 3 环应用程序与内核通信的问题,我们应该用以下代码创建设备:
12345678910#include <iostream>#include <Windows.h>#define SYMBOL L"\\??\\xia0ji2333"int main(){ HANDLE DriverHandle = CreateFile(SYMBOL, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); printf("error=%x\n", GetLastError()); printf("handle=%x\n", DriverHandle); getchar();}
驱动加载成功之后,直接运行:
发 ...
Windows驱动开发(3)——创建设备
今天来了解一下IRP模块。
IRPIRP是输入输出请求包(I/O Request Package)的简称
常见的事件有以下几种:
IRP_MJ_CREATE:请求一个句柄 CreateFile
IRP_MJ_CLOSE:关闭句柄 CloseHandle
IRP_MJ_READ:从设备得到数据ReadFile
IRP_MJ_WRITE:传送数据到设备 WriteFile
IRP_MJ_DEVICE_CONTROL:控制操作利用IOCTL宏 DeviceIOControl
代码基本框架这里注册这个 IRP 事件跟注册卸载驱动函数差不多,代码如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<ntifs.h>#define kprintf(format, ...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, format, ##__VA_ARGS__)N ...
考研周报(10)
第10篇周报
本周小结英语每天都背了 100 个单词,check。
数据结构开了第二章,也仅此了,计网没动静。
数学开第八章,感觉很难啊,数学得有连续的可以学的时间才好学。
但是呢,烦心事都解决了,也挺好的,至少接下来的时间利用率可以更高了。
下周目标英语:每天背单词至少 100。
数学:看完第九章。
专业课:
计算机网络:开第二轮吧,但是物理层自顶向下是没有的,所以预计先看看物理层。
数据结构:不知道,大概给三个星期看完吧(目前:第一个星期)。
windows 内核基础:同样先等上面完成目标吧。
数据结构复习(1)
开始复习复习数据结构。
数据结构的基本概念术语
数据:是信息的载体,计算机程序加工的原料。
数据元素:是数据的基本单位,一个数据元素可由若干个数据项组成,数据项是最小不可分割的单位。
数据对象:具有相同性质的数据元素的集合。最简单的就是一个结构体的数组,就是一个数据对象。比如学生结构体,有名字,年龄等信息。
数据类型:基本有以下几种类型:
原子类型:用C语言来说的话,就是属于那种 int,char 这些的数据类型。
结构类型:那就是C语言的结构体呗。
抽象数据类型:抽象数据阻止及相关操作。因为 C 没有抽象的概念,所以硬要说应该就是定义了一系列规则的集合,或者说拿 C++ 的泛型来理解也可以吧。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合,数据结构包括三个方面的内容:逻辑结构,存储结构和数据运算。一个算法的设计取决于逻辑结构,一个算法的实现取决于存储结构。【也很简单,比如深搜。对于图这种抽象结构,大概算法的设计是取决于它是图这样的抽象逻辑结构(从一个点开始,找到与之相连的点,然后分别递归这些点)。但是具体实现就要看你是怎么存图,比如图可以用邻接矩阵或者是链式前向 ...
高等数学复习(7)
高等数学复习(7)——零点问题和微分不等式
零点问题零点问题经常转换为求根或者两个曲线的交点问题。
定理1:零点定理,在连续函数的一个区间内,如果端点值异号,那么至少有一个根。
定理2:单调性,一个单调区间内,至多有一个根(也可能没有,但是有只能有一个)。
定理3:罗尔原话——$f^{(n)}(x)=0$ 有 k 个根,那么 $f(x)$ 最多有 k+n 个根(最多指的是最理想的情况,一个根都没有也是可能的,这个定理只用不证明)。
奇次的多项式至少有一个实数根,很简单,因为仅看最高项,它趋于正无穷和负无穷的时候,肯定是异号的,所以至少有一个实数根。
证明常用思路证明不等关系,通常需要研究一个函数的导数,如果直接求导难以解决,思考以下思路:
可以尝试作变量代换,代换的时候需要注意,把自变量的范围跟着变化一下。
对导数研究正负性,如果导数还是不能直接看出来,再次求导又特别麻烦,如果有分式,那么建议直接把分子或者分母推到一个恒正或恒负,对分子或分母研究导数,看正负性。
对于常数证明,通常对常数变量化,如果有多个常数,那就把其中一个当成常数,另一个当成变量去研究,或者有办 ...
Windows驱动开发(2)——hello world
今天写一个驱动的hello world。
打印一下基本的信息吧就是,创建一个空项目,写一个驱动入口和一个卸载例程。
这里给一下用到的工具,其中 VirtualKD-Redux 是github上下载的,用于关闭windows驱动签名验证的,这里建议直接再虚拟机里搞就好了。
code代码:
123456789101112131415#include<ntifs.h>#define kprintf(format, ...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, format, ##__VA_ARGS__)void DriverUnload(PDRIVER_OBJECT pDriver) { kprintf(("Line %d:xia0ji233: unload success\n"),__LINE__);}NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING Registr ...
WindowsISO下载
因为踩了好多坑,特别写一篇文章讲讲怎么下载这个Windows镜像。
起因我主要是因为要安装Windows10的虚拟机,需要找镜像文件,官网一进去就是Access Denied,那我只能找非官方的一些网站了,但是非官方的网站下过来的ISO进虚拟机就是 Operate system not found,人都麻了,一个镜像下十几分钟结果就这?
下面来看操作步骤,下载官方的ISO,就算别的不能用,官方的不可能不能用的。
操作步骤第一步先访问微软的官网,来到下载页面:https://www.microsoft.com/zh-cn/software-download/windows10
如果显示 Access Denied 那么请自行挂代理,因为好像是墙了的,那么你大概看到下面的画面:
可以发现,要么是下载一个工具创建 U 盘启动器,要么就是直接给你电脑包了,更新了,根本不给 ISO 文件。
这里需要这么操作一下:
F12 打开浏览器开发者模式,更多工具这里找到网络状况(Network Conditions)
打开之后用户代理(User-Agent)这里的钩去掉,然后选择 Chrome ...
考研周报(9)
第9篇周报
本周小结英语每天都背了 100-300 个单词,这个算完成了。
计网把网络安全这一章看完了,后面拿王道开二轮复习吧,这个也算完了。
数学仅仅做完了第六章的所有习题,后续得开始了。
下周目标英语:每天背单词至少 100。
数学:看完第九章。
专业课:
计算机网络:等待二轮。
数据结构:不知道,大概给三个星期看完吧(目前:第一个星期)。
windows 内核基础:同样先等上面完成目标吧。
计算机网络——自顶向下的方法第八章的学习
最后一章讲网安了。
梗概介绍了网络安全中常见的两个通信主体:Alice 和 Bob,他们在一条随时会被窃听的信道上通信,如何保证数据不被第三人获取。
什么是网络安全显然,Alice希望即使他们在一个不安全的媒体上进行通信,也只有 Bob 能够理解她所发送的报文,其中入侵者(入侵者名叫Trudy)能够在该媒体上截获从Alice向Bob传输的报文。
安全的通信应该具有以下特性:
机密性:仅有双方能知道他们发送的内容,即使中间通信信道能够随时被窃听。
完整性:Alice和Bob希望确保其通信的内容在传输过程中未被改变。
端点鉴别:即能确定对方确实是他所称的那个人。
运行安全性:确保服务器不会被入侵。
入侵者能够执行以下可能的行为:
窃听:随意读取信道上的内容。
篡改:截获一个包,并修改或删除报文的内容。
如我们将看到的那样,除非采取适当的措施,否则上述能力使入侵者可以用多种方式发动各种各样的安全攻击:窃听通信内容(可能窃取口令和数据),假冒另一个实体,“劫持” 一个正在进行的会话,通过使系统资源过载拒绝合法网络用户的服务请求等等。
应用密码学来提供机密性是不言而喻的,同时我们 ...