vscode开发wdk

findwdk

https://github.com/SergiusTheBest/FindWDK.git

拷贝FindWdk.cmake模块到下面路径中

CMake\share\cmake-3.22\Modules

注意定义系统变量或者修改下面路径,确保能找到wdk工具路径
在这里插入图片描述

构建项目

cmake中构建项目通过wdk_add_driver实现

wdk_add_driver(simple simple.c)

配置vmware环境

  • msconfig,修改虚拟机为调试模式运行
    在这里插入图片描述
  • 虚拟机添加串口,使用\.\pipe\com_1命令通道连接com1

vs plugin

安装vs windows driver kit插件
在这里插入图片描述
插件中添加vmare虚拟机配置如下
在这里插入图片描述
通过附加远程目标,启动设备调试(在插件中添加了设备,才能通过名称直接查找)
在这里插入图片描述

安装

开启调试模式,关闭数字签名后重启
bcdedit /debug on
bcdedit /dbgsettings serial debugport:n baudrate:115200
bcdedit /set testsigning on
bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit /set nointegritychecks on

cmd 执行安装,输入sys文件即可

@echo off
sc create %~n1 binpath= "%~f1" type= kernel start= demand type= kernel start=demand
sc start %~n1
pause
sc stop %~n1
sc delete %~n1

使用windbg调试sys文件,pdb路径设置虚拟机中的符号路径,调试断点才能断住。

irp

应用程序和内核通过IRP包通信,irp5种常用的包类型

扫描二维码关注公众号,回复: 16877623 查看本文章

#define IRP_MJ_CREATE 0X00 //对应用户层函数CreateFile()
#define IRP_MJ_CLOSE 0X02 //对应用户层函数CloseHandle()
#define IRP_MJ_READ 0X03 //对应用户层函数ReadFile()
#define IRP_MJ_WRITE 0X04 //对应用户层函数WirteFile()
#define IRP_MJ_DEVICE_CONTROL 0X0e //DeviceIoControl(),可写可读操作

irp分为线性irp(同步irp,线程退出irp自动取消)和非线性irp(异步irp,不和任何线程关联,驱动和驱动间传递数据,需要完成函数里面手动释放)

IoBuildSynchronousFsdRequest、IoBuildDeviceIoControlRequest,同步
IoBuildAsynchronousFsdRequest 、IoAllocateIrp,异步

  • 自旋锁,死循环等待,占用cpu资源多
  • page_code,驱动层在物理内存中,访问了应用层内存使用page_code分页内存

IRQL >= DISPATCH_LEVEL触发page_code断言,检测内核内存
DriverEntry、IRP派遣函数一般都运行在PASSIVE_LEVEL

猜你喜欢

转载自blog.csdn.net/daoer_sofu/article/details/130427105