安装
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,发送设备控制命令
- inf配置文件,使用模板修改即可,https://blog.csdn.net/hyczwl/article/details/12851139
- cat文件(数字签名),inf2cat命令行生成
inf2cat /drv:path /os:7_X64
参考:https://blog.csdn.net/augusdi/article/details/4192588- cer驱动数字签名,makecert创建cer,signtool绑定证书到cat,certmgr注册证书
https://blog.csdn.net/ty13438189519/article/details/78470034makecert -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调试,可能是端口问题