windows设备驱动程序WDF开发

Posted 波罗蜜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows设备驱动程序WDF开发相关的知识,希望对你有一定的参考价值。

第8章 KMDF过滤器驱动程序

1. 管理设备的主功能为功能驱动FDO, 过滤器驱动位于FDO的上层或下层

    WdfFdoInitSetFilter // 声明这个一个过滤驱动

2. 安装要修改FDO的inf文件

FilterSample实例

 

第9章 USB设备开发

1. USB2.0 最快480Mb/s, UBS3.0速度 5.0Gbps (500MB/s)

2. USB设备有一到多个配置

    每个配置有一到多个接口

    每个接口有一到多个端点,端点是通信管道的终点, 有四种:批量(bulk), 控制,中断(interrupt),同步(Isochronous)

    1)端点0默认是可以访问的,输入和输出

    2)FDO的作用是把IRP引导到正确端点的管道上,把需求提给总线驱动,总线驱动分解成事务(transaction),送往总线

        事务有一到多个阶段(phase),phase分令牌(token),数据和握手(ack)

 

3. USB数据传输方式

    1)控制传输:最高优先级,最大数据64B,每个控制事务包括一个SETUP令牌,带可选的数据阶段和握手阶段,设备必须响应控制传输

    2)

 (usb驱动部分待续)

 

第10章 PCI设备驱动程序开发

1. 微机扩展插槽有:ISA(已淘汰), PCI(即插即用,不是热插拔)

   PCI: 32位数据总线,速率132~264MB/s, 

   通用PCI总线接口:AMCC的S5933,PLX的9054。也可以用FPGA实现PCI接口

2. 开发驱动主要有3方面问题:硬件访问,中断处理,DMA传输

    X86有两种地址空间:I/O地址(只有64KB),内存地址(4GB以上)

    I/O映射:一个芯片的地址在I/O地址空间的范围,只能通过I/O指令来访问。

    内存映射:内存指令访问

3. I/O访问

    WRITE_PORT_UCHAR ,   WRITE_PORT_USHORT, WRITE_PORT_ULONG

    WRITE_PORT_BUFFER_UCHAR ...

4. 存储器访问

    WRITE_REGISTER_UCHAR ...

    WRITE_REGISTER_BUFFER_UCHAR

5. 硬件访问编程

   1) 根据配置定义地址指针,用于修改PCI9054的寄存器, MemBaseAddress0 和 IoBaseAddress0

   2)EvtDevicePrepareHardware 中初始化 MemBaseAddress0

6. 中断处理

   WDFINTERRUPT, 运行在DIRQL级别,处理时间尽可能短

   中断服务例程是异步调用的,必须考虑其他例程和中断服务例程的共享数据的保护性访问(硬件中断自旋锁,运行在DIRQL)

   WDF_INTERRUPT_CONFIG_INIT, WdfInterruptCreate

7. DMA编程对象

   1) WDFDMAENABLER,用于建立一个DMA适配器,说明DMA通道的特性,  WdfDmaEnablerCreate

   2) WDFDMATRANSACTION, 用于传输控制, WdfDmaTransactionCreate

       启动一个DMA传输,获取传输缓冲区的物理地址和字节数,DMA传输结束后的数据处理

       函数:

       WdfDmaTransactionInitialize(EvtProgramDmaFunction): WdfDmaTransactionExecute后会调用EvtProgramDmaFunction

       WdfDmaTransactionExecute 执行DMA传输

       WdfDmaTransactionRelease 终止传输

     WdfDmaTransactionDmaCompleted 测试传输是否完成

       WdfDmaTransactionDmaCompletedFinal 强行完成DMA传输

       WdfDmaTransactionGetBytesTransferred 传输的总字节数

       WdfDmaTransactionSetMaximumLength 设置传输的最大字节数,应小于65536

   3) WDFCOMMONBUFFER,申请系统的公用缓冲区, WdfCommonBufferCreate

 

       对于DMA操作,系统提供一个特殊的内存,物理上连续的内存,称为公用缓冲区(比较稀有,避免浪费)。

       对于支持分散/聚集DMA的设备,可以不用公用缓冲区

  

8. DMA传输编程

    DPC中,测试DMA传输完成没有,若没有,则WdfDmaTransactionExecute 继续传输

PCI9056:

#define INTCSR 0x68
#define CNTRL 0x6C
#define DMAMODE0 0x80
#define DMAPADR0 0x84
#define DMALADR0 0x88
#define DMASIZ0 0x8C
#define DMADPR0 0x90//descriptor
#define DMACSR0 0xA8//DMA通道0 命令状态寄存器
#define HPIC 0x00
#define HPIA 0x04
#define HPID 0x08

 

第11章 UMDF驱动程序编程入门

UMDFSample实例

是dll程序

 

第12章 WinDbg使用介绍

1. windbg调试:双机调试,也可以用虚拟机代替

    目标机:启动时选择“启用调试程序”

    主控机:winDbg中kernel debugging

    windbg:debug-》break, 使主控机和目标机连接

    .reload 加载符号文件

    ld projectName  加载PDB文件

    lm l 显示已经加载符号文件列表

 

2. 调试

    F9 在源文件中设置断点

    G  使目标机运行

    F10 执行

 

以上是关于windows设备驱动程序WDF开发的主要内容,如果未能解决你的问题,请参考以下文章

基于WDF的PCI/PCIe接口卡Windows驱动程序-如何为硬件移植驱动程序

WDF驱动开发- 一个简单的WDF驱动(non-pnp)

VS2012+WDK8.0搭建WDF驱动开发环境

WDF 内部 IOCTL 不返回输出

win10 64位安装wdm wdf

IDA 逆 WDF 驱动时的函数识别插件