WDK设备驱动开发

安装

https://msdn.itellyou.cn/
安装完成后,开始菜单中找到Windows Device Kits目录,查看帮助文档和编译demo

编译

在这里插入图片描述
打开环境后,启动OACR(静态检测)程序,执行build -ceZ编译(其中c时清除之前的结果)

vscode配置编译任务

"tasks": [
        {
            "label": "build device",
            "type": "shell",
            "command": "c:\\windows\\system32\\cmd.exe /k D:\\WinDDK\\7600.16385.1\\bin\\setenv.bat D:\\WinDDK\\7600.16385.1\\ chk x64 WIN7",      //使用wdm的绝对路径
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]

"D:\WinDDK\7600.16385.1\"是wdk的安装路径

check相当于debug、free相当于release

inf配置

inf文件中,[string]设置前面%var%变量的取值
在wdm的src目录中找inx文件修改(wdm的inx只需去掉kmdf的配置项即可),添加makefile.inc文件,修改source文件,build自动生成inf文件

  • source中添加inf编译配置
INF_NAME=echo
NTTARGETFILE0=$(OBJ_PATH)\$(O)\$(INF_NAME).inf
PASS0_BINPLACE=$(NTTARGETFILE0)

makefile.inc文件

_LNG=$(LANGUAGE)
_INX=.
STAMP=stampinf -f $@ -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR)



$(OBJ_PATH)\$(O)\$(INF_NAME).inf: $(_INX)\$(INF_NAME).inx 
    copy $(_INX)\$(@B).inx $@
    $(STAMP)

安装

  • CreateService函数参数SERVICE_KERNEL_DRIVER,启动服务打开驱动
  • startService,启动getlasterror返回577(缺少数字签名)
  • createfile,根据设备名称,打开设备驱动
  • DeviceIoControl,发送设备控制命令
makecert -sv lim.pvk -r -n CN=lim lim.cer    //创建证书,CA发布的身份认证
cert2spc lim.cer lim.spc                 //创建发行者证书
pvk2pfx -pvk lim.pvk -pi [yourpassword] -spc lim.spc -pfx lim.pfx -f     //导出pfx证书
signtool sign /f lim.pfx /p yourpassword  driver.sys  driver.cat    //文件签名,相当于加密的密码
certmgr.exe /add lim.cer /s /r localMachine root     //证书注册

安装devcon install *.inf * 或者右键inf安装(有证书签名后才行,否则提示很多错误基本都和权限相关),查询节点devcon hwids * 或者devcon drivernodes *
devcon安装失败可以在%windir%/inf/setupapi.dev.log中查看错误原因,devcon执行权限不够不产生日志
**以上操作解决安装问题,启动服务失败可能还是报577错误,代码签名是需要申请收费的,自己创建的windows不一定认可(伪造证书https://www.cnblogs.com/LyShark/p/11347609.html

正常启动的方法,

  • 开机F8禁用数字签名认证
  • windbg连接虚拟机可以启动调试**
  • 进入测试模式,Bcdedit /set testsigning true
  • 禁用签名,bcdedit /set nointegritychecks on
  • bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS

命令行的方式安装(setupapi.dll中有函数封装),可在代码中实现

@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

设备树

  • 设备节点,设备节点对应文件(linux的/dev目录下)
  • 驱动对象,DRIVER_OBJECT数据对象,包含设备对象结构
  • 设备对象,DEVICE_OBJECT数据对象
  • 设备栈,一个物理设备对应多个设备对象,一个物理设备对应的所有设备对象构成设备栈。

项目配置

  • dirs文件

示例如下

DIRS= \
     exe \
     startio \
     sys
  • makefile文件,所有驱动makefile文件相同
!INCLUDE $(NTMAKEENV)\makefile.def
  • source文件
TARGETNAME=cancel
TARGETTYPE=DRIVER

TARGETLIBS= \
 $(DDK_LIB_PATH)\wdmsec.lib\
 $(DDK_LIB_PATH)\csq.lib
	
   
SOURCES=cancel.c cancel.rc

MSC_WARNING_LEVEL=/W4 /WX

windbg连接虚拟机调试

  • 修改boot.ini,添加如下配置,或者msconfig中修改引导勾选调试

bcdedit /copy {current} /d “Win7 Debug” //添加配置项
bcdedit /enum
bcdedit /set {current} bootdebug on
bcdedit /set {current} debugtype serial
bcdedit /set {current} debugport 1
bcdedit /set {current} baudrate 115200
在这里插入图片描述

  • powershell查看当前端口号

[System.IO.Ports.SerialPort]::getportnames() //查询本机端口号
打开串口确保powershell无异常

$port= new-Object System.IO.Ports.SerialPort COM1,19200,None,8,one 
$port.open() 

[System.IO.Directory]::GetFiles(“\\.\pipe\”) //查询打开的管道

  • windbg使用管理员权限
  • vmware添加串口使用命名管道\\.\pipe\com3
    在这里插入图片描述
    可以设置reconnect,确定,虚拟机开机前连接即可调试

如果还有问题,建议删除虚拟机配置中的打印机设备

或者使用virtualkd调试内核,比串口调试更快

  • 拷贝target到虚拟机中安装
  • 启动vmmon连接指示灯绿色代表连接成功

Module load completed but symbols could not be loaded

切换com1或com2调试,可能是端口问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪力左手

囧rz

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值