WDK设备驱动开发

    技术2022-07-11  108

    安装

    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/12851139cat文件(数字签名),inf2cat命令行生成 inf2cat /drv:path /os:7_X64 参考:https://blog.csdn.net/augusdi/article/details/4192588cer驱动数字签名,makecert创建cer,signtool绑定证书到cat,certmgr注册证书 https://blog.csdn.net/ty13438189519/article/details/78470034 makecert -sv lim.pvk -r -n CN=lim lim.cer //创建证书 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

    项目配置

    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调试,可能是端口问题

    Processed: 0.012, SQL: 9