Windows驱动程序入门: Windows 驱动程序入门 – Windows drivers | Microsoft Docs Github: https://github.com/Microsoft...开发环境 Visual Studio + WDK(Windows Driver Kit) 其中WDK需要自己手动下载安装 笔者是在Windows平台上开发,使用的开发环境为 Visual Studio...实现方式 WDM vs WDF 对于刚接触驱动开发的新手来说,笔者不建议采用WDM(Windows 驱动程序模型)进行开发。...目前在网上能找到的关于驱动开发的中文书籍基本上都是围绕WDM模式进行讲述的,而关于WDF(Windows 驱动框架)开发的书籍寥寥无几,《竹林溪径——深入浅出Window驱动开发》和《Developing...Drivers with the Windows Driver Foundation》算是两本讲述基于WDF开发驱动的书籍,两者都能在网上找到电子书资源。
在进行驱动开发之前,您需要先安装适当的开发环境和工具。首先,您需要安装Windows驱动开发工具包(WDK),这是一组驱动开发所需的工具、库、示例和文档。...然后,您需要安装Visual Studio开发环境,以便编写和调试驱动程序。在安装WDK和Visual Studio之后,您还需要配置适当的项目设置,以便能够正确编译和构建驱动程序。...,根据机器配置不同可能需要等待一段时间;图片接着读者还需要继续安装Windows Driver Kit 8.1工具包,请将该工具包解压缩到桌面,并双击wdksetup.exe进行安装,过程中只需要一直下一步...图片虚拟机模板创建完成后,读者可根据如下配置选择编辑虚拟机设置,并在磁盘位置处将课件中的cn_windows_10_consumer_editions_version_1903_x64_dvd_8f05241d.iso...挂载到虚拟机上;图片点击开启虚拟机,并按照提示将Windows系统正确的安装,需要注意的是在选择版本时,读者最好使用教育版与笔者开发环境保持一致,至此只需等待系统安装完毕,根据系统差异安装时间可能有所差别
Visual Studio: Community 2019 Test Machine: Windows 7 SP1 + KMD Manager + DbgView 开发环境搭建 参照:https://...docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk 除了在安装VS2019的时候,选择C++桌面开发环境,里面自带一个和当前系统版本一致的...然后下载适用2004的WDK安装文件,双击之后,需要联网下载安装WDK相关文件和VS2019驱动开发插件,根据提示点过去就可以。...测试环境 启动的时候,需要按f8关闭驱动签名验证,也可以参考这篇文章添加一个关闭驱动签名检查的启动项。...This value is ignored by Windows 7 and Windows 8. 只能每次开机手动f8或者使用测试签名,这样就正常了: ?
作者:0x7F@知道创宇404实验室 日期:2023年4月18日 0x00 前言 参考资料 随着 windows 系统的更新迭代,windows 驱动开发技术也是不断的升级:从最早期的 VXD(Virtual...本文实验环境 windows 10 专业版 x64 1909 Visual Studio 2019 SDK 10.0.19041.685 WDK 10.0.19041.685 0x01 搭建驱动开发环境...「使用C的桌面开发」,其中 SDK 默认为 10.0.19041.0: 开发软件需要 SDK(Software Development Kit),而开发 windows 驱动则需要 WDK(Windows...)下载 WDK 在线安装包(版本必须和 SDK 一致),按如下进行安装: 对于 WDF 驱动模型其开发环境叫 WDK(Windows Driver Kit) 对于 WDM 驱动模型其开发环境叫 DDK(...驱动开发环境配置成功。
MiniFilter 微过滤驱动是相对于SFilter传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在编写时更简单...,多数IRP操作都由过滤管理器(FilterManager或Fltmgr)所接管,因为有了兼容层,所以在开发中不需要考虑底层IRP如何派发,更无需要考虑兼容性问题,用户只需要编写对应的回调函数处理请求即可...,这极大的提高了文件过滤驱动的开发效率。...[Version] Signature = "$Windows NT$" Class = "ActivityMonitor" ;指明了驱动的分组,必须指定....,本人更推荐使用此方式安装,此种方式的原理同样是向注册表中写出子健,但同时具备有启动与关闭驱动的功能,比INF安装更灵活易于使用,完整代码如下所示; #include #include
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书——《独钓寒江 windows安全编程》 和 《windows驱动开发技术详解》。...驱动开发过程中,主要使用的C语言,虽说C中定义了许多数据类型,但是一般来说在编码上还是习惯与使用WDK的规范,虽说这个不是必须的,比如有这样一句 unsigned long ul = 0; 这个数据的大小根据不同的机器不同的编译器环境略有不同...,每个驱动都有一个唯一的驱动对象,就好像每个Win32应用程序有一个唯一的实例句柄。...设备对象 在windows平台将每个设备抽象为一个设备对象,驱动层一般通过设备对象来操作具体的设备,每个驱动可以有多个设备对象。...DriverObject: 指向所属驱动的驱动对象的指针 2. NextDevice:指向下一个设备驱动的指针 3.
开发驱动程序必以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。...为改善这种局面,微软推出了新的驱动程序开发环境。要预先指出的是,这不是另起炉灶改弦更张,而是以WDM为基础进行了建模和封装,显著特点是降低了开发难度。...现在WDF则将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法(函数)完成,这样驱动开发者只需专注处理硬件的行为即可。...Windows Device Kit (WDK): 把测试套件(test suites)集成进来,DDK 就成了WDK。WDK是针对微软操作系统系列的驱动器集成开发系统。...6、 虽然经过封装并引入基于对象的技术,所开发的驱动程序在执行效率上并不比原来逊色。 WDF和WDM的关系有点类似于MFC和Windows SDK的关系。
看下结构 在我调试的Windows10 1909上面结构体成员偏移已经突破了 0x800了 所以暂时没在我认知能力中的成员以及不重要的成员都会删除 nt!
原理很简单,基本上InlineHook类的代码都是一个样子,如下是一段完整的挂钩PsLookupProcessByProcessId的驱动程序,当程序被加载时则默认会保护lyshark.exe进程,使其无法被用户使用任务管理器结束掉...-------------------------------------------------------- // 计算地址处指令有多少字节 // address = 地址 // bits 32位驱动传入...STATUS_ACCESS_DENIED; } } return st; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint("驱动已卸载...%x", head_n_byte[i]); } Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; } 运行这段驱动程序
目录 Windows 驱动开发2 链表的数据结构 一丶链表 1.1 简介 1.2 WDK中的链表结构 1.2.1 链表的使用 1.3 链表API 之初始化节点 1.4 链表操作API 节点的插入 1.5...链表操作API 节点的遍历 1.6 链表操作API 节点的删除 Windows 驱动开发2 链表的数据结构 一丶链表 1.1 简介 链表在windows内核开发中是最最最常见的数据结构了。
适用于需要快速访问的内存,例如驱动程序的代码、中断处理程序、系统调用等。PagedPool: 用于分配分页内存,该内存可能会被交换到磁盘上,需要通过分页机制进行访问。...NonPagedPoolExecute: 是带有执行权限的非分页内存,适用于需要执行代码的情况,例如一些特殊的驱动程序。...MyStruct{ ULONG x; ULONG y;}MyStruct, *pMyStruct;VOID UnDriver(PDRIVER_OBJECT driver){ DbgPrint("驱动已卸载...pListEntry->Flink; } Driver->DriverUnload = UnDriver; return STATUS_SUCCESS;}链表输出效果如下图所示;如上所述,在内核开发中...Windows内核提供了多种类型的自旋锁,例如KSPIN_LOCK、KIRQL等。
适用于需要快速访问的内存,例如驱动程序的代码、中断处理程序、系统调用等。 PagedPool: 用于分配分页内存,该内存可能会被交换到磁盘上,需要通过分页机制进行访问。...NonPagedPoolExecute: 是带有执行权限的非分页内存,适用于需要执行代码的情况,例如一些特殊的驱动程序。...ULONG x; ULONG y; }MyStruct, *pMyStruct; VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint("驱动已卸载...pListEntry->Flink; } Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; } 链表输出效果如下图所示; 如上所述,在内核开发中...Windows内核提供了多种类型的自旋锁,例如KSPIN_LOCK、KIRQL等。
下面介绍一下V4L2整体情况: V4L2提供一套数据结构和底层V4L2驱动接口规范供Linux下的视频设备程序使用,主要是一系列回调函数,如设置摄像头频率,帧率,视频压缩格式和图像参数等,还可用于其他多媒体开发...videodev2.h文件中,在采集图像过程中,就是通过操作这些数据结构来获得最终图像数据,Linux系统对V4L2的支持是从Linux 2.5.x版本开始的,它可在内核编译阶段配置,或后期安装,默认情况下都有此开发接口...,上例中用到 VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 VIDIOC_S_FMT:设置当前驱动的视频捕获格式 VIDIOC_G_FMT:读取当前驱动的视频捕获格式 VIDIOC_TRY_FMT...,多个缓存可用于建立FIFO,来提高视频采集的效率,控制命令为VIDIOC_REQBUFS 主要功能:请求V4L2驱动分配视频缓冲区,也就是申请V4L2视频驱动分配内存,V4L2是视频设备的驱动层,它位于内核空间...若成功,则会在V4L2驱动层分配好视频缓冲区。
在Windows内核中,为了实现高效的数据结构操作,通常会使用链表和结构体相结合的方式进行数据存储和操作。
在概述中提到过,目录遍历的核心是ZwQueryDirectoryFile()系列函数,该函数可返回给定文件句柄指定的目录中文件的各种信息,其微软官方定义如下; ZwQueryDirectoryFile是Windows...pBeginAddr); ZwClose(hFile); return TRUE; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint("驱动卸载成功...\\C:\\Windows"); MyQueryFileAndFileFolder(ustrQueryFile); DbgPrint("驱动加载成功 \n"); Driver-...>DriverUnload = UnDriver; return STATUS_SUCCESS; } 编译如上驱动程序并运行,则会输出C:\\Windows目录下的所有文件和目录,以及创建时间和修改时间...你是否会觉得很失望,为什么不是递归枚举,这里为大家解释一下,通常情况下ARK工具并不会在内核层实现目录与文件的递归操作,而是将递归过程搬到了应用层,当用户点击一个新目录时,在应用层只需要拼接新的路径再次发送给驱动程序让其重新遍历一份即可
在Windows内核中,每个设备驱动程序都需要一个DRIVER_OBJECT对象,该对象由系统创建并传递给驱动程序的DriverEntry函数。...驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。...本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些详细参数...,例如驱动大小,驱动标志,驱动名,驱动节等等,每一个驱动程序都会存在这样的一个结构,首先来看一下微软对其的定义; typedef struct _DRIVER_OBJECT { CSHORT Type...pListEntry->Flink都将会指向下一个驱动对象,通过不断地循环CONTAINING_RECORD解析,即可输出当前系统内所有驱动的详细信息。
在Windows内核中,SSSDT(System Service Shadow Descriptor Table)是SSDT(System Service Descriptor Table)的一种变种,...其主要用途是提供Windows系统对系统服务调用的阴影拷贝。...SSSDT表存储了系统调用的函数地址,类似于SSDT表,但在某些情况下,Windows系统会使用SSSDT表来对系统服务进行引导和调用。 SSSDT表的存在是为了加强系统的安全性和稳定性。...SSDT表的枚举功能,本章继续实现对SSSDT表的枚举,ShadowSSDT中文名影子系统服务描述表,SSSDT其主要的作用是管理系统中的图形化界面,其Win32子系统的内核实现是Win32k.sys驱动...NumberOfServices); return pWin32k->NumberOfServices; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功
在Windows内核中,每个设备驱动程序都需要一个DRIVER_OBJECT对象,该对象由系统创建并传递给驱动程序的DriverEntry函数。...驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。...本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些详细参数...,例如驱动大小,驱动标志,驱动名,驱动节等等,每一个驱动程序都会存在这样的一个结构,首先来看一下微软对其的定义;typedef struct _DRIVER_OBJECT { CSHORT Type...pListEntry->Flink都将会指向下一个驱动对象,通过不断地循环CONTAINING_RECORD解析,即可输出当前系统内所有驱动的详细信息。
SSDT表(System Service Descriptor Table)是Windows操作系统内核中的关键组成部分,负责存储系统服务调用的相关信息。...} } } return 0; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功...NtApiIndex, ssdt_base_aadress); return ret; } VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint(("驱动程序卸载成功
领取专属 10元无门槛券
手把手带您无忧上云